From 40265144af880893398f4befa3f5796b76609aba Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 25 Jun 2021 14:11:53 +0300 Subject: [PATCH 001/246] Upgrade to Meteor 2.3.4 Thanks to xet7 ! --- .meteor/packages | 45 +- .meteor/release | 2 +- .meteor/versions | 120 +- client/components/cards/cardDetails.js | 3 +- client/components/users/userAvatar.js | 3 + client/config/presence.js | 7 - config/accounts.js | 3 + config/router.js | 20 +- models/attachments.js | 7 +- models/avatars.js | 3 + models/presences.js | 12 - package-lock.json | 66 +- package.json | 3 + packages/markdown/package.js | 6 +- packages/meteor-accounts-cas/.gitignore | 2 - packages/meteor-accounts-cas/LICENSE | 21 - packages/meteor-accounts-cas/README.md | 88 - packages/meteor-accounts-cas/cas_client.js | 117 - .../meteor-accounts-cas/cas_client_cordova.js | 71 - packages/meteor-accounts-cas/cas_server.js | 304 -- packages/meteor-accounts-cas/package.js | 29 - .../meteor-useraccounts-core/.editorconfig | 18 - packages/meteor-useraccounts-core/.gitignore | 2 - .../meteor-useraccounts-core/.jshintignore | 2 - packages/meteor-useraccounts-core/.jshintrc | 132 - packages/meteor-useraccounts-core/.travis.yml | 8 - packages/meteor-useraccounts-core/Guide.md | 1433 --------- packages/meteor-useraccounts-core/History.md | 353 --- packages/meteor-useraccounts-core/LICENSE.md | 20 - packages/meteor-useraccounts-core/README.md | 104 - .../meteor-useraccounts-core/lib/client.js | 464 --- packages/meteor-useraccounts-core/lib/core.js | 593 ---- .../meteor-useraccounts-core/lib/field.js | 292 -- .../meteor-useraccounts-core/lib/methods.js | 25 - .../meteor-useraccounts-core/lib/server.js | 184 -- .../lib/server_methods.js | 142 - .../lib/templates_helpers/at_error.js | 26 - .../lib/templates_helpers/at_form.js | 83 - .../lib/templates_helpers/at_input.js | 124 - .../lib/templates_helpers/at_message.js | 7 - .../lib/templates_helpers/at_nav_button.js | 16 - .../lib/templates_helpers/at_oauth.js | 5 - .../lib/templates_helpers/at_pwd_form.js | 331 -- .../lib/templates_helpers/at_pwd_form_btn.js | 18 - .../lib/templates_helpers/at_pwd_link.js | 24 - .../lib/templates_helpers/at_reCaptcha.js | 19 - .../at_resend_verification_email_link.js | 24 - .../lib/templates_helpers/at_result.js | 7 - .../lib/templates_helpers/at_sep.js | 5 - .../lib/templates_helpers/at_signin_link.js | 24 - .../lib/templates_helpers/at_signup_link.js | 24 - .../lib/templates_helpers/at_social.js | 105 - .../lib/templates_helpers/at_terms_link.js | 33 - .../lib/templates_helpers/at_title.js | 7 - .../templates_helpers/ensure_signed_in.html | 12 - .../lib/templates_helpers/ensure_signed_in.js | 15 - .../meteor-useraccounts-core/lib/utils.js | 19 - packages/meteor-useraccounts-core/package.js | 94 - .../meteor-useraccounts-core/tests/tests.js | 215 -- packages/meteorx/package.js | 13 - packages/wekan-accounts-cas/README.md | 88 - packages/wekan-accounts-cas/cas_client.js | 112 - .../wekan-accounts-cas/cas_client_cordova.js | 71 - packages/wekan-accounts-cas/cas_server.js | 281 -- packages/wekan-accounts-cas/package.js | 29 - packages/wekan-accounts-oidc/.gitignore | 1 - packages/wekan-accounts-oidc/LICENSE.txt | 14 - packages/wekan-accounts-oidc/README.md | 75 - packages/wekan-accounts-oidc/oidc.js | 22 - .../wekan-accounts-oidc/oidc_login_button.css | 3 - packages/wekan-accounts-oidc/package.js | 19 - packages/wekan-cfs-access-point/.travis.yml | 5 - packages/wekan-cfs-access-point/CHANGELOG.md | 288 -- packages/wekan-cfs-access-point/LICENSE.md | 20 - packages/wekan-cfs-access-point/README.md | 32 - .../access-point-client.js | 58 - .../access-point-common.js | 199 -- .../access-point-handlers.js | 307 -- .../access-point-server.js | 362 --- packages/wekan-cfs-access-point/api.md | 271 -- .../wekan-cfs-access-point/internal.api.md | 332 -- packages/wekan-cfs-access-point/package.js | 65 - .../tests/client-tests.js | 125 - .../tests/server-tests.js | 68 - packages/wekan-cfs-base-package/.travis.yml | 5 - packages/wekan-cfs-base-package/LICENSE.md | 20 - packages/wekan-cfs-base-package/README.md | 11 - packages/wekan-cfs-base-package/api.md | 213 -- .../wekan-cfs-base-package/base-client.js | 51 - .../wekan-cfs-base-package/base-common.js | 317 -- .../wekan-cfs-base-package/base-server.js | 95 - .../wekan-cfs-base-package/internal.api.md | 293 -- packages/wekan-cfs-base-package/package.js | 37 - .../wekan-cfs-base-package/polyfill.base64.js | 179 -- .../tests/common-tests.js | 161 - .../wekan-cfs-collection-filters/.travis.yml | 5 - .../wekan-cfs-collection-filters/LICENSE.md | 20 - .../wekan-cfs-collection-filters/README.md | 8 - packages/wekan-cfs-collection-filters/api.md | 44 - .../wekan-cfs-collection-filters/filters.js | 191 -- .../internal.api.md | 72 - .../wekan-cfs-collection-filters/package.js | 29 - .../tests/client-tests.js | 27 - .../tests/server-tests.js | 27 - packages/wekan-cfs-collection/.travis.yml | 5 - packages/wekan-cfs-collection/CHANGELOG.md | 727 ----- packages/wekan-cfs-collection/LICENSE.md | 20 - packages/wekan-cfs-collection/README.md | 8 - packages/wekan-cfs-collection/api.common.js | 260 -- packages/wekan-cfs-collection/api.md | 180 -- packages/wekan-cfs-collection/common.js | 171 - packages/wekan-cfs-collection/internal.api.md | 390 --- packages/wekan-cfs-collection/package.js | 43 - .../tests/client-tests.js | 33 - .../tests/server-tests.js | 96 - packages/wekan-cfs-data-man/.travis.yml | 5 - packages/wekan-cfs-data-man/LICENSE.md | 20 - packages/wekan-cfs-data-man/README.md | 8 - packages/wekan-cfs-data-man/api.md | 309 -- packages/wekan-cfs-data-man/client/Blob.js | 166 - .../wekan-cfs-data-man/client/data-man-api.js | 302 -- packages/wekan-cfs-data-man/internal.api.md | 674 ---- packages/wekan-cfs-data-man/package.js | 48 - .../wekan-cfs-data-man/server/data-man-api.js | 176 -- .../server/data-man-buffer.js | 82 - .../server/data-man-datauri.js | 14 - .../server/data-man-filepath.js | 108 - .../server/data-man-readstream.js | 80 - .../wekan-cfs-data-man/server/data-man-url.js | 133 - .../wekan-cfs-data-man/tests/client-tests.js | 296 -- packages/wekan-cfs-data-man/tests/common.js | 38 - .../wekan-cfs-data-man/tests/server-tests.js | 366 --- packages/wekan-cfs-file/.travis.yml | 5 - packages/wekan-cfs-file/CHANGELOG.md | 283 -- packages/wekan-cfs-file/LICENSE.md | 20 - packages/wekan-cfs-file/README.md | 8 - packages/wekan-cfs-file/api.md | 588 ---- packages/wekan-cfs-file/fsFile-common.js | 765 ----- packages/wekan-cfs-file/fsFile-server.js | 361 --- packages/wekan-cfs-file/internal.api.md | 749 ----- packages/wekan-cfs-file/package.js | 55 - packages/wekan-cfs-file/tests/file-tests.js | 436 --- packages/wekan-cfs-filesystem/.travis.yml | 5 - packages/wekan-cfs-filesystem/LICENSE.md | 20 - packages/wekan-cfs-filesystem/README.md | 41 - .../wekan-cfs-filesystem/filesystem.client.js | 10 - .../wekan-cfs-filesystem/filesystem.server.js | 157 - packages/wekan-cfs-filesystem/package.js | 24 - packages/wekan-cfs-filesystem/tests.js | 9 - .../tests/client-tests.js | 44 - .../tests/server-tests.js | 49 - packages/wekan-cfs-gridfs/.travis.yml | 5 - packages/wekan-cfs-gridfs/LICENSE.md | 20 - packages/wekan-cfs-gridfs/README.md | 48 - packages/wekan-cfs-gridfs/api.md | 69 - packages/wekan-cfs-gridfs/gridfs.client.js | 21 - packages/wekan-cfs-gridfs/gridfs.server.js | 176 -- packages/wekan-cfs-gridfs/internal.api.md | 75 - packages/wekan-cfs-gridfs/package.js | 24 - .../wekan-cfs-gridfs/tests/client-tests.js | 44 - .../wekan-cfs-gridfs/tests/server-tests.js | 49 - packages/wekan-cfs-http-methods/.editorconfig | 18 - packages/wekan-cfs-http-methods/.gitignore | 2 - packages/wekan-cfs-http-methods/.jshintrc | 140 - packages/wekan-cfs-http-methods/.travis.yml | 5 - packages/wekan-cfs-http-methods/CHANGELOG.md | 152 - packages/wekan-cfs-http-methods/LICENSE.md | 20 - packages/wekan-cfs-http-methods/README.md | 215 -- .../http.methods.client.api.js | 6 - .../http.methods.server.api.js | 644 ---- .../http.methods.tests.js | 117 - packages/wekan-cfs-http-methods/package.js | 31 - packages/wekan-cfs-http-publish/.editorconfig | 18 - packages/wekan-cfs-http-publish/.gitignore | 4 - packages/wekan-cfs-http-publish/.jshintrc | 97 - packages/wekan-cfs-http-publish/.travis.yml | 5 - packages/wekan-cfs-http-publish/LICENSE.md | 20 - packages/wekan-cfs-http-publish/README.md | 129 - packages/wekan-cfs-http-publish/api.md | 153 - .../http.publish.client.api.js | 12 - .../http.publish.server.api.js | 466 --- .../http.publish.tests.client.js | 175 -- .../http.publish.tests.server.js | 149 - .../wekan-cfs-http-publish/internal.api.md | 330 -- packages/wekan-cfs-http-publish/package.js | 34 - .../packages/.gitignore | 2 - packages/wekan-cfs-power-queue/.editorconfig | 18 - packages/wekan-cfs-power-queue/.gitignore | 3 - packages/wekan-cfs-power-queue/.jshintrc | 114 - packages/wekan-cfs-power-queue/.travis.yml | 5 - packages/wekan-cfs-power-queue/LICENSE.md | 20 - packages/wekan-cfs-power-queue/README.md | 136 - packages/wekan-cfs-power-queue/api.md | 420 --- .../wekan-cfs-power-queue/internal.api.md | 535 ---- packages/wekan-cfs-power-queue/package.js | 27 - packages/wekan-cfs-power-queue/power-queue.js | 727 ----- .../spinal-queue.spec.md | 151 - packages/wekan-cfs-power-queue/tests.js | 198 -- .../wekan-cfs-reactive-list/.editorconfig | 18 - packages/wekan-cfs-reactive-list/.gitignore | 2 - packages/wekan-cfs-reactive-list/.jshintrc | 115 - packages/wekan-cfs-reactive-list/.travis.yml | 5 - packages/wekan-cfs-reactive-list/LICENSE.md | 20 - packages/wekan-cfs-reactive-list/README.md | 82 - packages/wekan-cfs-reactive-list/api.md | 195 -- .../wekan-cfs-reactive-list/internal.api.md | 203 -- packages/wekan-cfs-reactive-list/package.js | 23 - .../wekan-cfs-reactive-list/reactive-list.js | 313 -- packages/wekan-cfs-reactive-list/tests.js | 104 - .../wekan-cfs-reactive-property/.editorconfig | 18 - .../wekan-cfs-reactive-property/.gitignore | 2 - .../wekan-cfs-reactive-property/.jshintrc | 97 - .../wekan-cfs-reactive-property/LICENSE.md | 20 - .../wekan-cfs-reactive-property/README.md | 32 - packages/wekan-cfs-reactive-property/api.md | 152 - .../internal.api.md | 167 - .../wekan-cfs-reactive-property/package.js | 23 - .../reactive-property.js | 137 - packages/wekan-cfs-reactive-property/tests.js | 30 - .../wekan-cfs-standard-packages/.travis.yml | 5 - .../wekan-cfs-standard-packages/ADVANCED.md | 265 -- .../wekan-cfs-standard-packages/CHANGELOG.md | 721 ----- .../wekan-cfs-standard-packages/LICENSE.md | 20 - .../wekan-cfs-standard-packages/README.md | 16 - .../wekan-cfs-standard-packages/package.js | 42 - .../tests/client-tests.js | 25 - .../tests/server-tests.js | 25 - .../wekan-cfs-storage-adapter/.travis.yml | 5 - packages/wekan-cfs-storage-adapter/LICENSE.md | 20 - packages/wekan-cfs-storage-adapter/README.md | 7 - packages/wekan-cfs-storage-adapter/api.md | 0 .../wekan-cfs-storage-adapter/internal.api.md | 101 - packages/wekan-cfs-storage-adapter/package.js | 50 - .../storageAdapter.client.js | 37 - .../storageAdapter.server.js | 269 -- .../tests/client-tests.js | 44 - .../tests/server-tests.js | 49 - .../transform.server.js | 119 - packages/wekan-cfs-temp-store/.travis.yml | 5 - packages/wekan-cfs-temp-store/CHANGELOG.md | 169 - packages/wekan-cfs-temp-store/LICENSE.md | 20 - packages/wekan-cfs-temp-store/README.md | 24 - packages/wekan-cfs-temp-store/api.md | 112 - packages/wekan-cfs-temp-store/internal.api.md | 225 -- packages/wekan-cfs-temp-store/package.js | 32 - packages/wekan-cfs-temp-store/tempStore.js | 395 --- .../tests/server-tests.js | 39 - packages/wekan-cfs-upload-http/.travis.yml | 5 - packages/wekan-cfs-upload-http/LICENSE.md | 20 - packages/wekan-cfs-upload-http/README.md | 8 - packages/wekan-cfs-upload-http/api.md | 24 - .../wekan-cfs-upload-http/internal.api.md | 160 - packages/wekan-cfs-upload-http/package.js | 37 - .../tests/client-tests.js | 27 - .../tests/server-tests.js | 27 - .../upload-http-client.js | 260 -- .../upload-http-common.js | 1 - packages/wekan-cfs-worker/.travis.yml | 5 - packages/wekan-cfs-worker/CHANGELOG.md | 123 - packages/wekan-cfs-worker/LICENSE.md | 20 - packages/wekan-cfs-worker/README.md | 8 - packages/wekan-cfs-worker/api.md | 38 - packages/wekan-cfs-worker/fileWorker.js | 185 -- packages/wekan-cfs-worker/internal.api.md | 143 - packages/wekan-cfs-worker/package.js | 34 - .../wekan-cfs-worker/tests/client-tests.js | 44 - .../wekan-cfs-worker/tests/server-tests.js | 49 - packages/wekan-ldap/LICENSE | 21 - packages/wekan-ldap/README.md | 130 - packages/wekan-ldap/client/loginHelper.js | 52 - packages/wekan-ldap/package.js | 28 - packages/wekan-ldap/server/index.js | 1 - packages/wekan-ldap/server/ldap.js | 593 ---- packages/wekan-ldap/server/logger.js | 15 - packages/wekan-ldap/server/loginHandler.js | 252 -- packages/wekan-ldap/server/sync.js | 469 --- packages/wekan-ldap/server/syncUser.js | 29 - packages/wekan-ldap/server/testConnection.js | 39 - packages/wekan-oidc/.gitignore | 1 - packages/wekan-oidc/LICENSE.txt | 14 - packages/wekan-oidc/README.md | 7 - packages/wekan-oidc/oidc_client.js | 67 - packages/wekan-oidc/oidc_configure.html | 6 - packages/wekan-oidc/oidc_configure.js | 17 - packages/wekan-oidc/oidc_server.js | 252 -- packages/wekan-oidc/package.js | 23 - packages/wekan-tap-i18n/ChangeLog | 216 ++ .../LICENSE | 10 +- packages/wekan-tap-i18n/README.md | 808 +++++ packages/wekan-tap-i18n/TODO | 3 + packages/wekan-tap-i18n/lib/globals.js | 10 + .../lib/plugin/compiler_configuration.coffee | 23 + .../lib/plugin/compilers/i18n.coffee | 18 + .../compilers/i18n.generic_compiler.coffee | 124 + .../lib/plugin/compilers/i18n.json.coffee | 4 + .../lib/plugin/compilers/i18n.yml.coffee | 4 + .../plugin/compilers/package-tap.i18n.coffee | 95 + .../plugin/compilers/project-tap.i18n.coffee | 122 + .../lib/plugin/compilers/share.coffee | 1 + .../lib/plugin/etc/language_names.js | 136 + .../helpers/compile_step_helpers.coffee | 23 + .../lib/plugin/helpers/helpers.coffee | 1 + .../lib/plugin/helpers/load_json.coffee | 25 + .../lib/plugin/helpers/load_yml.coffee | 25 + .../lib/tap_i18n/tap_i18n-client.coffee | 198 ++ .../lib/tap_i18n/tap_i18n-common.coffee | 143 + .../lib/tap_i18n/tap_i18n-helpers.coffee | 1 + .../lib/tap_i18n/tap_i18n-init.coffee | 1 + .../lib/tap_i18n/tap_i18n-server.coffee | 85 + .../lib/tap_i18next/tap_i18next-1.7.3.js | 2748 +++++++++++++++++ .../lib/tap_i18next/tap_i18next_init.js | 1 + packages/wekan-tap-i18n/package.js | 78 + server/accounts-lockout.js | 26 - server/migrations.js | 3 + server/publications/boards.js | 2 +- server/publications/fast-render.js | 9 - 316 files changed, 5049 insertions(+), 32549 deletions(-) delete mode 100644 client/config/presence.js delete mode 100644 models/presences.js delete mode 100644 packages/meteor-accounts-cas/.gitignore delete mode 100644 packages/meteor-accounts-cas/LICENSE delete mode 100644 packages/meteor-accounts-cas/README.md delete mode 100644 packages/meteor-accounts-cas/cas_client.js delete mode 100644 packages/meteor-accounts-cas/cas_client_cordova.js delete mode 100644 packages/meteor-accounts-cas/cas_server.js delete mode 100644 packages/meteor-accounts-cas/package.js delete mode 100644 packages/meteor-useraccounts-core/.editorconfig delete mode 100644 packages/meteor-useraccounts-core/.gitignore delete mode 100644 packages/meteor-useraccounts-core/.jshintignore delete mode 100644 packages/meteor-useraccounts-core/.jshintrc delete mode 100644 packages/meteor-useraccounts-core/.travis.yml delete mode 100644 packages/meteor-useraccounts-core/Guide.md delete mode 100644 packages/meteor-useraccounts-core/History.md delete mode 100644 packages/meteor-useraccounts-core/LICENSE.md delete mode 100644 packages/meteor-useraccounts-core/README.md delete mode 100644 packages/meteor-useraccounts-core/lib/client.js delete mode 100644 packages/meteor-useraccounts-core/lib/core.js delete mode 100644 packages/meteor-useraccounts-core/lib/field.js delete mode 100644 packages/meteor-useraccounts-core/lib/methods.js delete mode 100644 packages/meteor-useraccounts-core/lib/server.js delete mode 100644 packages/meteor-useraccounts-core/lib/server_methods.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html delete mode 100644 packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js delete mode 100644 packages/meteor-useraccounts-core/lib/utils.js delete mode 100644 packages/meteor-useraccounts-core/package.js delete mode 100644 packages/meteor-useraccounts-core/tests/tests.js delete mode 100644 packages/meteorx/package.js delete mode 100644 packages/wekan-accounts-cas/README.md delete mode 100644 packages/wekan-accounts-cas/cas_client.js delete mode 100644 packages/wekan-accounts-cas/cas_client_cordova.js delete mode 100644 packages/wekan-accounts-cas/cas_server.js delete mode 100644 packages/wekan-accounts-cas/package.js delete mode 100644 packages/wekan-accounts-oidc/.gitignore delete mode 100644 packages/wekan-accounts-oidc/LICENSE.txt delete mode 100644 packages/wekan-accounts-oidc/README.md delete mode 100644 packages/wekan-accounts-oidc/oidc.js delete mode 100644 packages/wekan-accounts-oidc/oidc_login_button.css delete mode 100644 packages/wekan-accounts-oidc/package.js delete mode 100644 packages/wekan-cfs-access-point/.travis.yml delete mode 100644 packages/wekan-cfs-access-point/CHANGELOG.md delete mode 100644 packages/wekan-cfs-access-point/LICENSE.md delete mode 100644 packages/wekan-cfs-access-point/README.md delete mode 100644 packages/wekan-cfs-access-point/access-point-client.js delete mode 100644 packages/wekan-cfs-access-point/access-point-common.js delete mode 100644 packages/wekan-cfs-access-point/access-point-handlers.js delete mode 100644 packages/wekan-cfs-access-point/access-point-server.js delete mode 100644 packages/wekan-cfs-access-point/api.md delete mode 100644 packages/wekan-cfs-access-point/internal.api.md delete mode 100644 packages/wekan-cfs-access-point/package.js delete mode 100644 packages/wekan-cfs-access-point/tests/client-tests.js delete mode 100644 packages/wekan-cfs-access-point/tests/server-tests.js delete mode 100644 packages/wekan-cfs-base-package/.travis.yml delete mode 100644 packages/wekan-cfs-base-package/LICENSE.md delete mode 100644 packages/wekan-cfs-base-package/README.md delete mode 100644 packages/wekan-cfs-base-package/api.md delete mode 100644 packages/wekan-cfs-base-package/base-client.js delete mode 100644 packages/wekan-cfs-base-package/base-common.js delete mode 100644 packages/wekan-cfs-base-package/base-server.js delete mode 100644 packages/wekan-cfs-base-package/internal.api.md delete mode 100644 packages/wekan-cfs-base-package/package.js delete mode 100644 packages/wekan-cfs-base-package/polyfill.base64.js delete mode 100644 packages/wekan-cfs-base-package/tests/common-tests.js delete mode 100644 packages/wekan-cfs-collection-filters/.travis.yml delete mode 100644 packages/wekan-cfs-collection-filters/LICENSE.md delete mode 100644 packages/wekan-cfs-collection-filters/README.md delete mode 100644 packages/wekan-cfs-collection-filters/api.md delete mode 100644 packages/wekan-cfs-collection-filters/filters.js delete mode 100644 packages/wekan-cfs-collection-filters/internal.api.md delete mode 100644 packages/wekan-cfs-collection-filters/package.js delete mode 100644 packages/wekan-cfs-collection-filters/tests/client-tests.js delete mode 100644 packages/wekan-cfs-collection-filters/tests/server-tests.js delete mode 100644 packages/wekan-cfs-collection/.travis.yml delete mode 100644 packages/wekan-cfs-collection/CHANGELOG.md delete mode 100644 packages/wekan-cfs-collection/LICENSE.md delete mode 100644 packages/wekan-cfs-collection/README.md delete mode 100644 packages/wekan-cfs-collection/api.common.js delete mode 100644 packages/wekan-cfs-collection/api.md delete mode 100644 packages/wekan-cfs-collection/common.js delete mode 100644 packages/wekan-cfs-collection/internal.api.md delete mode 100644 packages/wekan-cfs-collection/package.js delete mode 100644 packages/wekan-cfs-collection/tests/client-tests.js delete mode 100644 packages/wekan-cfs-collection/tests/server-tests.js delete mode 100644 packages/wekan-cfs-data-man/.travis.yml delete mode 100644 packages/wekan-cfs-data-man/LICENSE.md delete mode 100644 packages/wekan-cfs-data-man/README.md delete mode 100644 packages/wekan-cfs-data-man/api.md delete mode 100644 packages/wekan-cfs-data-man/client/Blob.js delete mode 100644 packages/wekan-cfs-data-man/client/data-man-api.js delete mode 100644 packages/wekan-cfs-data-man/internal.api.md delete mode 100644 packages/wekan-cfs-data-man/package.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-api.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-buffer.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-datauri.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-filepath.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-readstream.js delete mode 100644 packages/wekan-cfs-data-man/server/data-man-url.js delete mode 100644 packages/wekan-cfs-data-man/tests/client-tests.js delete mode 100644 packages/wekan-cfs-data-man/tests/common.js delete mode 100644 packages/wekan-cfs-data-man/tests/server-tests.js delete mode 100644 packages/wekan-cfs-file/.travis.yml delete mode 100644 packages/wekan-cfs-file/CHANGELOG.md delete mode 100644 packages/wekan-cfs-file/LICENSE.md delete mode 100644 packages/wekan-cfs-file/README.md delete mode 100644 packages/wekan-cfs-file/api.md delete mode 100644 packages/wekan-cfs-file/fsFile-common.js delete mode 100644 packages/wekan-cfs-file/fsFile-server.js delete mode 100644 packages/wekan-cfs-file/internal.api.md delete mode 100644 packages/wekan-cfs-file/package.js delete mode 100644 packages/wekan-cfs-file/tests/file-tests.js delete mode 100644 packages/wekan-cfs-filesystem/.travis.yml delete mode 100644 packages/wekan-cfs-filesystem/LICENSE.md delete mode 100644 packages/wekan-cfs-filesystem/README.md delete mode 100644 packages/wekan-cfs-filesystem/filesystem.client.js delete mode 100644 packages/wekan-cfs-filesystem/filesystem.server.js delete mode 100644 packages/wekan-cfs-filesystem/package.js delete mode 100644 packages/wekan-cfs-filesystem/tests.js delete mode 100644 packages/wekan-cfs-filesystem/tests/client-tests.js delete mode 100644 packages/wekan-cfs-filesystem/tests/server-tests.js delete mode 100644 packages/wekan-cfs-gridfs/.travis.yml delete mode 100644 packages/wekan-cfs-gridfs/LICENSE.md delete mode 100644 packages/wekan-cfs-gridfs/README.md delete mode 100644 packages/wekan-cfs-gridfs/api.md delete mode 100644 packages/wekan-cfs-gridfs/gridfs.client.js delete mode 100644 packages/wekan-cfs-gridfs/gridfs.server.js delete mode 100644 packages/wekan-cfs-gridfs/internal.api.md delete mode 100755 packages/wekan-cfs-gridfs/package.js delete mode 100644 packages/wekan-cfs-gridfs/tests/client-tests.js delete mode 100644 packages/wekan-cfs-gridfs/tests/server-tests.js delete mode 100644 packages/wekan-cfs-http-methods/.editorconfig delete mode 100644 packages/wekan-cfs-http-methods/.gitignore delete mode 100644 packages/wekan-cfs-http-methods/.jshintrc delete mode 100644 packages/wekan-cfs-http-methods/.travis.yml delete mode 100644 packages/wekan-cfs-http-methods/CHANGELOG.md delete mode 100644 packages/wekan-cfs-http-methods/LICENSE.md delete mode 100644 packages/wekan-cfs-http-methods/README.md delete mode 100644 packages/wekan-cfs-http-methods/http.methods.client.api.js delete mode 100644 packages/wekan-cfs-http-methods/http.methods.server.api.js delete mode 100644 packages/wekan-cfs-http-methods/http.methods.tests.js delete mode 100644 packages/wekan-cfs-http-methods/package.js delete mode 100644 packages/wekan-cfs-http-publish/.editorconfig delete mode 100644 packages/wekan-cfs-http-publish/.gitignore delete mode 100644 packages/wekan-cfs-http-publish/.jshintrc delete mode 100644 packages/wekan-cfs-http-publish/.travis.yml delete mode 100644 packages/wekan-cfs-http-publish/LICENSE.md delete mode 100644 packages/wekan-cfs-http-publish/README.md delete mode 100644 packages/wekan-cfs-http-publish/api.md delete mode 100644 packages/wekan-cfs-http-publish/http.publish.client.api.js delete mode 100644 packages/wekan-cfs-http-publish/http.publish.server.api.js delete mode 100644 packages/wekan-cfs-http-publish/http.publish.tests.client.js delete mode 100644 packages/wekan-cfs-http-publish/http.publish.tests.server.js delete mode 100644 packages/wekan-cfs-http-publish/internal.api.md delete mode 100644 packages/wekan-cfs-http-publish/package.js delete mode 100644 packages/wekan-cfs-http-publish/packages/.gitignore delete mode 100644 packages/wekan-cfs-power-queue/.editorconfig delete mode 100644 packages/wekan-cfs-power-queue/.gitignore delete mode 100644 packages/wekan-cfs-power-queue/.jshintrc delete mode 100644 packages/wekan-cfs-power-queue/.travis.yml delete mode 100644 packages/wekan-cfs-power-queue/LICENSE.md delete mode 100644 packages/wekan-cfs-power-queue/README.md delete mode 100644 packages/wekan-cfs-power-queue/api.md delete mode 100644 packages/wekan-cfs-power-queue/internal.api.md delete mode 100644 packages/wekan-cfs-power-queue/package.js delete mode 100644 packages/wekan-cfs-power-queue/power-queue.js delete mode 100644 packages/wekan-cfs-power-queue/spinal-queue.spec.md delete mode 100644 packages/wekan-cfs-power-queue/tests.js delete mode 100644 packages/wekan-cfs-reactive-list/.editorconfig delete mode 100644 packages/wekan-cfs-reactive-list/.gitignore delete mode 100644 packages/wekan-cfs-reactive-list/.jshintrc delete mode 100644 packages/wekan-cfs-reactive-list/.travis.yml delete mode 100644 packages/wekan-cfs-reactive-list/LICENSE.md delete mode 100644 packages/wekan-cfs-reactive-list/README.md delete mode 100644 packages/wekan-cfs-reactive-list/api.md delete mode 100644 packages/wekan-cfs-reactive-list/internal.api.md delete mode 100644 packages/wekan-cfs-reactive-list/package.js delete mode 100644 packages/wekan-cfs-reactive-list/reactive-list.js delete mode 100644 packages/wekan-cfs-reactive-list/tests.js delete mode 100644 packages/wekan-cfs-reactive-property/.editorconfig delete mode 100644 packages/wekan-cfs-reactive-property/.gitignore delete mode 100644 packages/wekan-cfs-reactive-property/.jshintrc delete mode 100644 packages/wekan-cfs-reactive-property/LICENSE.md delete mode 100644 packages/wekan-cfs-reactive-property/README.md delete mode 100644 packages/wekan-cfs-reactive-property/api.md delete mode 100644 packages/wekan-cfs-reactive-property/internal.api.md delete mode 100644 packages/wekan-cfs-reactive-property/package.js delete mode 100644 packages/wekan-cfs-reactive-property/reactive-property.js delete mode 100644 packages/wekan-cfs-reactive-property/tests.js delete mode 100644 packages/wekan-cfs-standard-packages/.travis.yml delete mode 100644 packages/wekan-cfs-standard-packages/ADVANCED.md delete mode 100644 packages/wekan-cfs-standard-packages/CHANGELOG.md delete mode 100644 packages/wekan-cfs-standard-packages/LICENSE.md delete mode 100644 packages/wekan-cfs-standard-packages/README.md delete mode 100644 packages/wekan-cfs-standard-packages/package.js delete mode 100644 packages/wekan-cfs-standard-packages/tests/client-tests.js delete mode 100644 packages/wekan-cfs-standard-packages/tests/server-tests.js delete mode 100644 packages/wekan-cfs-storage-adapter/.travis.yml delete mode 100644 packages/wekan-cfs-storage-adapter/LICENSE.md delete mode 100644 packages/wekan-cfs-storage-adapter/README.md delete mode 100644 packages/wekan-cfs-storage-adapter/api.md delete mode 100644 packages/wekan-cfs-storage-adapter/internal.api.md delete mode 100644 packages/wekan-cfs-storage-adapter/package.js delete mode 100644 packages/wekan-cfs-storage-adapter/storageAdapter.client.js delete mode 100644 packages/wekan-cfs-storage-adapter/storageAdapter.server.js delete mode 100644 packages/wekan-cfs-storage-adapter/tests/client-tests.js delete mode 100644 packages/wekan-cfs-storage-adapter/tests/server-tests.js delete mode 100644 packages/wekan-cfs-storage-adapter/transform.server.js delete mode 100644 packages/wekan-cfs-temp-store/.travis.yml delete mode 100644 packages/wekan-cfs-temp-store/CHANGELOG.md delete mode 100644 packages/wekan-cfs-temp-store/LICENSE.md delete mode 100644 packages/wekan-cfs-temp-store/README.md delete mode 100644 packages/wekan-cfs-temp-store/api.md delete mode 100644 packages/wekan-cfs-temp-store/internal.api.md delete mode 100644 packages/wekan-cfs-temp-store/package.js delete mode 100644 packages/wekan-cfs-temp-store/tempStore.js delete mode 100644 packages/wekan-cfs-temp-store/tests/server-tests.js delete mode 100644 packages/wekan-cfs-upload-http/.travis.yml delete mode 100644 packages/wekan-cfs-upload-http/LICENSE.md delete mode 100644 packages/wekan-cfs-upload-http/README.md delete mode 100644 packages/wekan-cfs-upload-http/api.md delete mode 100644 packages/wekan-cfs-upload-http/internal.api.md delete mode 100644 packages/wekan-cfs-upload-http/package.js delete mode 100644 packages/wekan-cfs-upload-http/tests/client-tests.js delete mode 100644 packages/wekan-cfs-upload-http/tests/server-tests.js delete mode 100644 packages/wekan-cfs-upload-http/upload-http-client.js delete mode 100644 packages/wekan-cfs-upload-http/upload-http-common.js delete mode 100644 packages/wekan-cfs-worker/.travis.yml delete mode 100644 packages/wekan-cfs-worker/CHANGELOG.md delete mode 100644 packages/wekan-cfs-worker/LICENSE.md delete mode 100644 packages/wekan-cfs-worker/README.md delete mode 100644 packages/wekan-cfs-worker/api.md delete mode 100644 packages/wekan-cfs-worker/fileWorker.js delete mode 100644 packages/wekan-cfs-worker/internal.api.md delete mode 100644 packages/wekan-cfs-worker/package.js delete mode 100644 packages/wekan-cfs-worker/tests/client-tests.js delete mode 100644 packages/wekan-cfs-worker/tests/server-tests.js delete mode 100644 packages/wekan-ldap/LICENSE delete mode 100644 packages/wekan-ldap/README.md delete mode 100644 packages/wekan-ldap/client/loginHelper.js delete mode 100644 packages/wekan-ldap/package.js delete mode 100644 packages/wekan-ldap/server/index.js delete mode 100644 packages/wekan-ldap/server/ldap.js delete mode 100644 packages/wekan-ldap/server/logger.js delete mode 100644 packages/wekan-ldap/server/loginHandler.js delete mode 100644 packages/wekan-ldap/server/sync.js delete mode 100644 packages/wekan-ldap/server/syncUser.js delete mode 100644 packages/wekan-ldap/server/testConnection.js delete mode 100644 packages/wekan-oidc/.gitignore delete mode 100644 packages/wekan-oidc/LICENSE.txt delete mode 100644 packages/wekan-oidc/README.md delete mode 100644 packages/wekan-oidc/oidc_client.js delete mode 100644 packages/wekan-oidc/oidc_configure.html delete mode 100644 packages/wekan-oidc/oidc_configure.js delete mode 100644 packages/wekan-oidc/oidc_server.js delete mode 100644 packages/wekan-oidc/package.js create mode 100644 packages/wekan-tap-i18n/ChangeLog rename packages/{wekan-accounts-cas => wekan-tap-i18n}/LICENSE (86%) create mode 100644 packages/wekan-tap-i18n/README.md create mode 100644 packages/wekan-tap-i18n/TODO create mode 100644 packages/wekan-tap-i18n/lib/globals.js create mode 100644 packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/etc/language_names.js create mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee create mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee create mode 100644 packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js create mode 100644 packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js create mode 100644 packages/wekan-tap-i18n/package.js delete mode 100644 server/accounts-lockout.js delete mode 100644 server/publications/fast-render.js diff --git a/.meteor/packages b/.meteor/packages index 10d89875e..218cce0f0 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -3,12 +3,12 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -meteor-base@1.4.0 +meteor-base@1.5.1 # Build system -ecmascript@0.15.1 -standard-minifier-css@1.7.2 -standard-minifier-js@2.6.0 +ecmascript@0.15.2 +standard-minifier-css@1.7.3 +standard-minifier-js@2.6.1 mquandalle:jade coffeescript@2.4.1! @@ -17,23 +17,14 @@ es5-shim@4.8.0 # Collections aldeed:collection2 -wekan-cfs-standard-packages cottz:publish-relations dburles:collection-helpers idmontie:migrations -matb33:collection-hooks matteodem:easy-search -mongo@1.11.0 +mongo@1.12.0 mquandalle:collection-mutations # Account system -kenton:accounts-sandstorm -service-configuration@1.0.11 -useraccounts:unstyled -useraccounts:flow-routing -wekan-ldap -wekan-accounts-cas -wekan-accounts-oidc # Utilities check@1.3.1 @@ -43,7 +34,6 @@ reactive-dict@1.3.0 session@1.2.0 tracker@1.2.0 underscore@1.0.10 -3stack:presence arillo:flow-router-helpers audit-argument-checks@1.0.7 kadira:blaze-layout @@ -51,8 +41,7 @@ kadira:dochead mquandalle:autofocus ongoworks:speakingurl raix:handlebar-helpers -tap:i18n -http@1.4.2 +http@2.0.0 # UI components blaze @@ -64,17 +53,11 @@ mquandalle:mousetrap-bindglobal peerlibrary:blaze-components@=0.15.1 templates:tabs meteor-autosize -simple:json-routes rajit:bootstrap3-datepicker shell-server@0.5.0 -simple:rest-accounts-password -useraccounts:core -email@2.0.0 +email@2.1.1 horka:swipebox -dynamic-import@0.6.0 - -accounts-password@1.7.0 -wekan-cfs-gridfs +dynamic-import@0.7.1 rzymek:fullcalendar momentjs:moment@2.22.2 browser-policy-framing@1.1.0 @@ -84,13 +67,10 @@ msavin:usercache coagmano:stylus@1.1.0! meteorhacks:subs-manager meteorhacks:picker -lamhieu:unblock meteorhacks:aggregate@1.3.0 wekan-markdown konecty:mongo-counter percolate:synced-cron -wekan-cfs-filesystem -steffo:meteor-accounts-saml rajit:bootstrap3-datepicker-fi rajit:bootstrap3-datepicker-ar rajit:bootstrap3-datepicker-bg @@ -139,10 +119,13 @@ rajit:bootstrap3-datepicker-uk rajit:bootstrap3-datepicker-vi rajit:bootstrap3-datepicker-zh-cn rajit:bootstrap3-datepicker-zh-tw -staringatlights:fast-render -spacebars easylogic:summernote pascoual:pdfkit -wekan-accounts-lockout lmieulet:meteor-coverage meteortesting:mocha +aldeed:simple-schema +accounts-password@2.0.0 +matb33:collection-hooks +simple:json-routes +kadira:flow-router +spacebars diff --git a/.meteor/release b/.meteor/release index d8fd7cf54..ebaaa330b 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.2 +METEOR@2.3.4 diff --git a/.meteor/versions b/.meteor/versions index 0f1be0e1d..5f85a4cf8 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,7 +1,5 @@ -3stack:presence@1.1.2 -accounts-base@1.9.0 -accounts-oauth@1.2.0 -accounts-password@1.7.1 +accounts-base@2.0.1 +accounts-password@2.0.0 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 aldeed:schema-deny@1.1.0 @@ -11,7 +9,7 @@ allow-deny@1.1.0 arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 autoupdate@1.7.0 -babel-compiler@7.6.1 +babel-compiler@7.6.2 babel-runtime@1.5.0 base64@1.0.12 binary-heap@1.0.11 @@ -21,31 +19,30 @@ boilerplate-generator@1.7.1 browser-policy-common@1.0.11 browser-policy-framing@1.1.0 caching-compiler@1.2.2 -caching-html-compiler@1.2.0 -callback-hook@1.3.0 +caching-html-compiler@1.2.1 +callback-hook@1.3.1 cfs:http-methods@0.0.32 check@1.3.1 -chuangbo:cookie@1.1.0 coagmano:stylus@1.1.0 coffeescript@2.4.1 coffeescript-compiler@2.4.1 cottz:publish-relations@2.0.8 dburles:collection-helpers@1.1.0 ddp@1.4.0 -ddp-client@2.4.1 +ddp-client@2.5.0 ddp-common@1.4.0 -ddp-rate-limiter@1.0.9 -ddp-server@2.3.3 +ddp-rate-limiter@1.1.0 +ddp-server@2.4.0 deps@1.0.12 diff-sequence@1.1.1 -dynamic-import@0.6.0 +dynamic-import@0.7.1 easylogic:summernote@0.8.8 -ecmascript@0.15.1 +ecmascript@0.15.2 ecmascript-runtime@0.7.0 ecmascript-runtime-client@0.11.1 ecmascript-runtime-server@0.10.1 ejson@1.1.1 -email@2.0.0 +email@2.1.1 es5-shim@4.8.0 fastclick@1.0.13 fetch@0.1.1 @@ -55,7 +52,7 @@ horka:swipebox@1.0.2 hot-code-push@1.0.4 html-tools@1.1.2 htmljs@1.1.1 -http@1.4.4 +http@2.0.0 id-map@1.1.1 idmontie:migrations@1.0.3 inter-process-messaging@0.1.1 @@ -63,40 +60,36 @@ jquery@1.11.11 kadira:blaze-layout@2.3.0 kadira:dochead@1.5.0 kadira:flow-router@2.12.1 -kenton:accounts-sandstorm@0.7.0 konecty:mongo-counter@0.0.5_3 -lamhieu:meteorx@2.1.1 -lamhieu:unblock@1.0.0 -launch-screen@1.2.1 +launch-screen@1.3.0 livedata@1.0.18 -lmieulet:meteor-coverage@3.2.0 +lmieulet:meteor-coverage@1.1.4 localstorage@1.2.0 logging@1.2.0 -matb33:collection-hooks@0.9.1 +matb33:collection-hooks@1.1.0 matteodem:easy-search@1.6.4 mdg:validation-error@0.5.1 meteor@1.9.3 meteor-autosize@5.0.1 -meteor-base@1.4.0 +meteor-base@1.5.1 meteor-platform@1.2.6 meteorhacks:aggregate@1.3.0 meteorhacks:collection-utils@1.2.0 meteorhacks:picker@1.0.3 meteorhacks:subs-manager@1.6.4 meteorspark:util@0.2.0 -meteortesting:browser-tests@1.3.4 -meteortesting:mocha@2.0.1 -meteortesting:mocha-core@8.0.1 +meteortesting:browser-tests@0.2.0 +meteortesting:mocha@0.6.0 minifier-css@1.5.4 -minifier-js@2.6.0 +minifier-js@2.6.1 minifiers@1.1.8-faster-rebuild.0 -minimongo@1.6.2 +minimongo@1.7.0 mobile-status-bar@1.1.0 modern-browsers@0.1.5 modules@0.16.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 -mongo@1.11.1 +mongo@1.12.0 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -107,24 +100,24 @@ mquandalle:collection-mutations@0.1.0 mquandalle:jade@0.4.9 mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 +mquandalle:jquery-ui-drag-drop-sort@0.2.0 mquandalle:moment@1.0.1 mquandalle:mousetrap-bindglobal@0.0.1 +mrt:just-i18n@0.3.0 msavin:usercache@1.8.0 -npm-bcrypt@0.9.4 -npm-mongo@3.9.0 -oauth@1.3.2 -oauth2@1.3.0 -observe-sequence@1.0.16 +npm-mongo@3.9.1 +observe-sequence@1.0.19 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 -peerlibrary:base-component@0.16.0 +peerlibrary:base-component@0.17.1 peerlibrary:blaze-components@0.15.1 peerlibrary:computed-field@0.10.0 peerlibrary:reactive-field@0.6.0 percolate:synced-cron@1.3.2 -promise@0.11.2 +practicalmeteor:mocha-core@1.0.1 +promise@0.12.0 raix:eventemitter@0.1.3 raix:handlebar-helpers@0.2.5 rajit:bootstrap3-datepicker@1.7.1_1 @@ -183,67 +176,30 @@ reactive-dict@1.3.0 reactive-var@1.0.11 reload@1.3.1 retry@1.1.0 -routepolicy@1.1.0 +routepolicy@1.1.1 rzymek:fullcalendar@3.8.0 -server-render@0.3.1 -service-configuration@1.0.11 +service-configuration@1.1.0 session@1.2.0 sha@1.0.9 shell-server@0.5.0 -simple:authenticate-user-by-token@1.0.1 simple:json-routes@2.1.0 -simple:rest-accounts-password@1.1.2 -simple:rest-bearer-token-parser@1.0.1 -simple:rest-json-error-handler@1.0.1 -socket-stream-client@0.3.3 -softwarerero:accounts-t9n@1.3.11 +socket-stream-client@0.4.0 spacebars@1.2.0 -spacebars-compiler@1.2.1 -srp@1.1.0 -standard-minifier-css@1.7.2 -standard-minifier-js@2.6.0 -staringatlights:fast-render@3.3.0 -staringatlights:inject-data@2.3.0 -steffo:meteor-accounts-saml@0.0.18 +spacebars-compiler@1.3.0 +standard-minifier-css@1.7.3 +standard-minifier-js@2.6.1 tap:i18n@1.8.2 templates:tabs@2.3.0 -templating@1.4.0 +templating@1.4.1 templating-compiler@1.4.1 -templating-runtime@1.4.0 -templating-tools@1.2.0 +templating-runtime@1.5.0 +templating-tools@1.2.1 tracker@1.2.0 twbs:bootstrap@3.3.6 ui@1.0.13 underscore@1.0.10 url@1.3.2 -useraccounts:core@1.14.2 -useraccounts:flow-routing@1.14.2 -useraccounts:unstyled@1.14.2 -webapp@1.10.1 +webapp@1.11.1 webapp-hashing@1.1.0 -wekan-accounts-cas@0.1.0 -wekan-accounts-lockout@1.0.0 -wekan-accounts-oidc@1.0.10 -wekan-cfs-access-point@0.1.50 -wekan-cfs-base-package@0.0.30 -wekan-cfs-collection@0.5.5 -wekan-cfs-collection-filters@0.2.4 -wekan-cfs-data-man@0.0.6 -wekan-cfs-file@0.1.17 -wekan-cfs-filesystem@0.1.2 -wekan-cfs-gridfs@0.0.34 -wekan-cfs-http-methods@0.0.32 -wekan-cfs-http-publish@0.0.13 -wekan-cfs-power-queue@0.9.11 -wekan-cfs-reactive-list@0.0.9 -wekan-cfs-reactive-property@0.0.4 -wekan-cfs-standard-packages@0.5.10 -wekan-cfs-storage-adapter@0.2.4 -wekan-cfs-tempstore@0.1.6 -wekan-cfs-upload-http@0.0.21 -wekan-cfs-worker@0.1.5 -wekan-ldap@0.0.2 wekan-markdown@1.0.9 -wekan-oidc@1.0.12 -yasaricli:slugify@0.0.7 zimme:active-route@2.3.2 diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 1d70c0c00..110e64bf6 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1795,6 +1795,7 @@ Template.cardAssigneePopup.helpers({ return user && user.isBoardAdmin() ? 'admin' : 'normal'; }, +/* presenceStatusClassName() { const user = Users.findOne(this.userId); const userPresence = presences.findOne({ userId: this.userId }); @@ -1804,7 +1805,7 @@ Template.cardAssigneePopup.helpers({ return 'active'; else return 'idle'; }, - +*/ isCardAssignee() { const card = Template.parentData(); const cardAssignees = card.getAssignees(); diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 22e5af524..5ae4ea0d0 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -25,6 +25,7 @@ Template.userAvatar.helpers({ return user && user.isBoardAdmin() ? 'admin' : 'normal'; }, +/* presenceStatusClassName() { const user = Users.findOne(this.userId); const userPresence = presences.findOne({ userId: this.userId }); @@ -34,6 +35,8 @@ Template.userAvatar.helpers({ return 'active'; else return 'idle'; }, +*/ + }); Template.userAvatarInitials.helpers({ diff --git a/client/config/presence.js b/client/config/presence.js deleted file mode 100644 index 39b94e4d2..000000000 --- a/client/config/presence.js +++ /dev/null @@ -1,7 +0,0 @@ -Presence.configure({ - state() { - return { - currentBoardId: Session.get('currentBoard'), - }; - }, -}); diff --git a/config/accounts.js b/config/accounts.js index de1d473b0..a2046d0f1 100644 --- a/config/accounts.js +++ b/config/accounts.js @@ -1,3 +1,4 @@ +/* const passwordField = AccountsTemplates.removeField('password'); const emailField = AccountsTemplates.removeField('email'); @@ -88,3 +89,5 @@ if (Meteor.isServer) { }; }); } + +*/ diff --git a/config/router.js b/config/router.js index 7e8f78660..cc1d2c5ea 100644 --- a/config/router.js +++ b/config/router.js @@ -7,7 +7,7 @@ FlowRouter.triggers.exit([ FlowRouter.route('/', { name: 'home', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [qAccountsTemplates.ensureSignedIn], action() { Session.set('currentBoard', null); Session.set('currentList', null); @@ -31,7 +31,7 @@ FlowRouter.route('/', { FlowRouter.route('/public', { name: 'public', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Session.set('currentBoard', null); Session.set('currentList', null); @@ -150,7 +150,7 @@ FlowRouter.route('/b/templates', { FlowRouter.route('/my-cards', { name: 'my-cards', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -170,7 +170,7 @@ FlowRouter.route('/my-cards', { FlowRouter.route('/due-cards', { name: 'due-cards', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -190,7 +190,7 @@ FlowRouter.route('/due-cards', { FlowRouter.route('/global-search', { name: 'global-search', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -236,7 +236,7 @@ FlowRouter.route('/broken-cards', { FlowRouter.route('/import/:source', { name: 'import', - triggersEnter: [AccountsTemplates.ensureSignedIn], + //triggersEnter: [AccountsTemplates.ensureSignedIn], action(params) { if (Session.get('currentBoard')) { Session.set('fromBoard', Session.get('currentBoard')); @@ -261,7 +261,7 @@ FlowRouter.route('/import/:source', { FlowRouter.route('/setting', { name: 'setting', triggersEnter: [ - AccountsTemplates.ensureSignedIn, + //AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -286,7 +286,7 @@ FlowRouter.route('/setting', { FlowRouter.route('/information', { name: 'information', triggersEnter: [ - AccountsTemplates.ensureSignedIn, + //AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -310,7 +310,7 @@ FlowRouter.route('/information', { FlowRouter.route('/people', { name: 'people', triggersEnter: [ - AccountsTemplates.ensureSignedIn, + //AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -334,7 +334,7 @@ FlowRouter.route('/people', { FlowRouter.route('/admin-reports', { name: 'admin-reports', triggersEnter: [ - AccountsTemplates.ensureSignedIn, + //AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); diff --git a/models/attachments.js b/models/attachments.js index f0d6ba8e4..681d85b7f 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -1,3 +1,5 @@ +/* + export const AttachmentStorage = new Mongo.Collection( 'cfs_gridfs.attachments.files', ); @@ -24,7 +26,7 @@ if (localFSStore) { const Grid = Npm.require('gridfs-stream'); // calulate the absolute path here, because FS.Store.FileSystem didn't expose the aboslutepath or FS.Store didn't expose api calls :( let pathname = localFSStore; - /*eslint camelcase: ["error", {allow: ["__meteor_bootstrap__"]}] */ + // eslint camelcase: ["error", {allow: ["__meteor_bootstrap__"]}] if (!pathname && __meteor_bootstrap__ && __meteor_bootstrap__.serverDir) { pathname = path.join( @@ -180,6 +182,8 @@ Attachments = new FS.Collection('attachments', { stores: [store], }); + + if (Meteor.isServer) { Meteor.startup(() => { Attachments.files._ensureIndex({ cardId: 1 }); @@ -266,3 +270,4 @@ if (Meteor.isServer) { } export default Attachments; +*/ diff --git a/models/avatars.js b/models/avatars.js index e823dfea5..a0a47478a 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -1,3 +1,5 @@ +/* + Avatars = new FS.Collection('avatars', { stores: [new FS.Store.GridFS('avatars')], filter: { @@ -27,3 +29,4 @@ Avatars.files.before.insert((userId, doc) => { }); export default Avatars; +*/ diff --git a/models/presences.js b/models/presences.js deleted file mode 100644 index 94c8fdabb..000000000 --- a/models/presences.js +++ /dev/null @@ -1,12 +0,0 @@ -if (Meteor.isServer) { - Meteor.startup(() => { - // Date of 7 days ago - let lastWeek = new Date(); - lastWeek.setDate(lastWeek.getDate() - 7); - - presences.remove({ ttl: { $lte: lastWeek } }); - - // Create index for serverId that is queried often - presences._collection._ensureIndex({ serverId: -1 }); - }); -} diff --git a/package-lock.json b/package-lock.json index 77854f834..14f4bb162 100644 --- a/package-lock.json +++ b/package-lock.json @@ -709,6 +709,13 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "check-error": { @@ -717,6 +724,11 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1538,9 +1550,9 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" }, "esprima": { "version": "4.0.1", @@ -2048,6 +2060,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -2109,6 +2126,23 @@ "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", @@ -2170,6 +2204,14 @@ "stylis": "^4.0.10" } }, + "message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "requires": { + "lodash.template": "^4.5.0" + } + }, "meteor-node-stubs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", @@ -2977,14 +3019,18 @@ "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "moment-mini": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" }, + "mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, "mongodb": { "version": "3.7.3", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", @@ -3362,6 +3408,16 @@ "object-inspect": "^1.9.0" } }, + "simpl-schema": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", + "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", + "requires": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, "sinon": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", diff --git a/package.json b/package.json index 0d8e8e2bd..04d022d97 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "core-js": "^2.6.12", "dompurify": "^2.3.0", "es6-promise": "^4.2.4", + "escape-string-regexp": "^5.0.0", "exceljs": "^4.2.1", "fibers": "^5.0.0", "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", @@ -42,11 +43,13 @@ "markdown-it": "^12.3.2", "markdown-it-emoji": "^2.0.0", "meteor-node-stubs": "^1.1.0", + "moment": "^2.29.1", "mongodb": "^3.7.3", "os": "^0.1.2", "page": "^1.11.5", "papaparse": "^5.3.1", "qs": "^6.10.1", + "simpl-schema": "^1.12.0", "source-map-support": "^0.5.19" }, "meteor": { diff --git a/packages/markdown/package.js b/packages/markdown/package.js index 8116e2bc3..4405788fb 100644 --- a/packages/markdown/package.js +++ b/packages/markdown/package.js @@ -12,11 +12,11 @@ Package.onUse(function (api) { if(api.versionsFrom) api.versionsFrom('1.8.2'); api.use('templating'); - api.use("ecmascript", ['server', 'client']); + api.use("ecmascript", ['server', 'client']); api.export('Markdown', ['server', 'client']); - api.use('ui', 'client', {weak: true}); + api.use('ui', 'client', {weak: true}); - api.add_files('src/template-integration.js', 'client'); + api.addFiles('src/template-integration.js', 'client'); }); diff --git a/packages/meteor-accounts-cas/.gitignore b/packages/meteor-accounts-cas/.gitignore deleted file mode 100644 index bed7713fa..000000000 --- a/packages/meteor-accounts-cas/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.build* -node_modules/ diff --git a/packages/meteor-accounts-cas/LICENSE b/packages/meteor-accounts-cas/LICENSE deleted file mode 100644 index c2d691582..000000000 --- a/packages/meteor-accounts-cas/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2019 The Wekan Team - -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. diff --git a/packages/meteor-accounts-cas/README.md b/packages/meteor-accounts-cas/README.md deleted file mode 100644 index 3e246c4f1..000000000 --- a/packages/meteor-accounts-cas/README.md +++ /dev/null @@ -1,88 +0,0 @@ -This is a merged repository of useful forks of: atoy40:accounts-cas -=================== -([(https://atmospherejs.com/atoy40/accounts-cas](https://atmospherejs.com/atoy40/accounts-cas)) - -## Essential improvements by ppoulard to atoy40 and xaionaro versions - -* Added support of CAS attributes - -With this plugin, you can pick CAS attributes : https://github.com/joshchan/node-cas/wiki/CAS-Attributes - -Moved to Wekan GitHub org from from https://github.com/ppoulard/meteor-accounts-cas - -## Install - -``` -cd ~site -mkdir packages -cd packages -git clone https://github.com/wekan/meteor-accounts-cas -cd ~site -meteor add wekan:accounts-cas -``` - -## Usage - -Put CAS settings in Meteor.settings (for example using METEOR_SETTINGS env or --settings) like so: - -If casVersion is not defined, it will assume you use CAS 1.0. (note by xaionaro: option `casVersion` seems to be just ignored in the code, ATM). - -Server side settings: - -``` -Meteor.settings = { - "cas": { - "baseUrl": "https://cas.example.com/cas", - "autoClose": true, - "validateUrl":"https://cas.example.com/cas/p3/serviceValidate", - "casVersion": 3.0, - "attributes": { - "debug" : true - } - }, -} -``` - -CAS `attributes` settings : - -* `attributes`: by default `{}` : all default values below will apply -* * `debug` : by default `false` ; `true` will print to the server console the CAS attribute names to map, the CAS attributes values retrieved, if necessary the new user account created, and finally the user to use -* * `id` : by default, the CAS user is used for the user account, but you can specified another CAS attribute -* * `firstname` : by default `cas:givenName` ; but you can use your own CAS attribute -* * `lastname` : by default `cas:sn` (respectively) ; but you can use your own CAS attribute -* * `fullname` : by default unused, but if you specify your own CAS attribute, it will be used instead of the `firstname` + `lastname` -* * `mail` : by default `cas:mail` - -Client side settings: - -``` -Meteor.settings = { - "public": { - "cas": { - "loginUrl": "https://cas.example.com/login", - "serviceParam": "service", - "popupWidth": 810, - "popupHeight": 610, - "popup": true, - } - } -} -``` - -`proxyUrl` is not required. Setup [ROOT_URL](http://docs.meteor.com/api/core.html#Meteor-absoluteUrl) environment variable instead. - -Then, to start authentication, you have to call the following method from the client (for example in a click handler) : - -``` -Meteor.loginWithCas([callback]); -``` - -It must open a popup containing you CAS login form or redirect to the CAS login form (depending on "popup" setting). - -If popup is disabled (== false), then it's required to execute `Meteor.initCas([callback])` in `Meteor.startup` of the client side. ATM, `Meteor.initCas()` completes authentication. - -## Examples - -* [https://devel.mephi.ru/dyokunev/start-mephi-ru](https://devel.mephi.ru/dyokunev/start-mephi-ru) - - diff --git a/packages/meteor-accounts-cas/cas_client.js b/packages/meteor-accounts-cas/cas_client.js deleted file mode 100644 index ca9288ae2..000000000 --- a/packages/meteor-accounts-cas/cas_client.js +++ /dev/null @@ -1,117 +0,0 @@ - -function addParameterToURL(url, param){ - var urlSplit = url.split('?'); - return url+(urlSplit.length>0 ? '?':'&') + param; -} - -Meteor.initCas = function(callback) { - const casTokenMatch = window.location.href.match(/[?&]casToken=([^&]+)/); - if (casTokenMatch == null) { - return; - } - - window.history.pushState('', document.title, window.location.href.replace(/([&?])casToken=[^&]+[&]?/, '$1').replace(/[?&]+$/g, '')); - - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: casTokenMatch[1] } }], - userCallback: function(err){ - if (err == null) { - // should we do anything on success? - } - if (callback != null) { - callback(err); - } - } - }); -} - -Meteor.loginWithCas = function(options, callback) { - - var credentialToken = Random.id(); - - if (!Meteor.settings.public && - !Meteor.settings.public.cas && - !Meteor.settings.public.cas.loginUrl) { - return; - } - - var settings = Meteor.settings.public.cas; - - var backURL = window.location.href.replace('#', ''); - if (options != null && options.redirectUrl != null) - backURL = options.redirectUrl; - - var serviceURL = addParameterToURL(backURL, 'casToken='+credentialToken); - - var loginUrl = settings.loginUrl + - "?" + (settings.serviceParam || "service") + "=" + - encodeURIComponent(serviceURL) - - if (settings.popup == false) { - window.location = loginUrl; - return; - } - - var popup = openCenteredPopup( - loginUrl, - settings.width || 800, - settings.height || 600 - ); - - var checkPopupOpen = setInterval(function() { - try { - if(popup && popup.document && popup.document.getElementById('popupCanBeClosed')) { - popup.close(); - } - // Fix for #328 - added a second test criteria (popup.closed === undefined) - // to humour this Android quirk: - // http://code.google.com/p/android/issues/detail?id=21061 - var popupClosed = popup.closed || popup.closed === undefined; - } catch (e) { - // For some unknown reason, IE9 (and others?) sometimes (when - // the popup closes too quickly?) throws "SCRIPT16386: No such - // interface supported" when trying to read 'popup.closed'. Try - // again in 100ms. - return; - } - - if (popupClosed) { - clearInterval(checkPopupOpen); - - // check auth on server. - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: credentialToken } }], - userCallback: err => { - // Fix redirect bug after login successfully - if (!err) { - window.location.href = '/'; - } - } - }); - } - }, 100); -}; - -var openCenteredPopup = function(url, width, height) { - var screenX = typeof window.screenX !== 'undefined' - ? window.screenX : window.screenLeft; - var screenY = typeof window.screenY !== 'undefined' - ? window.screenY : window.screenTop; - var outerWidth = typeof window.outerWidth !== 'undefined' - ? window.outerWidth : document.body.clientWidth; - var outerHeight = typeof window.outerHeight !== 'undefined' - ? window.outerHeight : (document.body.clientHeight - 22); - // XXX what is the 22? - - // Use `outerWidth - width` and `outerHeight - height` for help in - // positioning the popup centered relative to the current window - var left = screenX + (outerWidth - width) / 2; - var top = screenY + (outerHeight - height) / 2; - var features = ('width=' + width + ',height=' + height + - ',left=' + left + ',top=' + top + ',scrollbars=yes'); - - var newwindow = window.open(url, '_blank', features); - if (newwindow.focus) - newwindow.focus(); - return newwindow; -}; diff --git a/packages/meteor-accounts-cas/cas_client_cordova.js b/packages/meteor-accounts-cas/cas_client_cordova.js deleted file mode 100644 index c7f95b500..000000000 --- a/packages/meteor-accounts-cas/cas_client_cordova.js +++ /dev/null @@ -1,71 +0,0 @@ - -Meteor.loginWithCas = function(callback) { - - var credentialToken = Random.id(); - - if (!Meteor.settings.public && - !Meteor.settings.public.cas && - !Meteor.settings.public.cas.loginUrl) { - return; - } - - var settings = Meteor.settings.public.cas; - - var loginUrl = settings.loginUrl + - "?" + (settings.service || "service") + "=" + - Meteor.absoluteUrl('_cas/') + - credentialToken; - - - var fail = function (err) { - Meteor._debug("Error from OAuth popup: " + JSON.stringify(err)); - }; - - // When running on an android device, we sometimes see the - // `pageLoaded` callback fire twice for the final page in the OAuth - // popup, even though the page only loads once. This is maybe an - // Android bug or maybe something intentional about how onPageFinished - // works that we don't understand and isn't well-documented. - var oauthFinished = false; - - var pageLoaded = function (event) { - if (oauthFinished) { - return; - } - - if (event.url.indexOf(Meteor.absoluteUrl('_cas')) === 0) { - - oauthFinished = true; - - // On iOS, this seems to prevent "Warning: Attempt to dismiss from - // view controller while a presentation - // or dismiss is in progress". My guess is that the last - // navigation of the OAuth popup is still in progress while we try - // to close the popup. See - // https://issues.apache.org/jira/browse/CB-2285. - // - // XXX Can we make this timeout smaller? - setTimeout(function () { - popup.close(); - // check auth on server. - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: credentialToken } }], - userCallback: callback - }); - }, 100); - } - }; - - var onExit = function () { - popup.removeEventListener('loadstop', pageLoaded); - popup.removeEventListener('loaderror', fail); - popup.removeEventListener('exit', onExit); - }; - - var popup = window.open(loginUrl, '_blank', 'location=no,hidden=no'); - popup.addEventListener('loadstop', pageLoaded); - popup.addEventListener('loaderror', fail); - popup.addEventListener('exit', onExit); - popup.show(); - -}; \ No newline at end of file diff --git a/packages/meteor-accounts-cas/cas_server.js b/packages/meteor-accounts-cas/cas_server.js deleted file mode 100644 index 2e8edef2c..000000000 --- a/packages/meteor-accounts-cas/cas_server.js +++ /dev/null @@ -1,304 +0,0 @@ -"use strict"; - -const Fiber = Npm.require('fibers'); -const https = Npm.require('https'); -const url = Npm.require('url'); -const xmlParser = Npm.require('xml2js'); - -// Library -class CAS { - constructor(options) { - options = options || {}; - - if (!options.validate_url) { - throw new Error('Required CAS option `validateUrl` missing.'); - } - - if (!options.service) { - throw new Error('Required CAS option `service` missing.'); - } - - const cas_url = url.parse(options.validate_url); - if (cas_url.protocol != 'https:' ) { - throw new Error('Only https CAS servers are supported.'); - } else if (!cas_url.hostname) { - throw new Error('Option `validateUrl` must be a valid url like: https://example.com/cas/serviceValidate'); - } else { - this.hostname = cas_url.host; - this.port = 443;// Should be 443 for https - this.validate_path = cas_url.pathname; - } - - this.service = options.service; - } - - validate(ticket, callback) { - const httparams = { - host: this.hostname, - port: this.port, - path: url.format({ - pathname: this.validate_path, - query: {ticket: ticket, service: this.service}, - }), - }; - - https.get(httparams, (res) => { - res.on('error', (e) => { - console.log('error' + e); - callback(e); - }); - - // Read result - res.setEncoding('utf8'); - let response = ''; - res.on('data', (chunk) => { - response += chunk; - }); - - res.on('end', (error) => { - if (error) { - console.log('error callback'); - console.log(error); - callback(undefined, false); - } else { - xmlParser.parseString(response, (err, result) => { - if (err) { - console.log('Bad response format.'); - callback({message: 'Bad response format. XML could not parse it'}); - } else { - if (result['cas:serviceResponse'] == null) { - console.log('Empty response.'); - callback({message: 'Empty response.'}); - } - if (result['cas:serviceResponse']['cas:authenticationSuccess']) { - const userData = { - id: result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:user'][0].toLowerCase(), - }; - const attributes = result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:attributes'][0]; - - // Check allowed ldap groups if exist (array only) - // example cas settings : "allowedLdapGroups" : ["wekan", "admin"], - let findedGroup = false; - const allowedLdapGroups = Meteor.settings.cas.allowedLdapGroups || false; - for (const fieldName in attributes) { - if (allowedLdapGroups && fieldName === 'cas:memberOf') { - for (const groups in attributes[fieldName]) { - const str = attributes[fieldName][groups]; - if (!Array.isArray(allowedLdapGroups)) { - callback({message: 'Settings "allowedLdapGroups" must be an array'}); - } - for (const allowedLdapGroup in allowedLdapGroups) { - if (str.search(`cn=${allowedLdapGroups[allowedLdapGroup]}`) >= 0) { - findedGroup = true; - } - } - } - } - userData[fieldName] = attributes[fieldName][0]; - } - - if (allowedLdapGroups && !findedGroup) { - callback({message: 'Group not finded.'}, false); - } else { - callback(undefined, true, userData); - } - } else { - callback(undefined, false); - } - } - }); - } - }); - }); - } -} -////// END OF CAS MODULE - -let _casCredentialTokens = {}; -let _userData = {}; - -//RoutePolicy.declare('/_cas/', 'network'); - -// Listen to incoming OAuth http requests -WebApp.connectHandlers.use((req, res, next) => { - // Need to create a Fiber since we're using synchronous http calls and nothing - // else is wrapping this in a fiber automatically - - Fiber(() => { - middleware(req, res, next); - }).run(); -}); - -const middleware = (req, res, next) => { - // Make sure to catch any exceptions because otherwise we'd crash - // the runner - try { - urlParsed = url.parse(req.url, true); - - // Getting the ticket (if it's defined in GET-params) - // If no ticket, then request will continue down the default - // middlewares. - const query = urlParsed.query; - if (query == null) { - next(); - return; - } - const ticket = query.ticket; - if (ticket == null) { - next(); - return; - } - - const serviceUrl = Meteor.absoluteUrl(urlParsed.href.replace(/^\//g, '')).replace(/([&?])ticket=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); - const redirectUrl = serviceUrl;//.replace(/([&?])casToken=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); - - // get auth token - const credentialToken = query.casToken; - if (!credentialToken) { - end(res, redirectUrl); - return; - } - - // validate ticket - casValidate(req, ticket, credentialToken, serviceUrl, () => { - end(res, redirectUrl); - }); - - } catch (err) { - console.log("account-cas: unexpected error : " + err.message); - end(res, redirectUrl); - } -}; - -const casValidate = (req, ticket, token, service, callback) => { - // get configuration - if (!Meteor.settings.cas/* || !Meteor.settings.cas.validate*/) { - throw new Error('accounts-cas: unable to get configuration.'); - } - - const cas = new CAS({ - validate_url: Meteor.settings.cas.validateUrl, - service: service, - version: Meteor.settings.cas.casVersion - }); - - cas.validate(ticket, (err, status, userData) => { - if (err) { - console.log("accounts-cas: error when trying to validate " + err); - console.log(err); - } else { - if (status) { - console.log(`accounts-cas: user validated ${userData.id} - (${JSON.stringify(userData)})`); - _casCredentialTokens[token] = { id: userData.id }; - _userData = userData; - } else { - console.log("accounts-cas: unable to validate " + ticket); - } - } - callback(); - }); - - return; -}; - -/* - * Register a server-side login handle. - * It is call after Accounts.callLoginMethod() is call from client. - */ - Accounts.registerLoginHandler((options) => { - if (!options.cas) - return undefined; - - if (!_hasCredential(options.cas.credentialToken)) { - throw new Meteor.Error(Accounts.LoginCancelledError.numericError, - 'no matching login attempt found'); - } - - const result = _retrieveCredential(options.cas.credentialToken); - - const attrs = Meteor.settings.cas.attributes || {}; - // CAS keys - const fn = attrs.firstname || 'cas:givenName'; - const ln = attrs.lastname || 'cas:sn'; - const full = attrs.fullname; - const mail = attrs.mail || 'cas:mail'; // or 'email' - const uid = attrs.id || 'id'; - if (attrs.debug) { - if (full) { - console.log(`CAS fields : id:"${uid}", fullname:"${full}", mail:"${mail}"`); - } else { - console.log(`CAS fields : id:"${uid}", firstname:"${fn}", lastname:"${ln}", mail:"${mail}"`); - } - } - const name = full ? _userData[full] : _userData[fn] + ' ' + _userData[ln]; - // https://docs.meteor.com/api/accounts.html#Meteor-users - options = { - // _id: Meteor.userId() - username: _userData[uid], // Unique name - emails: [ - { address: _userData[mail], verified: true } - ], - createdAt: new Date(), - profile: { - // The profile is writable by the user by default. - name: name, - fullname : name, - email : _userData[mail] - }, - active: true, - globalRoles: ['user'] - }; - if (attrs.debug) { - console.log(`CAS response : ${JSON.stringify(result)}`); - } - let user = Meteor.users.findOne({ 'username': options.username }); - if (! user) { - if (attrs.debug) { - console.log(`Creating user account ${JSON.stringify(options)}`); - } - const userId = Accounts.insertUserDoc({}, options); - user = Meteor.users.findOne(userId); - } - if (attrs.debug) { - console.log(`Using user account ${JSON.stringify(user)}`); - } - return { userId: user._id }; -}); - -const _hasCredential = (credentialToken) => { - return _.has(_casCredentialTokens, credentialToken); -} - -/* - * Retrieve token and delete it to avoid replaying it. - */ -const _retrieveCredential = (credentialToken) => { - const result = _casCredentialTokens[credentialToken]; - delete _casCredentialTokens[credentialToken]; - return result; -} - -const closePopup = (res) => { - if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { - return; - } - res.writeHead(200, {'Content-Type': 'text/html'}); - const content = '
'; - res.end(content, 'utf-8'); -} - -const redirect = (res, whereTo) => { - res.writeHead(302, {'Location': whereTo}); - const content = 'Redirection to '+whereTo+''; - res.end(content, 'utf-8'); - return -} - -const end = (res, whereTo) => { - if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { - redirect(res, whereTo); - } else { - closePopup(res); - } -} diff --git a/packages/meteor-accounts-cas/package.js b/packages/meteor-accounts-cas/package.js deleted file mode 100644 index 670fe6872..000000000 --- a/packages/meteor-accounts-cas/package.js +++ /dev/null @@ -1,29 +0,0 @@ -Package.describe({ - summary: "CAS support for accounts", - version: "0.1.0", - name: "wekan:accounts-cas", - git: "https://github.com/wekan/meteor-accounts-cas" -}); - -Package.onUse(function(api) { - api.versionsFrom('METEOR@1.3.5.1'); - api.use('routepolicy', 'server'); - api.use('webapp', 'server'); - api.use('accounts-base', ['client', 'server']); - // Export Accounts (etc) to packages using this one. - api.imply('accounts-base', ['client', 'server']); - api.use('underscore'); - api.add_files('cas_client.js', 'web.browser'); - api.add_files('cas_client_cordova.js', 'web.cordova'); - api.add_files('cas_server.js', 'server'); - -}); - -Npm.depends({ - xml2js: "0.4.17", - cas: "https://github.com/anrizal/node-cas/tarball/2baed530842e7a437f8f71b9346bcac8e84773cc" -}); - -Cordova.depends({ - 'cordova-plugin-inappbrowser': '1.2.0' -}); diff --git a/packages/meteor-useraccounts-core/.editorconfig b/packages/meteor-useraccounts-core/.editorconfig deleted file mode 100644 index 6667b4132..000000000 --- a/packages/meteor-useraccounts-core/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -#.editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true diff --git a/packages/meteor-useraccounts-core/.gitignore b/packages/meteor-useraccounts-core/.gitignore deleted file mode 100644 index 0f1edf505..000000000 --- a/packages/meteor-useraccounts-core/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.build* -versions.json diff --git a/packages/meteor-useraccounts-core/.jshintignore b/packages/meteor-useraccounts-core/.jshintignore deleted file mode 100644 index 810f94661..000000000 --- a/packages/meteor-useraccounts-core/.jshintignore +++ /dev/null @@ -1,2 +0,0 @@ -client/compatibility -packages \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/.jshintrc b/packages/meteor-useraccounts-core/.jshintrc deleted file mode 100644 index 7a0c90b03..000000000 --- a/packages/meteor-useraccounts-core/.jshintrc +++ /dev/null @@ -1,132 +0,0 @@ -//.jshintrc -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : true, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 2, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : true, // true: Requires all functions run in ES5 Strict Mode - "trailing" : true, // true: Prohibit trailing whitespaces - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : 80, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jquery" : false, // jQuery - "mootools" : false, // MooTools - "node" : false, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "rhino" : false, // Rhino - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - //"meteor" : false, // Meteor.js - - // Legacy - "nomen" : false, // true: Prohibit dangling `_` in variables - "onevar" : false, // true: Allow only one `var` statement per function - "passfail" : false, // true: Stop on first error - "white" : false, // true: Check against strict whitespace and indentation rules - - // Custom globals, from http://docs.meteor.com, in the order they appear there - "globals" : { - "Meteor": false, - "DDP": false, - "Mongo": false, //Meteor.Collection renamed to Mongo.Collection - "Session": false, - "Accounts": false, - "Template": false, - "Blaze": false, //UI is being renamed Blaze - "UI": false, - "Match": false, - "check": false, - "Tracker": false, //Deps renamed to Tracker - "Deps": false, - "ReactiveVar": false, - "EJSON": false, - "HTTP": false, - "Email": false, - "Assets": false, - "Handlebars": false, // https://github.com/meteor/meteor/wiki/Handlebars - "Package": false, - - // Meteor internals - "DDPServer": false, - "global": false, - "Log": false, - "MongoInternals": false, - "process": false, - "WebApp": false, - "WebAppInternals": false, - - // globals useful when creating Meteor packages - "Npm": false, - "Tinytest": false, - - // common Meteor packages - "Random": false, - "_": false, // Underscore.js - "$": false, // jQuery - "Router": false // iron-router - } -} diff --git a/packages/meteor-useraccounts-core/.travis.yml b/packages/meteor-useraccounts-core/.travis.yml deleted file mode 100644 index 7846a282e..000000000 --- a/packages/meteor-useraccounts-core/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -sudo: required -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/ejPSng | /bin/sh" -env: - - TEST_COMMAND=meteor diff --git a/packages/meteor-useraccounts-core/Guide.md b/packages/meteor-useraccounts-core/Guide.md deleted file mode 100644 index c84b3f8b3..000000000 --- a/packages/meteor-useraccounts-core/Guide.md +++ /dev/null @@ -1,1433 +0,0 @@ -User Accounts -============= - -User Accounts is a suite of packages for the [Meteor.js](https://www.meteor.com/) platform. It provides highly customizable user accounts UI templates for many different front-end frameworks. At the moment it includes forms for sign in, sign up, forgot password, reset password, change password, enroll account, and link or remove of many 3rd party services. - - -# Documentation - -* [Features](#features) -* [Quick Start](#quickstart) - * [Available Versions](#available-versions) - * [Boilerplates](#boilerplates) - * [Setup](#setup) - * [Routing](#routing) - * [Templates](#templates) -* [Basic Customization](#basic-customization) - * [I18n Support](#i18n) - * [Configuration API](#configuration-api) - * [Options](#options) - * [logout](#logout) - * [Internal States](#internal-states) - * [Content Protection](#content-protection) - * [reCaptcha Setup](#reCaptcha-setup) - * [Detect reactively when a form is being processed](#detect-reactively-when-a-form-is-being-processed) -* [Advanced Customization](#advanced-customization) - * [Configuring Texts](#configuring-texts) - * [Form Title](#form-title) - * [Button Text](#button-text) - * [Social Button Icons](#social-button-icons) - * [Info Text](#info-text) - * [Errors Text](#errors-text) - * [Disabling Client-side Accounts Creation](#disabling-client-side-accounts-creation) - * [Form Fields Configuration](#form-fields-configuration) - * [Extending Templates](#extending-templates) - * [Grouping Fields](#grouping-fields) - * [CSS Rules](#css-rules) -* [Wrapping Up for Famo.us](#wrapping-up-for-famo.us) -* [Side Notes](#side-notes) - * [3rd Party Login Services Configuration](#3rd-party-login-services-configuration) - - - -## Features - -* fully customizable -* security aware -* internationalization support thanks to [accounts-t9n](https://github.com/softwarerero/meteor-accounts-t9n) -* custom sign-up fields -* robust server side sign-up field validation -* easy content protection -* return to previous route after sign-in (even for random sign in choice and not only after required sign-in) -* fully reactive, Blaze fast! -* no use of `Session` object -* very easily stylizable for different font-end frameworks -* ...[wrap it up for famo.us](#wrapping-up-for-famo.us) with a simple meteor line! - - - - -## Quick Start - - - -### Available Versions - -* [useraccounts:bootstrap](https://atmospherejs.com/useraccounts/bootstrap) styled for [Twitter Bootstrap](http://getbootstrap.com/) -* [useraccounts:foundation](https://atmospherejs.com/useraccounts/foundation) styled for [Zurb Foundation](http://foundation.zurb.com/) -* [useraccounts:ionic](https://atmospherejs.com/useraccounts/ionic) styled for [Ionic](http://ionicframework.com/) -* [useraccounts:materialize](https://atmospherejs.com/useraccounts/materialize) styled for [Materialize](http://materializecss.com/) -* [useraccounts:polymer](https://atmospherejs.com/useraccounts/polymer) styled for [Polymer](https://www.polymer-project.org/) (WIP) -* [useraccounts:ratchet](https://atmospherejs.com/useraccounts/ratchet) styled for [Ratchet](http://goratchet.com/) -* [useraccounts:semantic-ui](https://atmospherejs.com/useraccounts/semantic-ui) styled for [Semantic UI](http://semantic-ui.com) -* [useraccounts:unstyled](https://atmospherejs.com/useraccounts/unstyled) with plain html and no CSS rules -* plus others coming soon... - - - -### Boilerplates - -For a very very quick start you can find some boilerplate examples inside [this repository](https://github.com/meteor-useraccounts/boilerplates). - -We'll try to make them richer and richer, while still keeping them as general as possible. - - -### Setup - -Just choose one of the packages among the [available styled versions](#available-versions) and install it: - -```Shell -meteor add useraccounts:bootstrap -meteor add -``` - -**Note 1:** no additional packages nor CSS/LESS/SASS files providing styles are included by useraccounts packages. This is to let you choose your preferred way to include them! - -**Note 2:** You don't have to add `useraccounts:core` to your app! It is automatically added when you add `useraccounts:`... - -Then add at least one login service: - -```Shell -meteor add accounts-password -meteor add accounts-facebook -meteor add accounts-google -... -``` - -**Note**: 3rd party services need to be configured... more about this [here](http://docs.meteor.com/#meteor_loginwithexternalservice) - -And that's it! - -...but don't expect to see much without doing something more ;-) -This is to let you configure your app exactly the way you wish, without imposing anything beforehand! - - - -### Routing - -If you'd like to easily configure specific routes to deal with accounts management, you might be interested to check out -[useraccounts:iron-routing](https://github.com/meteor-useraccounts/iron-routing) and [useraccounts:flow-routing](https://github.com/meteor-useraccounts/flow-routing) packages. -They provide very easy routes set-up via the `AccountsTemplates.configureRoute` method. - - - -### Templates - -There is **only one template** which is used to reactively draw appropriate sign in, sign up, forgot password, reset password, change password, and enroll account forms! - -It is `atForm` and can be used anywhere you wish like this: - -```html -{{> atForm}} -``` - -Its design is as *transparent* as possible, making it play nicely with themes and your CSS customizations! Also, it is not wrapped inside any *container* so that you can put it anywhere, including complex multi-column layouts. - -In case you wish to *lock* the template to a particular state, you can specify that via the `state` parameter: - -```html -{{> atForm state='signUp'}} -``` - -This will prevent the template from changing its content. See [internal states](#internal-states) for more details... - - -Well, actually there is many, used inside `atForm`... - -...plus one another: `atNavButton` which can be used inside navbars to get a basic sign-in sign-out button which changes text and behaviour based on the user status (to get it working you should set up at least a `signIn` route). - - - -## Basic Customization - - - -### I18n Support - -i18n is achieved using [accounts-t9n](https://atmospherejs.com/softwarerero/accounts-t9n). The only thing you have to do is ensure - -```javascript -T9n.setLanguage(''); -``` - -is called somewhere, whenever you want to switch language. - - - -### Configuration API - -There are basically two different ways to interact with AccountsTemplates for basic configuration: - -* AccountsTemplates.configureRoute(route_code, options); -* AccountsTemplates.configure(options); - -**These functions should be called in top-level code, not inside `Meteor.startup()`.** - -There is no specific order for the above calls to be effective, and you can call them more than once, possibly in different files. - -**The only other requirement is to make exactly the same calls on both the server and the client.** The best thing is to put everything inside a file shared between both. I suggest you use something like `lib/config/at_config.js` - - - -#### Options - -By calling `AccountsTemplates.configure(options)` you can specify a bunch of choices regarding both visual appearance and behavior. - -The following is an almost complete example of options configuration (with fields in alphabetical order): - -```javascript -AccountsTemplates.configure({ - // Behavior - confirmPassword: true, - enablePasswordChange: true, - forbidClientAccountCreation: false, - overrideLoginErrors: true, - sendVerificationEmail: false, - lowercaseUsername: false, - focusFirstInput: true, - - // Appearance - showAddRemoveServices: false, - showForgotPasswordLink: false, - showLabels: true, - showPlaceholders: true, - showResendVerificationEmailLink: false, - - // Client-side Validation - continuousValidation: false, - negativeFeedback: false, - negativeValidation: true, - positiveValidation: true, - positiveFeedback: true, - showValidating: true, - - // Privacy Policy and Terms of Use - privacyUrl: 'privacy', - termsUrl: 'terms-of-use', - - // Redirects - homeRoutePath: '/home', - redirectTimeout: 4000, - - // Hooks - onLogoutHook: myLogoutFunc, - onSubmitHook: mySubmitFunc, - preSignUpHook: myPreSubmitFunc, - postSignUpHook: myPostSubmitFunc, - - // Texts - texts: { - button: { - signUp: "Register Now!" - }, - socialSignUp: "Register", - socialIcons: { - "meteor-developer": "fa fa-rocket" - }, - title: { - forgotPwd: "Recover Your Password" - }, - }, -}); -``` - -Details for each of them follow. - -| Option | Type | Default | Description | -| --------------------------- | -------- | --------- | ----------- | -| **Behavior** | | | | -| confirmPassword | Boolean | true | Specifies whether to ask the password twice for confirmation. This has no effect on the sign in form. | -| defaultState | String | "signIn" | Specifies the state to be used initially when atForm is rendered. This is not considered when rendering atForm on configured routes. | -| enablePasswordChange | Boolean | false | Specifies whether to allow to show the form for password change. Note: In case the `changePwd` route is not configured, this is to be done *manually* inside some custom template. | -| enforceEmailVerification | Boolean | false | When set to true together with sendVerificationEmail, forbids user login unless the email address is verified. **Warning: experimental! Use it only if you have accounts-password as the only service!!!** | -| focusFirstInput | Boolean | !Meteor.isCordova | When set to true, asks to autofocus the first input of atForm when the template is rendered. Note: have a look at [this issue](https://github.com/meteor-useraccounts/core/issues/594) in case you're getting problems with cordova apps. | -| forbidClientAccountCreation | Boolean | false | Specifies whether to forbid user registration from the client side. In case it is set to true, neither the link for user registration nor the sign up form will be shown. | -| overrideLoginErrors | Boolean | true | Asks to show a general `Login Forbidden` on a login failure, without specifying whether it was for a wrong email or for a wrong password. | -| sendVerificationEmail | Boolean | false | Specifies whether to send the verification email after successful registration. | -| redirectTimeout | Number | 2000 | Specifies a timeout time for the redirect after successful form submit on `enrollAccount`, `forgotPwd`, `resetPwd`, and `verifyEmail` routes. | -| socialLoginStyle | String | "popup" | Specifies the login style for 3rd party services login. Valid values are `popup` or `redirect`. See `loginStyle` option of [Meteor.loginWith](http://docs.meteor.com/#/full/meteor_loginwithexternalservice) for more information. | -| lowercaseUsername | Boolean | false | Possibly asks to transform `username` field for user objects at registration time to be always in lowercase with no spaces. The original `username` value will be added to the `user.profile` field for later use. | -| **Appearance** | | | | -| hideSignInLink | Boolean | false | When set to true, asks to never show the link to the sign in page | -| hideSignUpLink | Boolean | false | When set to true, asks to never show the link to the sign up page | -| showAddRemoveServices | Boolean | false | Tells whether to show social account buttons also when the user is signed in. In case it is set to true, the text of buttons will change from 'Sign in With XXX' to 'Add XXX' or 'Remove XXX' when the user signs in. 'Add' will be used if that particular service is still not associated with the current account, while 'Remove' is used only in case a particular service is already used by the user **and** there are at least two services available for sign in operations. Clicks on 'Add XXX' trigger the call to `Meteor.loginWithXXX`, as usual, while click on 'Remove XXX' will call the method `ATRemoveService` provided by AccountsTemplates. This means you need to have some additional logic to deal with the call `Meteor.loginWithXXX` in order to actually add the service to the user account. One solution to this is to use the package [accounts-meld](https://atmospherejs.com/package/accounts-meld) which was build exactly for this purpose. | -| showForgotPasswordLink | Boolean | false | Specifies whether to display a link to the forgot password page/form | -| showLabels | Boolean | true | Specifies whether to display text labels above input elements. | -| showPlaceholders | Boolean | true | Specifies whether to display place-holder text inside input elements. | -| showResendVerificationEmailLink | Boolean | false | Specifies whether to display a link to the resend verification email page/form | -| **Texts** | | | | -| texts | Object | | Permits to specify texts to be shown on the atForm for each of its states (see [below](#configuring-texts)). | -| **Client-side Validation** | | | | -| continuousValidation | Boolean | false | Specifies whether to continuously validate fields' value while the user is typing. *It is performed client-side only to save round trips with the server*. | -| negativeValidation | Boolean | false | Specifies whether to highlight input elements in case of negative validation. | -| positiveValidation | Boolean | false | Specifies whether to highlight input elements in case of positive validation. | -| negativeFeedback | Boolean | false | Specifies whether to display negative validation feed-back inside input elements. | -| positiveFeedback | Boolean | false | Specifies whether to display positive validation feed-back inside input elements. | -| showValidating | Boolean | false | Specifies whether to display a loading icon inside input elements while the validation process is in progress. | -| **Links** | | | | -| homeRoutePath | String | '/' | Path for the home route, to be possibly used for redirects after successful form submission. | -| privacyUrl | String | undefined | Path for the route displaying the privacy document. In case it is specified, a link to the page will be displayed at the bottom of the form (when appropriate). | -| termsUrl | String | undefined | Path for the route displaying the document about terms of use. In case it is specified, a link to the page will be displayed at the bottom of the form (when appropriate). | -| **Hooks** | | | | -| onLogoutHook | Function | | Called on `AccountsTemplates.logout` invocation: allows for custom redirects or whatever custom action to be taken on user logout. | -| onSubmitHook | Function | | `func(error, state)` Called when the `pwdForm` is being submitted: allows for custom actions to be taken on form submission. `error` contains possible errors occurred during the submission process, `state` specifies the `atForm` internal state from which the submission was triggered. A nice use case might be closing the modal or side-menu showing `atForm` | -| preSignUpHook | Function | | `func(password, info)` Called just before submitting the `pwdForm` for sign-up: allows for custom actions on the data being submitted. A nice use could be extending the user profile object accessing `info.profile`. to be taken on form submission. The plain text `password` is also provided for any reasonable use. | -| postSignUpHook | Function | | `func(userId, info)` Called, **server side only**, just after a successfull user account creation, post submitting the `pwdForm` for sign-up: allows for custom actions on the data being submitted ___after___ we are sure a new user was ___successfully___ created. A common use might be applying roles to the user, as this is only possible after fully completing user creation in alanning:roles. The `userId` is available as the first parameter, so that user user object may be retrieved. The `password` is not available as it's already encrypted, though the encrypted password may be found in `info` if of use. | - -##### onSubmitHook - -A straightforward configuration about how to detect when a user logs in or registers might look like the following: - -```javascript -var mySubmitFunc = function(error, state){ - if (!error) { - if (state === "signIn") { - // Successfully logged in - // ... - } - if (state === "signUp") { - // Successfully registered - // ... - } - } -}; - -AccountsTemplates.configure({ - onSubmitHook: mySubmitFunc -}); -``` - - -##### AccountsTemplates.logout() - -Should be used in place of `Meteor.logout()`. This function invokes the `onLogoutHook` specified in the optional configuration. -Also note that `AccountsTemplates.logout()` is invoked when logging out using the `atNavButton`. - - -```javascript -//Use in place of Meteor.logout() in your client code. Also called automatically by atNavButton when clicking Sign Off -AccountsTemplates.logout(); - -``` - - -```javascript -var myPostLogout = function(){ - //example redirect after logout - Router.go('/home'); -}; - -AccountsTemplates.configure({ - onLogoutHook: myPostLogout -}); -``` - - -### Internal States - -The `atForm` template changes reactively based on the current internal state of AccountsTemplates. -The current internal state can be queried with `AccountsTemplates.getState()` and set with `AccountsTemplates.setState(new_state)` - - -Currently available states are: - -| Internal State | What's shown | -| ----------------------- | ------------------------------------------------------------------------------------- | -| changePwd | Change password form asking to set a new password | -| enrollAccount | Account Enrollment form asking to set a password | -| forgotPwd | Forgot Password form asking for the email address where to send a reset password link | -| hide | None at all... | -| resendVerificationEmail | Login form with an additional button to get another verification email | -| resetPwd | Reset Password form asking to set a password | -| signIn | Login form | -| signUp | Registration form | -| verifyEmail | Only the result about email verification | - - - - -### Content Protection - - -If you want to secure a specific template, you could add that template like this: - -```handlebars -{{> ensureSignedIn template="myTemplate"}} -``` -and that will render the default `fullPageAtForm` template from your chosen User Accounts templates package (bootstrap, materialize, etc). Once signed in, it'll render `myTemplate` instead of the accounts form. - -If you want to declare a custom sign in template instead of `fullPageAtForm`, you would do this: - -```handlebars -{{> ensureSignedIn template="myTemplate" auth="myLoginForm"}} -``` -That custom auth template just needs to include `{{> atForm}}` somewhere in it. The only reason you'd use this optional feature is if you wanted to modify the layout around the `atForm` template (like -`fullPageAtForm` does). - - -In case you're using one of the routing packages [useraccounts:iron-routing](https://github.com/meteor-useraccounts/iron-routing) -or [useraccounts:flow-routing](https://github.com/meteor-useraccounts/flow-routing) refer to their documentation for more possibilities. - - - -### reCaptcha Setup -To set up [reCaptcha](https://www.google.com/recaptcha/intro/index.html), you need to first obtain API keys. - -Then, a recommended setup is as follows. - -A [Meteor settings file](http://docs.meteor.com/#/full/meteor_settings) with the keys: - -```javascript -{ - "public": { - "reCaptcha": { - "siteKey": YOUR SITE KEY - } - }, - "reCaptcha": { - "secretKey": YOUR SECRET KEY - } -} -``` - -and configuration to show the reCaptcha widget: - -```javascript -AccountsTemplates.configure({ - showReCaptcha: true -}); -``` - -The reCaptcha plugin can likewise be set up with the following complete example: - - -```javascript -AccountsTemplates.configure({ - reCaptcha: { - siteKey: YOUR SITE KEY, - theme: "light", - data_type: "image" - }, - showReCaptcha: true -}); -``` - -And, in a separate file in the `/server` folder: - -```javascript -AccountsTemplates.configure({ - reCaptcha: { - secretKey: YOUR SECRET KEY. - }, -}); -``` - -Each option is described below: - -| Option | Type | Default | Description | -| --------------------------- | -------- | --------- | ----------- | -| siteKey | String | none | The site key needed to create the reCaptcha widget. This can be specified in just the Meteor settings file. | -| secretKey | String | none | The secret key needed to verify the reCaptcha response. ***Warning: Only set this in a file in `/server` or in a Meteor settings file. Otherwise, your private key can be read by anyone!*** | -| theme | String | "light" | Sets the reCaptcha theme color. The options are "light" and "dark". | -| data_type | String | "image" | Sets the verification method. Options are "image" or "audio". | -| showReCaptcha | Boolean | false | Whether to show the reCaptcha widget on sign in or not. No reCaptcha validation will occur if set to false. | - - -### Detect reactively when a form is being processed - -`AccountsTemplates.disabled()` returns `true` when a submitted form is being processed and `false` once the submission process has been completed (successfully or not). `AccountsTemplate.disabled()` is reactive and can be used to trigger UI events, such as spinners, "Please wait" messages or to disable input elements, while the form is being processed. The function works irrespectively of form status (signIn, signUp, pwdReset etc.). A typical use-case would be in a template helper: - -```html - -``` - -```js -Template.myLogin.helpers({ - atDisabled: function() { - return AccountsTemplates.disabled(); - }, - atClass: function() { - return AccountsTemplates.disabled() ? 'disabled' : 'active'; - } -}); -``` - - -## Advanced Customization - - - -### Configuring Texts - -In case you wish to change texts on atForm, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - navSignIn: "signIn", - navSignOut: "signOut", - optionalField: "optional", - pwdLink_pre: "", - pwdLink_link: "forgotPassword", - pwdLink_suff: "", - resendVerificationEmailLink_pre: "Verification email lost?", - resendVerificationEmailLink_link: "Send again", - resendVerificationEmailLink_suff: "", - sep: "OR", - signInLink_pre: "ifYouAlreadyHaveAnAccount", - signInLink_link: "signin", - signInLink_suff: "", - signUpLink_pre: "dontHaveAnAccount", - signUpLink_link: "signUp", - signUpLink_suff: "", - socialAdd: "add", - socialConfigure: "configure", - socialIcons: { - "meteor-developer": "fa fa-rocket", - }, - socialRemove: "remove", - socialSignIn: "signIn", - socialSignUp: "signUp", - socialWith: "with", - termsPreamble: "clickAgree", - termsPrivacy: "privacyPolicy", - termsAnd: "and", - termsTerms: "terms", - } -}); -``` - -the above example asks to change some of the available text configurations. You can specify only a subsets of them leaving default values unchanged. -To learn how to change title, button, social buttons' icon, info, and errors text read below. - - - -#### Form Title - -In case you wish to change form titles, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - title: { - changePwd: "Password Title", - enrollAccount: "Enroll Title", - forgotPwd: "Forgot Pwd Title", - resetPwd: "Reset Pwd Title", - signIn: "Sign In Title", - signUp: "Sign Up Title", - verifyEmail: "Verify Email Title", - } - } -}); -``` - -the above example asks to change the title for all possible form states, but you can specify only a subset of them leaving default values unchanged. - -You can also *hide* a title by setting it to an empty string. For example with: - -``` -AccountsTemplates.configure({ - texts: { - title: { - signIn: "", - } - } -}); -``` - -no title will be shown on the sign in form. - - - -#### Button Text - -In case you wish to change the text appearing inside the submission button, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - button: { - changePwd: "Password Text", - enrollAccount: "Enroll Text", - forgotPwd: "Forgot Pwd Text", - resetPwd: "Reset Pwd Text", - signIn: "Sign In Text", - signUp: "Sign Up Text", - } - } -}); -``` - -the above example asks to change the button text for all possible form states, but you can specify only a subset of them leaving default values unchanged. - - -#### Social Button Icons - -In case you wish to change the icon appearing on the left of social login buttons, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - socialIcons: { - google: "myGoogleIcon", - "meteor-developer": "myMeteorIcon", - } - } -}); -``` - -to specify a different icon classes to be used for services. By default the icon class is set to `fa fa-*service*`, -but for the "meteor-developer" service for which `fa fa-rocket` is used. An exception is made for `useaccounts:semantic-ui` -which sets them simply to `*service*`, which is the correct way to go. - - -#### Info Text - -In case you wish to change the info text appearing inside the results box, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - info: { - emailSent: "info.emailSent", - emailVerified: "info.emailVerified", - pwdChanged: "info.passwordChanged", - pwdReset: "info.passwordReset", - pwdSet: "info.passwordReset", - signUpVerifyEmail: "Successful Registration! Please check your email and follow the instructions.", - verificationEmailSent: "A new email has been sent to you. If the email doesn't show up in your inbox, be sure to check your spam folder.", - } - } -}); -``` - -The above calls simply set all values as the current default ones. - - -#### Input Field Icons - -In case you wish to change the icon appearing on the right side of input fields to show their validation status, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - inputIcons: { - isValidating: "fa fa-spinner fa-spin", - hasSuccess: "fa fa-check", - hasError: "fa fa-times", - } - } -}); -``` - - -#### Errors Text - -In case you wish to change the text for errors appearing inside the error box, you can call: - -```javascript -AccountsTemplates.configure({ - texts: { - errors: { - accountsCreationDisabled: "Client side accounts creation is disabled!!!", - cannotRemoveService: "Cannot remove the only active service!", - captchaVerification: "Captcha verification failed!", - loginForbidden: "error.accounts.Login forbidden", - mustBeLoggedIn: "error.accounts.Must be logged in", - pwdMismatch: "error.pwdsDontMatch", - validationErrors: "Validation Errors", - verifyEmailFirst: "Please verify your email first. Check the email and follow the link!", - } - } -}); -``` - -The above calls simply set all values as the current default ones. -*Note:* The above list of errors refers to those set directly by AccountsTemplates only! -Errors which comes from the Accounts packages cannot be overwritten (at least not easily...) -Please have a look at [Form Fields Configuration](#form-fields-configuration) to learn how to set validation errors on a field basis. - - - -### Disabling Client-side Accounts Creation - -AccountsTemplates disables by default accounts creation on the client. This is done to use a dedicated method called `ATCreateUserServer` **(sending the password on the wire already hashed as usual...)** to create the new users server-side. -This way a bulletproof profile fields full validation can be performed. -But there is one more parameter to set in case you'd like to forbid client-side accounts creation, which is the following: - -* `forbidClientAccountCreation` - (Boolean, default false) Specifies whether to forbid accounts creation from the client. - -it is exactly the same provided by the Accounts object, so this means you need to do: - -```javascript -AccountsTemplates.configure({ - forbidClientAccountCreation: true -}); -``` - -instead of the usual: - -```javascript -Accounts.config({ - forbidClientAccountCreation : true -}); -``` - - - -### Form Fields Configuration - -Every input field appearing inside AccountsTemplates forms can be easily customized both for appearance and validation behaviour. Additional (custom) fields can be added to the sign up and registration forms, and the properties of built-in fields, like `email` and `password` can be overridden (see [Remove fields](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#remove-fields)) - -Each field object is represented by the following properties: - -| Property | Type | Required | Description | -| -------------------- | -----------------|:--------:| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| _id | String | X | A unique field's id/name (internal use only) to be also used as attribute name into `Meteor.user().profile` in case it identifies an additional sign up field. Usually all lowercase letters. | -| type | String | X | Specifies the input element type. At the moment supported inputs are: `password`, `email`, `text`, `tel`, `url`, `checkbox`, `select`, `radio`, `hidden`. | -| required | Boolean | | When set to true the corresponding field cannot be left blank | -| displayName | String or Object | | The field name to be shown as text label above the input element. In case nothing is specified, the capitalized `_id` is used. The text label is shown only if `showLabels` options is set to true. | -| placeholder | String or Object | | The placeholder text to be shown inside the input element. In case nothing is specified, the capitalized `_id` will be used. The place-holder is shown only if `showPlaceholders` option is set to true. | -| select | [Object] | | Lets you specify an array of choices to be displayed for select and radio inputs. See example below. | -| minLength | Integer | | If specified, requires the content of the field to be at least `minLength` characters. | -| maxLength | Integer | | If specified, require the content of the field to be at most `maxLength` characters. | -| re | RegExp | | Possibly specifies the regular expression to be used for the field's content validation. Validation is performed both client-side (at every input change if `continuousValidation` option is set to true) and server-side on form submit. | -| func | Function | | Custom function to be used for validation. | -| errStr | String | | Error message to be displayed in case re or func validation fail. | -| trim | Boolean | | Trim the input value. | -| lowercase | Boolean | | Convert the input value to lowercase. | -| uppercase | Boolean | | Convert the input value to uppercase. | -| transform | Function | | Custom function to transform the input value. | -| continuousValidation | Boolean | | Continuously validate fields' value while the user is typing. *It is performed client-side only to save round trips with the server*. | -| negativeValidation | Boolean | | Highlight input elements in case of negative validation. | -| positiveValidation | Boolean | | Highlight input elements in case of positive validation. | -| negativeFeedback | Boolean | | Display negative validation feedback inside input elements. | -| positiveFeedback | Boolean | | Display positive validation feedback inside input elements. | -| showValidating | Boolean | | Display a loading icon inside input elements while the validation process is in progress. | -| options | Object | | Allows to pass in additional custom options to be possibly used to extend input templates (see [Extending Templates](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#extending-templates)) | -| template | String | | The name of a custom template to be used in place of the default one. | - - -`displayName`, `placeholder`, and `errStr` can also be an [accounts-t9n](https://atmospherejs.com/softwarerero/accounts-t9n) registered key, in which case it will be translated based on the currently selected language. -In case you'd like to specify a key which is not already provided by accounts-t9n you can always map your own keys. To learn how to register new labels, please refer to the official [documentation](https://github.com/softwarerero/meteor-accounts-t9n#define-translations). - -`continuousValidation`, `negativeFeedback`, `negativeValidation`, `positiveValidation`, `positiveFeedback`, `showValidating` can be used to override global settings (see [Form Fields Configuration](#form-fields-configuration)) on a per field basis. - -Furthermore, you can pass an object for `displayName`, `placeholder` to specify different texts for different form states. The matched pattern is: - -```javascript -{ - default: Match.Optional(String), - changePwd: Match.Optional(String), - enrollAccount: Match.Optional(String), - forgotPwd: Match.Optional(String), - resetPwd: Match.Optional(String), - signIn: Match.Optional(String), - signUp: Match.Optional(String), -} -``` - -which permits to specify a different text for each different state, or a default value to be used for states which are not explicitly provided. For example: - -```javascript -AccountsTemplates.addField({ - _id: 'password', - type: 'password', - placeholder: { - signUp: "At least six characters" - }, - required: true, - minLength: 6, - re: /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/, - errStr: 'At least 1 digit, 1 lowercase and 1 uppercase', -}); -``` - -asks AccountsTemplates to display "At least six characters" as the placeholder for the password field when the sign up form is display, and to display "Password" (the capitalized *_id*_) in any other case. - -##### Custom validation -Custom validation can be achieved by providing a regular expression or a function. In case you go for the function solution, this: - -```javascript -AccountsTemplates.addField({ - _id: 'name', - type: 'text', - displayName: "Name", - func: function(value){return value !== 'Full Name';}, - errStr: 'Only "Full Name" allowed!', -}); -``` - -will require the name input to be exactly "Full Name" (though this might not be that interesting...). -If instead you do something along the following line: - -```javascript -AccountsTemplates.addField({ - _id: 'phone', - type: 'tel', - displayName: "Phone", - required: true, - func: function (number) { - if (Meteor.isServer){ - if (isValidPhone(number)) - return false; // meaning no error! - return true; // Validation error! - } - }, - errStr: 'Invalid Phone number!', -}); -``` - -supposing `isValidPhone` is available only server-side, you will be validating the field only server-side, on form submission. - -If, differently, you do something like this: - -```javascript -if (Meteor.isServer){ - Meteor.methods({ - "userExists": function(username){ - return !!Meteor.users.findOne({username: username}); - }, - }); -} - -AccountsTemplates.addField({ - _id: 'username', - type: 'text', - required: true, - func: function(value){ - if (Meteor.isClient) { - console.log("Validating username..."); - var self = this; - Meteor.call("userExists", value, function(err, userExists){ - if (!userExists) - self.setSuccess(); - else - self.setError(userExists); - self.setValidating(false); - }); - return; - } - // Server - return Meteor.call("userExists", value); - }, -}); -``` - -you can achieve also client-side and server-side validation calling a server method -During the waiting time a loading icon will be displayed (if you configure `showValidating` to be true). -To configure the loading icon see [Input Field Icons](#input-icons). - -*Note:* `field.setError(err)`, `field.setSuccess()`, and `field.setValidating()` are methods used to deal with inputs' validation states. A `null` value means non-validated, `false` means correctly validated, no error, and any other value evaluated as true (usually strings specifying the reason for the validation error), are finally interpreted as error and displayed where more appropriate. - -#### Checkboxes, Selects, Radios, and Hidden - -This is an example about how to add Checkboxes, Selects, and Radios to the sign up fields: - -```javascript -AccountsTemplates.addField({ - _id: "gender", - type: "select", - displayName: "Gender", - select: [ - { - text: "Male", - value: "male", - }, - { - text: "Female", - value: "female", - }, - ], -}); - -AccountsTemplates.addField({ - _id: "fruit", - type: "radio", - displayName: "Preferred Fruit", - select: [ - { - text: "Apple", - value: "aa", - }, { - text: "Banana", - value: "bb", - }, { - text: "Carrot", - value: "cc", - }, - ], -}); - -AccountsTemplates.addField({ - _id: "mailing_list", - type: "checkbox", - displayName: "Subscribe me to mailing List", -}); - -AccountsTemplates.addField({ - _id: 'reg_code', - type: 'hidden' -}); -``` - -please note the `select` list which lets you specify the values for the choice. -The `value` value of corresponding selected `text` will be picked up and added into the `profile` field of the user object. - -Hidden inputs might be of help in case you want to consider to link to your registration page from around the web (emails, ads, discount campaigns, etc...) with links like this: - -``` -http://my.splendido.site/sign-up?email=giorgio@example.com®_code=123 -``` - -exploiting the ability of AccountsTemplates to pick-up query parameters having the same key as field ids, this would permit to get `reg_code: "123"` under the `profile` field of the user object. -**Please use this with caution!** ..never ever do something like: -``` -http://my.splendido.site/sign-up?role=admin -``` -and then set the role of the new user based on the hidden `role` field. I guess you can appreciate the security hole there ;-) - -#### Special Field's Ids - -There are a number of special ids used for basic input fields. These are: - -* current_password -* email -* password -* password_again -* username -* username_and_email - -Any other id will be interpreted as an additional sign up field. -In case a special field is not explicitly added, it will be automatically inserted at initialization time (with appropriate default properties). To customize special fields see [Remove fields](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#remove-fields) - -#### Add a field - -You can use `AccountsTemplates.addField(options)` to configure an input field. This apply for both special fields and custom ones. -For example you can do: - -```javascript -AccountsTemplates.addField({ - _id: 'phone', - type: 'tel', - displayName: "Landline Number", -}); -``` - -The above snippet asks `AccountsTemplates` to draw an additional input element within the sign-up form. - -#### Add many fields at once - -Another possibility is to add many additional fields at once using `addFields`: - -```javascript -AccountsTemplates.addFields([ - { - _id: 'phone', - type: 'tel', - displayName: "Landline Number", - }, - { - _id: 'fax', - type: 'tel', - displayName: "Fax Number", - } -]); -``` - -#### Remove fields - -There is also a `removeField` method which can be used to remove predefined required fields and adding them again specify different options. - -```javascript -AccountsTemplates.removeField('password'); -AccountsTemplates.addField({ - _id: 'password', - type: 'password', - required: true, - minLength: 6, - re: /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/, - errStr: 'At least 1 digit, 1 lower-case and 1 upper-case', -}); -``` - -#### Login with Username or Email - -In order to let the user register with both a `username` and an `email` address and let him the possibility to log in using one of them, both the `username` and `email` fields must be added. -This is an example about how to configure such a behaviour: - -```javascript -var pwd = AccountsTemplates.removeField('password'); -AccountsTemplates.removeField('email'); -AccountsTemplates.addFields([ - { - _id: "username", - type: "text", - displayName: "username", - required: true, - minLength: 5, - }, - { - _id: 'email', - type: 'email', - required: true, - displayName: "email", - re: /.+@(.+){2,}\.(.+){2,}/, - errStr: 'Invalid email', - }, - pwd -]); -``` - -This will trigger the automatic insertion of the special field `username_and_email` to be used for the sign in form. -If you wish to further customize the `username_and_email` field you can add it together with the other two: - -```javascript -var pwd = AccountsTemplates.removeField('password'); -AccountsTemplates.removeField('email'); -AccountsTemplates.addFields([ - { - _id: "username", - type: "text", - displayName: "username", - required: true, - minLength: 5, - }, - { - _id: 'email', - type: 'email', - required: true, - displayName: "email", - re: /.+@(.+){2,}\.(.+){2,}/, - errStr: 'Invalid email', - }, - { - _id: 'username_and_email', - type: 'text', - required: true, - displayName: "Login", - }, - pwd -]); -``` - - - -### Extending Templates - -With the [aldeed:template-extension](https://github.com/aldeed/meteor-template-extension) package, the built-in templates or sub-templates of any `user-accounts` UI package may be replaced by custom templates. The purpose is to create more sophisticated or specialized layouts or styling. - -In case of input fields the option `template` (see [Form Fields Configuration](#form-fields-configuration)) can be directly used without the need to rely on `aldeed:template-extension` package. - -Here is a simple example of a template you can use for a field of type 'select': - -```html - -``` - -Custom properties that hold information about the look of the form may be attached to the `options` object of a field. It may then be used to change the output while looping the fields. Adding a divider might look like this: - -```javascript -AccountsTemplates.addField({ - _id: "address", - type: "text", - - // Options object with custom properties for my layout. At the moment, there are - // no special properties; it is up the developer to invent them - options: { - // Put a divider before this field - dividerBefore: true - } -}); -``` - -```html - -``` - -```javascript -Template.appAtInput.replaces("atInput"); -``` - - - -#### Grouping fields - -Grouping fields together is a special problem in regard to layout. The issue is creating some container markup *while* iterating over the fields (the templating engine of Meteor doesn't allow outputting an opening tag inside a loop without closing it in the same iteration). - -A solution to the problem is demonstrated in [this gist](https://gist.github.com/dalgard/a844f6569d8f471db9a7) (Semantic UI version). - - - -### CSS Rules - -The main atForm is build up of several pieces, appearing and disappearing based on configuration options as well as the current internal status. -Each of these blocks is wrapped inside a `div` with class `at-`: this should made your life easier if you're trying to write your own CSS rules to change templates' appearance. - -Social login buttons (`button.at-social-btn`) have an `id` in the form `at-` and name ``. - -Input fields for the password service form are wrapped inside a div with class `at-input`. The same div gets classes `has-error`, `has-success`, and `has-feedback` in case of negative validation result, positive validation and validation with feedback respectively. -The input element itself has id and name in the form `at-field-`. -**Note:** `has-error`, `has-success`, and `has-feedback` names might change from framework to framework. These are valid for the *unstyled* and *bootstrap* versions... - - -Below is a html snapshot of an over-complete `atForm` taken from the unstyled version in which you can find all elements possibly shown under different configurations and circumstances. - -```html - -``` - - - - -## Wrapping Up for Famo.us - -By simply typing - -```shell -meteor add useraccounts:famous-wrapper -``` - -you'll be able to turn your preferred flavour of accounts templates into a package ready to be used within a [famous-views](https://atmospherejs.com/gadicohen/famous-views) + [Famo.us](http://famo.us) application. - -This means you can get an animated version of the `atForm` template without any effort! :-) - -To learn how to make animations you might want to check the following links: - -* http://famous-views.meteor.com -* http://famous-views.meteor.com/examples/animate -* http://famo.us/university/lessons/#/famous-101/animating/1 -* http://famo.us/guides/layout -* http://famo.us/guides/animations -* http://famo.us/docs/modifiers/StateModifier -* http://famo.us/docs/transitions/Transitionable - -### configureAnimations - -...well, actually it might be that you don't like the default animations so you might consider to use `AccountsTemplates.configureAnimations` (provided by the wrapper...) to specify your custom animation functions. -This is an example showing how to do it: - -```javascript -var Transform; -var Easing; -if (Meteor.isClient){ - FView.ready(function(require) { - Transform = famous.core.Transform; - Easing = famous.transitions.Easing; - }); -} - -var slideLeftDestroy = function(fview){ - fview.modifier.setTransform( - Transform.translate(-$(window).width(),0), - { duration : 250, curve: Easing.easeOutSine }, - function() { fview.destroy();} - ); -}; - - -AccountsTemplates.configureAnimations({ - destroy: { - atSignupLink: slideLeftDestroy, - } -}); -``` - -this asks AT to use `slideLeftDestroy` to animate the template `atSignupLink` when it is to be destroyed. - -As you've just seen `configureAnimations` take an `options` object as parameter: - -```javascript -AccountsTemplates.configureAnimations(options); -``` - -this options object can have three different keys at the first level: - -```javascript -var options = { - render: { - // more stuff here... - }, - destroy: { - // more stuff here... - }, - state_change: { - // more stuff here... - }, - animQueueDelay: 100, - animQueueStartDelay: 200, - setStateDelay: 300, - -}; -AccountsTemplates.configureAnimations(options); -``` - -they are `render`, `destroy`, `state_change`, `animQueueDelay`, `animQueueStartDelay`, and `setStateDelay`. -The first three, what a surprise, they let you specify what to do when one of the templates building up the `atForm` is rendered, destroyed or when the form's state changes (respectively). - -...at the second level you can specify which animation has to be applied to which template: - -```javascript -var options = { - render: { - default: animA, - atTitle: animB, - atSocial: animC, - atSep: animC, - atError: animB, - atResult: animB, - atPwdForm: null, - atSigninLink: null, - atSignupLink: animB, - atTermsLink: animD, - }, - // ... -}; -``` - -the above one is the full list of available animated templates... -The value you specify can be `null` (to remove a default animation...) or a function. -If you specify a function it should be like the following: - -```javascript -var animFunc = function(fview){ - fview.modifier.setTransform( - Transform.( ... ), - { duration : , curve: Easing. } - ); -}; -``` - -the `fview` parameter actually let you access the famous view associated with the template (so feel free to do whatever you wish with it...). - -**Warning:** when you specify an animation to be used on `destroy` you must take care of the actual destroy! -...usually it is enough to call `fview.destroy()` when the animation completes: - -```javascript -var animFunc = function(fview){ - fview.modifier.setTransform( - Transform.( ... ), - { duration : , curve: Easing. }, - function(){ fview.destroy();} - ); -}; -``` - -**Warning2:** At the moment the animation for the state change is supposed to last for double the `setStateDelay` duration, and the state change is actually postponed by `setStateDelay` milliseconds. This let you divide your animation in two different part (so, e.g., you can hide things and show them again with the new content...). -The following is the default animations used on state change: - -```javascript -vFlip = function(fview){ - fview.modifier.setTransform( - Transform.rotate(Math.PI-0.05,0,0), - { - duration : AccountsTemplates.animations.setStateDelay, - curve: "easeIn", - }, - function() { - fview.modifier.setTransform( - Transform.rotate(-0.1,0,0), - { - duration : AccountsTemplates.animations.setStateDelay, - curve: "easeOut", - } - ); - } - ); -}; -``` - -and as you can see schedules two different animations, one after the another, lasting `setStateDelay` ms each. - - -### pushToAnimationQueue - -In case you're interested in sequence animation, AT also provides an experimental animation cue you can use to schedule your animation with a bit of delay between them. -To use it simply wrap the `modifier.setTransform` within an `AccountsTemplates.pushToAnimationQueue` call, like this: - -```jacascript -var fallFromTop = function(fview){ - fview.modifier.setTransform(Transform.translate(0, -$(window).height())); - AccountsTemplates.pushToAnimationQueue(function() { - fview.modifier.setTransform( - Transform.translate(0,0), - { duration : 450, curve: Easing.easeOutSine } - ); - }); -}; -``` - -the full signature for it is: - -```javascript -AccountsTemplates.pushToAnimationQueue(func, at_begin); -``` - -and if pass `true` for `at_begin`, the function will be pushed to the begin of the cue rather than at the end. - -The first animation is started after `animQueueStartDelay` milliseconds from the first insertion and a delay of `animQueueStartDelay` milliseconds is applied between start of animations (you can configure these two values with `configureAnimations` function as listed above...). - -And that's it! -Enjoy ;-) - - - -## Side Notes - - - -### 3rd Party Login Services Configuration - -Normally, if you have not configured a social account with, e.g., - -```javascript -// Set up login services -Meteor.startup(function() { - // Add Facebook configuration entry - ServiceConfiguration.configurations.update( - { "service": "facebook" }, - { - $set: { - "appId": "XXXXXXXXXXXXXXX", - "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - } - }, - { upsert: true } - ); - - // Add GitHub configuration entry - ServiceConfiguration.configurations.update( - { "service": "github" }, - { - $set: { - "clientId": "XXXXXXXXXXXXXXXXXXXX", - "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - } - }, - { upsert: true } - ); -}); -``` - -3rd party login buttons are not shown. To allow display buttons with, e.g., 'Configure Foobook', simply add the packages `service-configuration` and `accounts-ui` with: - -```Shell -meteor add service-configuration -meteor add accounts-ui -``` - -**Warning**: At the moment the UI for service configuration is not supported and the one provided by `accounts-ui` will be shown! diff --git a/packages/meteor-useraccounts-core/History.md b/packages/meteor-useraccounts-core/History.md deleted file mode 100644 index 61bcfaf93..000000000 --- a/packages/meteor-useraccounts-core/History.md +++ /dev/null @@ -1,353 +0,0 @@ -## Master - -## v1.14.2 - -* [flow-routing] fixed dependency on kadira:flow-router: now using the last non-Meteor@1.3 one - -## v1.14.1 - -* fixed automatic update of weak dependencies on routing packages when publishing new versions - -## v1.14.0 - -* [bulma] *new* `useraccounts:bulma` package to get UI templates styled for [Bulma](http://bulma.io/) (thanks to @dominikmayer) -* [flow-routing] better error management (merged https://github.com/meteor-useraccounts/flow-routing/pull/23 thanks @stubailo) -* [flow-routing] added support for FlowRouter 3 (merged https://github.com/meteor-useraccounts/flow-routing/pull/26 thanks @timothyarmes) -* [foundation-sites] *new* `useraccounts:foundation-sites` package to get UI templates styled for [Foundation for Sites 6](http://foundation.zurb.com/sites.html) (thanks to @venetianthief) -* [materialize] Added row around recaptcha (thanks @qwIvan) -* some minor fixed to the Guide - -## v1.13.1 - -* added language support to recaptcha (fixed https://github.com/meteor-useraccounts/core/issues/561 tnx @canesin) -* fixed validation trigger for select inputs (see discussion within https://github.com/meteor-useraccounts/core/issues/569 tnx @cunneen) -* change default value for `focusFirstInput` to get it disabled when running on Cordova (see https://github.com/meteor-useraccounts/core/issues/594 tnx @derwaldgeist) -* fixed regression about reCaptcha reset due to https://github.com/meteor-useraccounts/core/pull/565 (merged https://github.com/meteor-useraccounts/core/pull/597 tnx @jebh) - -## v1.13.0 - -* [mdl] *new* `useraccounts:mdl` package to get UI templates styled for [Material Design Lite](http://www.getmdl.io/) (kudos to @kctang and @liquidautumn, thank you guys!). -* [flow-routing] added support for React-based layouts (merged https://github.com/meteor-useraccounts/flow-routing/pull/20 tnx @timothyarmes). -* [materialize] fixed offset problem for fullPageAtForm on medium screens. -* [materialize] fixed some margins (see https://github.com/meteor-useraccounts/materialize/issues/19). -* [iron-routing] fixed a problem with route paths (merged https://github.com/meteor-useraccounts/iron-routing/pull/8 tnx @trave7er). -* [core] updated dependency to softwarerero:accounts-t9n@1.1.7 -* [core] fixed a bug with reCaptcha (merged https://github.com/meteor-useraccounts/core/pull/565 tnx @scsirdx). -* [core] added missing dependency on JQuery (merged https://github.com/meteor-useraccounts/core/pull/574 tnx @stubailo). -* [core] added postSignUpHook hook to let people modify newly created user objects (merged https://github.com/meteor-useraccounts/core/pull/586 tnx @shwaydogg) -* added [Meteor Icon](http://www.getmdl.io/) badges to all packages' README file. - -## v1.12.4 - -* fixed input element classes for `useraccounts:materialize` (see https://github.com/meteor-useraccounts/materialize/pull/18) -* fixed query parameters look-up for `useraccounts:iron-routing` -* updated `useraccounts:polymer` to use Polimer 1.0 (see updated [boilerplate](https://github.com/meteor-useraccounts/boilerplates/tree/master/polymer) with some instructions for Meteor 1.2) -* updates and fixes for `useraccounts:flow-rounting` (see https://github.com/meteor-useraccounts/flow-routing/issues/12) -* improoved css for `useraccounts:semantic-ui` -* disallowed use of `signUp` state in case `forbidClientAccountCreation` is set (see #547) -* updated dependency on softwarerero:accounts-t9n to version 1.1.4 -* a bit of linting here and there... -* a few typos correction and improvements to the [Guide](https://github.com/meteor-useraccounts/core/blob/master/Guide.md) - -## v1.12.3 - -* fixed radio buttons for useraccounts:materialize (see https://github.com/meteor-useraccounts/core/issues/421) -* fixed query parameters pick up for useraccounts:iron-routing (see meteor-useraccounts/core#367) -* corrected few typos within the docs and removed unnecessary debug log - -## v1.12.2 - -* various fixes and a bit of clean up for `useraccounts:flow-routing` - - -## v1.12.1 - -* fixed inifinite redirect loop for `ensuredSignedIn` within `useraccounts:flow-routing` (see https://github.com/meteor-useraccounts/flow-routing/issues/2) - - -## v1.12.0 - -* removed routing support from core: refer to [useraccounts:iron-routing](https://github.com/meteor-useraccounts/iron-routing) and [useraccounts:flow-routing](https://github.com/meteor-useraccounts/flow-routing) packages to get some ;-) -* added template level content protection (see new [Content Protection](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#content-protection) section) -* updated `useraccounts:semantic-ui` to SUI v2.0 (thanks @lumatijev) -* `displayName` configuration option for form fields now accepts also functions -* added the `focusFirstInput` configuration option -* fixed many typos and added/removed some sections in the Guide - - -## v1.11.1 - -* fixes for #410, #411, and #413 -* Added a section about available internal states to the Guide (see [Internal States](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#internal-states) - - -## v1.11.0 - -* change `profile.username` to `profile.name` when using `lowercaseUsername` options (WARNING! this is a bit of a breaking change, see #388) -* removed possibly annoying warning (see #398) -* added a `preSignUpHook` to be possibly used to enrich the user profile just before new user registration (see #400) -* route configuration now accepts additional parameters to be passed to IR (see #409) -* some improvements to the docs - -## v1.10.0 - -* more customizable texts (see 7d166b74f111e05b22ef2c7d93908441e242350d) -* added autofocus for the first input field of `atPwdForm`. -* fixed some texts configuration capability (see #380) -* various corrections/improvements to the docs -* allowed for `field.setError` to take in Boolean values (see #361) -* fixed bug with `Must be logged in` error message shown after sign out (see #321) - -## v1.9.1 - -* aligned `useraccounts:unstyled` with the latest PRs - -## v1.9.0 - -* resend verification email (see #349, thanks @dalgard) -* allow for a neutral message text to be displayed (see #314 and #317, thanks @dalgard) -* more configurable error texts (see [Errors Text](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#errors-text), plus #301 #342) -* fixed little redirect bug (see #315) -* added title configuration for `verifyEmail` state plus letting titles to be hidden by - setting the corresponding text to an empy string (see [Form Title](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#form-title)) - -## v1.8.1 - -* made (a fake) `ensureSignedIn` plugin available also on server side code (fixed #291) - -## v1.8.0 - -* added `lowercaseUsername` configuration option (see [Configuration API Options](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#options)) -* added `ensureSignedIn` plugin for Iron Router (see [Content Protection](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#content-protection)) -* fixed `ensureSignedIn` regression (see #286) - -## v1.7.1 - -* fixed routing regression (see #284) -* removed useless logs - -## v1.7.0 - -* `useraccounts:materialize` to the suite! (Many thanks to @Kestanous!!!) -* fixed glitch within `ensureSignedIn` (see #278) -* added experimental support for [reChaptcha](https://www.google.com/recaptcha/intro/index.html) (see #268 and [reCaptcha Setup](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#recaptcha-setup), great work @theplatapi!) -* new `template` option for deeper input fields customization (see #273 and [Form Fields Configuration](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#form-fields-configuration)) -* prevent access to `atChangePwd` for users not being logged in (see #207) -* use `Meteor.userID()` in place of `Meteor.user()` where possible to reduce reactive re-computations -* fixed bug with timed out redirects (see #263) -* fixed reactivity bug within `ensureSignedIn` (see #262) -* removed warning about MAIL_URL not being configured (see #267, #210) -* better `atNavButton` behaviour (see #265 tnx @adrianmc) - -## v1.6.1 - -* updated deps for iron:router and softwarerero:accounts-t9n to latest versions - -## v1.6.0 - -* moved the documentation to a separate file: [Guide](https://github.com/meteor-useraccounts/core/blob/master/Guide.md) -* fixed bug about calling `sibmitHook` (see #249 #252 tnx @dalgard) -* new `options` for field configuration (see #250 and [Extending Templates](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#extending-templates) tnx @dalgard) -* a bit of cleanup for docs (see #251 tnx @dalgard) -* capitalazed default value for display name and placeholder (see #247) -* switch to official `Accounts._hasPassword` (see [this](https://github.com/meteor/meteor/pull/2271) and [this](https://github.com/meteor/meteor/pull/3410), tnx @glasser) -* more sites using useraccounts: congrats to @nate-strauser and @msamoylov on their launches! (see [the list](https://github.com/meteor-useraccounts/core#whos-using-this)) -* new landing page for the whole project and new live examples (still to be further improoved...) :) (see [useraccounts.meteor.com](https://useraccounts.meteor.com)) -* added `transform` among the options for [field configuration](https://github.com/meteor-useraccounts/core/blob/master/Guide.md#form-fields-configuration) -* better behaviour for input value tranform/fix -* terms and agreements now showed also on enrollment form (see #253) -* link to singIn now shown also on forgot password form in case `forbidClientAccountCreation` is set to true (partial solution to #229) -* moved terms and agreements link right after the submit button (see #239) - -## v1.5.0 - -* added `useraccounts:polymer` to the suite! (WIP, Thanks @kevohagan!!!) -* fixed a bug with atVerifyEmail route (see #241 and #173) -* little docs improovements - -## v1.4.1 - -* updated dependency to softwarerero:accounts-t9n@1.0.5 to include Turkish language -* fixed `{{> atForm state=''}}` which was no more working with Meteor@1.0.2 (see #217) -* fixed some text configuration (see #209, thanks @bumbleblym) -* fixed some typos into the docs (see #208, thanks @bumbleblym) - -## v1.4.0 - -* added `useraccounts:ionic` to the suite! (Thanks @nickw!!!) -* updated `useraccounts:semantic-ui` to SemanticUI@1.0.0 (Thanks @lumatijev!!!) -* added `onLogoutHook` to be able to run code (custom redirects?) on `AccountsTemplates.logout` (see #191) -* added `onSubmitHook` among configuration parameters to be able to run code on form submission (might be useful for modals! see #201 and #180) -* submission button get now disabled also during fields (asynchronous) validation -* `enforceEmailVerification` now works also with username login (fixed #196) -* better IE compatibility (see #199) -* better input field validation flows to recover from previous errors (see #177) -* updated dependency to softwarerero:accounts-t9n@1.0.4 -* new [Contributing section](https://github.com/meteor-useraccounts/core#contributing) among docs -* a few improvements and typo fixes for README.md - -## v1.3.2 / 2014/11/25 - -* more robust logout pattern when dealing with routes protected with ensureSigndIn - -## v1.3.1 / 2014/11/25 - -* updated dependency to iron:router@1.0.3 -* fixed bug in linkClick (see #170) -* fixed bug in configureRoute - -## v1.3.0 / 2014/11/23 - -* added support for [Ratchet](http://goratchet.com/): see [useraccounts:ratchet](https://atmospherejs.com/useraccounts/ratchet). Note: form validation is currently not supported by Ratchet! -* fixed bug in custom validation flow -* better default validation for `email` field (see #156) -* few corrections inside docs -* added `ensuredSignedIn` among configurable routes so that different `template` and `layoutTemplate` can be specified (fix for #160 and #98) -* added `socialLoginStyle` among the configuration options to select the login flow (`popup` or `redirect`) for 3rd party login services (see #163) -* fixed bug about fields ordering - -## v1.2.3 / 2014/11/13 - -* put back in a `init` method dispalying a warning to preserve backward compatibility... - -## v1.2.2 / 2014/11/12 - -* fixed bad redirect for cheange password route (see #154) - -## v1.2.1 / 2014/11/12 - -* fixed regression due reactivity problems after fix for #139 - -## v1.2.0 / 2014/11/12 - -* **breaking change:** removed the need to call `Accounts.init()` -* added support for fields' validating state to display a 'loading' icon -* added support for fields' icon configuration -* added support for social buttons' icon configuration (see [this](https://github.com/meteor-useraccounts/core#social-button-icons) new section) -* added support for `meteor-developer` oauth service (see #147) -* fixed (special) fields ordering, see #144 -* fixed ensureSignedIn (see #152) -* removed `new_password` and `new_password_again` special fields, simply use `password` and `password_again` from now on! -* better redirect behaviour when a logged in user lands on a sign-in/sign-up page: usual redirect is now performed. (see #139) -* better field validation patterns... -* updated dependency to irou:router@1.0.1 -* updated dependency to softwarerero:accounts-t9n@1.0.2 -* corrected many errors and typos inside the Documentation - -## v1.1.1 -## v1.1.0 - -* fixed `atNavButton` for useraccounts:unstyled -* fixed variour names and links in README files - -## v1.1.0 - -* new template `atNavButton` -* added methos `AccountsTemplates.logout()` which redirects back to `homeRoutePath` when configured -* support for hidden fields -* url query parameters loaded into input fields -> useful mostly for hidden fields ;-) -* granted full control over field ordering (except for special fields...). see #135 -* fixes for #130, #132 - -## v1.0.1 - -* fixed link to git repositories inside package.js files - -## v1.0.0 - -* new names: no more splendido:accounts-templates: but useraccounts: ! -* updated iron:router to v1.0.0 - -## v0.11.0 - -* added support for checkbox, select, and radio inputs -* added defaultState as referred in #125 -* fixes for #127 - -## v0.10.0 - -* better texts configuration API (as for #117) -* prevPath fix - - -## v0.9.16 - -* updated iron:router to v0.9.4 - -## v0.9.15 - -* fixed #110 - -## v0.9.14 - -* fixed some redirection problems connected with `ensureSignedIn` - -## v0.9.13 - -* experimental implementation for forbidding access with unverified email (see #108) through configuration flag `enforceEmailVerification` -* added options to hide links: hideSignInLink, hideSignUpLink -* fixed #107 - -## v0.9.12 - -* fixed #109 - -## v0.9.11 - -* better submit button disabling when no negative feedback is used -* fixed #105 - -## v0.9.10 - -* added `defaultLayout` to configuration options -* new callback parameter to `setState` -* better rendering behaviour on `ensureSignedIn` - -## v0.9.9 - -* Fixed links for `reset-password`, `enroll-account`, and `verify-email` - -## v0.9.8 - -* fixed checks for login services (see #93) -* minor updates to docs - -## v0.9.7 - -* fixed #92, to permit the use of, e.g., `{{> atForm state="changePwd"}}` ( see [docs](https://github.com/splendido/accounts-templates-core#templates)) - -## v0.9.6 - -* fixed #91, pwdForm submission on signin page has no effect unless both password and usename/email are not empty - -## v0.9.5 - -* show title on sign in also with other services -* moved sign in link below pwd form -* removed sign in link from forgot-pwd page (sign up link is still there!) -* added class at-btn to submit button -* added class at-signin to sign in link -* added class at-signup to sign up link -* added class at-pwd to forgot password link -* accounts-t9n dependency updated to @1.0.0 - -## v0.9.4 - - -## Older versions (to be written) - -* Fixes for #19, #24, #25, #26 -* layoutTemplate option -* Better signup flow, with proper server side validation! -* Fixes for #15, and #16 -* Do not show validation errors during sign in -* Do not show sign up link when account creation is disabled -* Better use of UnderscoreJS -* Corrected documentation for showAddRemoveServices - -## v0.0.9 - -* added configuration parameter [`showAddRemoveServices`](https://github.com/splendido/accounts-templates-core#appearance) -* Fix ensureSignedIn for drawing correct template - -## v0.0.8 diff --git a/packages/meteor-useraccounts-core/LICENSE.md b/packages/meteor-useraccounts-core/LICENSE.md deleted file mode 100644 index aba77efb5..000000000 --- a/packages/meteor-useraccounts-core/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 [@splendido](https://github.com/splendido) - -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. diff --git a/packages/meteor-useraccounts-core/README.md b/packages/meteor-useraccounts-core/README.md deleted file mode 100644 index cc8d0bf80..000000000 --- a/packages/meteor-useraccounts-core/README.md +++ /dev/null @@ -1,104 +0,0 @@ -[![Meteor Icon](http://icon.meteor.com/package/useraccounts:core)](https://atmospherejs.com/useraccounts/core) -[![Build Status](https://travis-ci.org/meteor-useraccounts/core.svg?branch=master)](https://travis-ci.org/meteor-useraccounts/core) - -# User Accounts - -User Accounts is a suite of packages for the [Meteor.js](https://www.meteor.com/) platform. It provides highly customizable user accounts UI templates for many different front-end frameworks. At the moment it includes forms for sign in, sign up, forgot password, reset password, change password, enroll account, and link or remove of many 3rd party services. - -## Some Details - -The package `useraccounts:core` contains all the core logic and templates' helpers and events used by dependant packages providing styled versions of the accounts UI. -This means that developing a version of the UI with a different styling is just a matter of writing a few dozen of html lines, nothing more! - -Thanks to [accounts-t9n](https://github.com/softwarerero/meteor-accounts-t9n) you can switch to your preferred language on the fly! Available languages are now: Arabic, Czech, French, German, Italian, Polish, Portuguese, Russian, Slovenian, Spanish, Swedish, Turkish and Vietnamese. - -For basic routing and content protection, `useraccounts:core` integrates with either [flow-router](https://github.com/meteor-useraccounts/flow-routing) or [iron-router](https://atmospherejs.com/package/iron-router). - -Any comments, suggestions, testing efforts, and PRs are very very welcome! Please use the [repository](https://github.com/meteor-useraccounts/ui) issues tracker for reporting bugs, problems, ideas, discussions, etc.. - -## The UserAccounts Guide -Detailed explanations of features and configuration options can be found in the Guide. - -## Who's using this? - -* [Abesea](https://abesea.com/) -* [backspace.academy](http://backspace.academy/) -* [bootstrappers.io](http://www.bootstrappers.io/) -* [crater.io](http://crater.io/) -* [Dechiper Chinese](http://app.decipherchinese.com/) -* [Henfood](http://labs.henesis.eu/henfood) -* [meteorgigs.io](https://www.meteorgigs.io/) -* [Orion](http://orionjs.org/) -* [Telescope](http://www.telesc.pe/) -* [We Work Meteor](http://www.weworkmeteor.com/) - - -Aren't you on the list?! -If you have a production app using accounts templates, let me know! I'd like to add your link to the above ones. - -## Contributing -Contributors are very welcome. There are many things you can help with, -including finding and fixing bugs and creating examples for the brand new [wiki](https://github.com/meteor-useraccounts/wiki). -We're also working on `useraccounts@2.0` (see the [Milestone](https://github.com/meteor-useraccounts/core/milestones)) so you can also help -with an improved design or adding features. - -Some guidelines below: - -* **Questions**: Please create a new issue and label it as a `question`. - -* **New Features**: If you'd like to work on a feature, - start by creating a 'Feature Design: Title' issue. This will let people bat it - around a bit before you send a full blown pull request. Also, you can create - an issue to discuss a design even if you won't be working on it. - -* **Bugs**: If you think you found a bug, please create a "reproduction." This is a small project that demonstrates the problem as concisely as possible. If you think the bug can be reproduced with only a few steps a description by words might be enough though. The project should be cloneable from Github. Any bug reports without a reproduction that don't have an obvious solution will be marked as "awaiting-reproduction" and closed after a bit of time. - -### Working Locally -This is useful if you're contributing code to useraccounts or just trying to modify something to suit your own specific needs. - -##### Scenario A - -1. Set up a local packages folder -2. Add the PACKAGE_DIRS environment variable to your .bashrc file - - Example: `export PACKAGE_DIRS="/full/path/topackages/folder"` - - Screencast: https://www.eventedmind.com/posts/meteor-versioning-and-packages -3. Clone the repository into your local packages directory -4. Add the package just like any other meteor core package like this: `meteor - add useraccounts:unstyled` - -```bash -> cd /full/path/topackages/folder -> git clone https://github.com/meteor-useraccounts/semantic-ui.git -> cd your/project/path -> meteor add useraccounts:semantic-ui -> meteor -``` - -##### Scenario B - -Like Scenario A, but skipping point 2. -Add the official package as usual with `meteor add useraccounts:semantic-ui` but then run your project like this: - -```bash -> PACKAGE_DIRS="/full/path/topackages/folder" meteor -``` - -##### Scenario C - -```bash -> cd your/project/path -> mkdir packages && cd packages -> git clone https://github.com/meteor-useraccounts/semantic-ui.git -> cd .. -> meteor add useraccounts:semantic-ui -> meteor -``` - - -## Thanks - -Anyone is welcome to contribute. Fork, make your changes, and then submit a pull request. - -Thanks to [all those who have contributed code changes](https://github.com/meteor-useraccounts/ui/graphs/contributors) and all who have helped by submitting bug reports and feature ideas. - -[![Support via Gittip](https://rawgithub.com/twolfson/gittip-badge/0.2.0/dist/gittip.png)](https://www.gittip.com/splendido/) diff --git a/packages/meteor-useraccounts-core/lib/client.js b/packages/meteor-useraccounts-core/lib/client.js deleted file mode 100644 index 31c9db744..000000000 --- a/packages/meteor-useraccounts-core/lib/client.js +++ /dev/null @@ -1,464 +0,0 @@ -/* global - AT: false -*/ -"use strict"; - -// Allowed Internal (client-side) States -AT.prototype.STATES = [ - "changePwd", // Change Password - "enrollAccount", // Account Enrollment - "forgotPwd", // Forgot Password - "hide", // Nothing displayed - "resetPwd", // Reset Password - "signIn", // Sign In - "signUp", // Sign Up - "verifyEmail", // Email verification - "resendVerificationEmail", // Resend verification email -]; - -AT.prototype._loginType = ""; - -// Flag telling whether the whole form should appear disabled -AT.prototype._disabled = false; - -// State validation -AT.prototype._isValidState = function(value) { - return _.contains(this.STATES, value); -}; - -// Flags used to avoid clearing errors and redirecting to previous route when -// signing in/up as a results of a call to ensureSignedIn -AT.prototype.avoidRedirect = false; -AT.prototype.avoidClearError = false; - -// Token to be provided for routes like reset-password and enroll-account -AT.prototype.paramToken = null; - -AT.prototype.loginType = function () { - return this._loginType; -}; - -AT.prototype.getparamToken = function() { - return this.paramToken; -}; - -// Getter for current state -AT.prototype.getState = function() { - return this.state.form.get("state"); -}; - -// Getter for disabled state -AT.prototype.disabled = function() { - return this.state.form.equals("disabled", true) ? "disabled" : undefined; -}; - -// Setter for disabled state -AT.prototype.setDisabled = function(value) { - check(value, Boolean); - return this.state.form.set("disabled", value); -}; - -// Setter for current state -AT.prototype.setState = function(state, callback) { - check(state, String); - - if (!this._isValidState(state) || (this.options.forbidClientAccountCreation && state === 'signUp')) { - throw new Meteor.Error(500, "Internal server error", "accounts-templates-core package got an invalid state value!"); - } - - this.state.form.set("state", state); - if (!this.avoidClearError) { - this.clearState(); - } - this.avoidClearError = false; - - if (_.isFunction(callback)) { - callback(); - } -}; - -AT.prototype.clearState = function() { - _.each(this._fields, function(field) { - field.clearStatus(); - }); - - var form = this.state.form; - - form.set("error", null); - form.set("result", null); - form.set("message", null); - - AccountsTemplates.setDisabled(false); -}; - -AT.prototype.clearError = function() { - this.state.form.set("error", null); -}; - -AT.prototype.clearResult = function() { - this.state.form.set("result", null); -}; - -AT.prototype.clearMessage = function() { - this.state.form.set("message", null); -}; - -// Initialization -AT.prototype.init = function() { - console.warn("[AccountsTemplates] There is no more need to call AccountsTemplates.init()! Simply remove the call ;-)"); -}; - -AT.prototype._init = function() { - if (this._initialized) { - return; - } - - var usernamePresent = this.hasField("username"); - var emailPresent = this.hasField("email"); - - if (usernamePresent && emailPresent) { - this._loginType = "username_and_email"; - } else { - this._loginType = usernamePresent ? "username" : "email"; - } - - if (this._loginType === "username_and_email") { - // Possibly adds the field username_and_email in case - // it was not configured - if (!this.hasField("username_and_email")) { - this.addField({ - _id: "username_and_email", - type: "text", - displayName: "usernameOrEmail", - placeholder: "usernameOrEmail", - required: true, - }); - } - } - - // Only in case password confirmation is required - if (this.options.confirmPassword) { - // Possibly adds the field password_again in case - // it was not configured - if (!this.hasField("password_again")) { - var pwdAgain = _.clone(this.getField("password")); - - pwdAgain._id = "password_again"; - pwdAgain.displayName = { - "default": "passwordAgain", - changePwd: "newPasswordAgain", - resetPwd: "newPasswordAgain", - }; - pwdAgain.placeholder = { - "default": "passwordAgain", - changePwd: "newPasswordAgain", - resetPwd: "newPasswordAgain", - }; - this.addField(pwdAgain); - } - } else { - if (this.hasField("password_again")) { - throw new Error("AccountsTemplates: a field password_again was added but confirmPassword is set to false!"); - } - } - - // Possibly adds the field current_password in case - // it was not configured - if (this.options.enablePasswordChange) { - if (!this.hasField("current_password")) { - this.addField({ - _id: "current_password", - type: "password", - displayName: "currentPassword", - placeholder: "currentPassword", - required: true, - }); - } - } - - // Ensuser the right order of special fields - var moveFieldAfter = function(fieldName, referenceFieldName) { - var fieldIds = AccountsTemplates.getFieldIds(); - var refFieldId = _.indexOf(fieldIds, referenceFieldName); - // In case the reference field is not present, just return... - if (refFieldId === -1) { - return; - } - - var fieldId = _.indexOf(fieldIds, fieldName); - // In case the sought field is not present, just return... - if (fieldId === -1) { - return; - } - - if (fieldId !== -1 && fieldId !== (refFieldId + 1)) { - // removes the field - var field = AccountsTemplates._fields.splice(fieldId, 1)[0]; - // push the field right after the reference field position - var newFieldIds = AccountsTemplates.getFieldIds(); - var newReferenceFieldId = _.indexOf(newFieldIds, referenceFieldName); - AccountsTemplates._fields.splice(newReferenceFieldId + 1, 0, field); - } - }; - - // Ensuser the right order of special fields - var moveFieldBefore = function(fieldName, referenceFieldName) { - var fieldIds = AccountsTemplates.getFieldIds(); - var refFieldId = _.indexOf(fieldIds, referenceFieldName); - // In case the reference field is not present, just return... - if (refFieldId === -1) { - return; - } - - var fieldId = _.indexOf(fieldIds, fieldName); - // In case the sought field is not present, just return... - if (fieldId === -1) { - return; - } - - if (fieldId !== -1 && fieldId !== (refFieldId - 1)) { - // removes the field - var field = AccountsTemplates._fields.splice(fieldId, 1)[0]; - // push the field right after the reference field position - var newFieldIds = AccountsTemplates.getFieldIds(); - var newReferenceFieldId = _.indexOf(newFieldIds, referenceFieldName); - AccountsTemplates._fields.splice(newReferenceFieldId, 0, field); - } - }; - - // The final order should be something like: - // - username - // - email - // - username_and_email - // - password - // - password_again - // - // ...so lets do it in reverse order... - moveFieldAfter("username_and_email", "username"); - moveFieldAfter("username_and_email", "email"); - moveFieldBefore("current_password", "password"); - moveFieldAfter("password", "current_password"); - moveFieldAfter("password_again", "password"); - - - // Sets visibility condition and validation flags for each field - var gPositiveValidation = !!AccountsTemplates.options.positiveValidation; - var gNegativeValidation = !!AccountsTemplates.options.negativeValidation; - var gShowValidating = !!AccountsTemplates.options.showValidating; - var gContinuousValidation = !!AccountsTemplates.options.continuousValidation; - var gNegativeFeedback = !!AccountsTemplates.options.negativeFeedback; - var gPositiveFeedback = !!AccountsTemplates.options.positiveFeedback; - - _.each(this._fields, function(field) { - // Visibility - switch(field._id) { - case "current_password": - field.visible = ["changePwd"]; - break; - case "email": - field.visible = ["forgotPwd", "signUp", "resendVerificationEmail"]; - if (AccountsTemplates.loginType() === "email") { - field.visible.push("signIn"); - } - break; - case "password": - field.visible = ["changePwd", "enrollAccount", "resetPwd", "signIn", "signUp"]; - break; - case "password_again": - field.visible = ["changePwd", "enrollAccount", "resetPwd", "signUp"]; - break; - case "username": - field.visible = ["signUp"]; - if (AccountsTemplates.loginType() === "username") { - field.visible.push("signIn"); - } - break; - case "username_and_email": - field.visible = []; - if (AccountsTemplates.loginType() === "username_and_email") { - field.visible.push("signIn"); - } - break; - default: - field.visible = ["signUp"]; - } - - // Validation - var positiveValidation = field.positiveValidation; - if (_.isUndefined(positiveValidation)) { - field.positiveValidation = gPositiveValidation; - } - - var negativeValidation = field.negativeValidation; - if (_.isUndefined(negativeValidation)) { - field.negativeValidation = gNegativeValidation; - } - - field.validation = field.positiveValidation || field.negativeValidation; - if (_.isUndefined(field.continuousValidation)) { - field.continuousValidation = gContinuousValidation; - } - - field.continuousValidation = field.validation && field.continuousValidation; - if (_.isUndefined(field.negativeFeedback)) { - field.negativeFeedback = gNegativeFeedback; - } - - if (_.isUndefined(field.positiveFeedback)) { - field.positiveFeedback = gPositiveFeedback; - } - - field.feedback = field.negativeFeedback || field.positiveFeedback; - // Validating icon - var showValidating = field.showValidating; - if (_.isUndefined(showValidating)) { - field.showValidating = gShowValidating; - } - - // Custom Template - if (field.template) { - if (field.template in Template) { - Template[field.template].helpers(AccountsTemplates.atInputHelpers); - } else { - console.warn( - "[UserAccounts] Warning no template " + field.template + " found!" - ); - } - } - }); - - // Initializes reactive states - var form = new ReactiveDict(); - - form.set("disabled", false); - form.set("state", "signIn"); - form.set("result", null); - form.set("error", null); - form.set("message", null); - this.state = { - form: form, - }; - - // Possibly subscribes to extended user data (to get the list of registered services...) - if (this.options.showAddRemoveServices) { - Meteor.subscribe("userRegisteredServices"); - } - - //Check that reCaptcha site keys are available and no secret keys visible - if (this.options.showReCaptcha) { - var atSiteKey = null; - var atSecretKey = null; - var settingsSiteKey = null; - var settingsSecretKey = null; - - if (AccountsTemplates.options.reCaptcha) { - atSiteKey = AccountsTemplates.options.reCaptcha.siteKey; - atSecretKey = AccountsTemplates.options.reCaptcha.secretKey; - } - - if (Meteor.settings && Meteor.settings.public && Meteor.settings.public.reCaptcha) { - settingsSiteKey = Meteor.settings.public.reCaptcha.siteKey; - settingsSecretKey = Meteor.settings.public.reCaptcha.secretKey; - } - - if (atSecretKey || settingsSecretKey) { - //erase the secret key - if (atSecretKey) { - AccountsTemplates.options.reCaptcha.secretKey = null; - } - - if (settingsSecretKey) { - Meteor.settings.public.reCaptcha.secretKey = null; - } - - var loc = atSecretKey ? "User Accounts configuration!" : "Meteor settings!"; - throw new Meteor.Error(401, "User Accounts: DANGER - reCaptcha private key leaked to client from " + loc - + " Provide the key in server settings ONLY."); - } - - if (!atSiteKey && !settingsSiteKey) { - throw new Meteor.Error(401, "User Accounts: reCaptcha site key not found! Please provide it or set showReCaptcha to false."); - } - } - - // Marks AccountsTemplates as initialized - this._initialized = true; -}; - -AT.prototype.linkClick = function(route) { - if (AccountsTemplates.disabled()) { - return; - } - - AccountsTemplates.setState(route); - - if (AccountsTemplates.options.focusFirstInput) { - var firstVisibleInput = _.find(this.getFields(), function(f) { - return _.contains(f.visible, route); - }); - - if (firstVisibleInput) { - $("input#at-field-" + firstVisibleInput._id).focus(); - } - } -}; - -AT.prototype.logout = function() { - var onLogoutHook = AccountsTemplates.options.onLogoutHook; - - Meteor.logout(function() { - if (onLogoutHook) { - onLogoutHook(); - } - }); -}; - -AT.prototype.submitCallback = function(error, state, onSuccess) { - var onSubmitHook = AccountsTemplates.options.onSubmitHook; - - if (onSubmitHook) { - onSubmitHook(error, state); - } - - if (error) { - if (_.isObject(error.details)) { - // If error.details is an object, we may try to set fields errors from it - _.each(error.details, function(error, fieldId) { - AccountsTemplates.getField(fieldId).setError(error); - }); - } else { - var err = "error.accounts.Unknown error"; - - if (error.reason) { - err = error.reason; - } - - if (err.substring(0, 15) !== "error.accounts.") { - err = "error.accounts." + err; - } - - AccountsTemplates.state.form.set("error", [err]); - } - - AccountsTemplates.setDisabled(false); - // Possibly resets reCaptcha form - if (state === "signUp" && AccountsTemplates.options.showReCaptcha) { - grecaptcha.reset(); - } - } else { - if (onSuccess) { - onSuccess(); - } - - if (state) { - AccountsTemplates.setDisabled(false); - } - } -}; - -AccountsTemplates = new AT(); - -// Initialization -Meteor.startup(function() { - AccountsTemplates._init(); -}); diff --git a/packages/meteor-useraccounts-core/lib/core.js b/packages/meteor-useraccounts-core/lib/core.js deleted file mode 100644 index 1c7bc07ab..000000000 --- a/packages/meteor-useraccounts-core/lib/core.js +++ /dev/null @@ -1,593 +0,0 @@ -// --------------------------------------------------------------------------------- -// Patterns for methods" parameters -// --------------------------------------------------------------------------------- - -STATE_PAT = { - changePwd: Match.Optional(String), - enrollAccount: Match.Optional(String), - forgotPwd: Match.Optional(String), - resetPwd: Match.Optional(String), - signIn: Match.Optional(String), - signUp: Match.Optional(String), - verifyEmail: Match.Optional(String), - resendVerificationEmail: Match.Optional(String), -}; - -ERRORS_PAT = { - accountsCreationDisabled: Match.Optional(String), - cannotRemoveService: Match.Optional(String), - captchaVerification: Match.Optional(String), - loginForbidden: Match.Optional(String), - mustBeLoggedIn: Match.Optional(String), - pwdMismatch: Match.Optional(String), - validationErrors: Match.Optional(String), - verifyEmailFirst: Match.Optional(String), -}; - -INFO_PAT = { - emailSent: Match.Optional(String), - emailVerified: Match.Optional(String), - pwdChanged: Match.Optional(String), - pwdReset: Match.Optional(String), - pwdSet: Match.Optional(String), - signUpVerifyEmail: Match.Optional(String), - verificationEmailSent: Match.Optional(String), -}; - -INPUT_ICONS_PAT = { - hasError: Match.Optional(String), - hasSuccess: Match.Optional(String), - isValidating: Match.Optional(String), -}; - -ObjWithStringValues = Match.Where(function (x) { - check(x, Object); - _.each(_.values(x), function(value) { - check(value, String); - }); - return true; -}); - -TEXTS_PAT = { - button: Match.Optional(STATE_PAT), - errors: Match.Optional(ERRORS_PAT), - info: Match.Optional(INFO_PAT), - inputIcons: Match.Optional(INPUT_ICONS_PAT), - maxAllowedLength: Match.Optional(String), - minRequiredLength: Match.Optional(String), - navSignIn: Match.Optional(String), - navSignOut: Match.Optional(String), - optionalField: Match.Optional(String), - pwdLink_link: Match.Optional(String), - pwdLink_pre: Match.Optional(String), - pwdLink_suff: Match.Optional(String), - requiredField: Match.Optional(String), - resendVerificationEmailLink_pre: Match.Optional(String), - resendVerificationEmailLink_link: Match.Optional(String), - resendVerificationEmailLink_suff: Match.Optional(String), - sep: Match.Optional(String), - signInLink_link: Match.Optional(String), - signInLink_pre: Match.Optional(String), - signInLink_suff: Match.Optional(String), - signUpLink_link: Match.Optional(String), - signUpLink_pre: Match.Optional(String), - signUpLink_suff: Match.Optional(String), - socialAdd: Match.Optional(String), - socialConfigure: Match.Optional(String), - socialIcons: Match.Optional(ObjWithStringValues), - socialRemove: Match.Optional(String), - socialSignIn: Match.Optional(String), - socialSignUp: Match.Optional(String), - socialWith: Match.Optional(String), - termsAnd: Match.Optional(String), - termsPreamble: Match.Optional(String), - termsPrivacy: Match.Optional(String), - termsTerms: Match.Optional(String), - title: Match.Optional(STATE_PAT), -}; - -// Configuration pattern to be checked with check -CONFIG_PAT = { - // Behaviour - confirmPassword: Match.Optional(Boolean), - defaultState: Match.Optional(String), - enablePasswordChange: Match.Optional(Boolean), - enforceEmailVerification: Match.Optional(Boolean), - focusFirstInput: Match.Optional(Boolean), - forbidClientAccountCreation: Match.Optional(Boolean), - lowercaseUsername: Match.Optional(Boolean), - overrideLoginErrors: Match.Optional(Boolean), - sendVerificationEmail: Match.Optional(Boolean), - socialLoginStyle: Match.Optional(Match.OneOf("popup", "redirect")), - - // Appearance - defaultLayout: Match.Optional(String), - hideSignInLink: Match.Optional(Boolean), - hideSignUpLink: Match.Optional(Boolean), - showAddRemoveServices: Match.Optional(Boolean), - showForgotPasswordLink: Match.Optional(Boolean), - showResendVerificationEmailLink: Match.Optional(Boolean), - showLabels: Match.Optional(Boolean), - showPlaceholders: Match.Optional(Boolean), - - // Client-side Validation - continuousValidation: Match.Optional(Boolean), - negativeFeedback: Match.Optional(Boolean), - negativeValidation: Match.Optional(Boolean), - positiveFeedback: Match.Optional(Boolean), - positiveValidation: Match.Optional(Boolean), - showValidating: Match.Optional(Boolean), - - // Privacy Policy and Terms of Use - privacyUrl: Match.Optional(String), - termsUrl: Match.Optional(String), - - // Redirects - homeRoutePath: Match.Optional(String), - redirectTimeout: Match.Optional(Number), - - // Hooks - onLogoutHook: Match.Optional(Function), - onSubmitHook: Match.Optional(Function), - preSignUpHook: Match.Optional(Function), - postSignUpHook: Match.Optional(Function), - - texts: Match.Optional(TEXTS_PAT), - - //reCaptcha config - reCaptcha: Match.Optional({ - data_type: Match.Optional(Match.OneOf("audio", "image")), - secretKey: Match.Optional(String), - siteKey: Match.Optional(String), - theme: Match.Optional(Match.OneOf("dark", "light")), - }), - - showReCaptcha: Match.Optional(Boolean), -}; - - -FIELD_SUB_PAT = { - "default": Match.Optional(String), - changePwd: Match.Optional(String), - enrollAccount: Match.Optional(String), - forgotPwd: Match.Optional(String), - resetPwd: Match.Optional(String), - signIn: Match.Optional(String), - signUp: Match.Optional(String), -}; - - -// Field pattern -FIELD_PAT = { - _id: String, - type: String, - required: Match.Optional(Boolean), - displayName: Match.Optional(Match.OneOf(String, Match.Where(_.isFunction), FIELD_SUB_PAT)), - placeholder: Match.Optional(Match.OneOf(String, FIELD_SUB_PAT)), - select: Match.Optional([{text: String, value: Match.Any}]), - minLength: Match.Optional(Match.Integer), - maxLength: Match.Optional(Match.Integer), - re: Match.Optional(RegExp), - func: Match.Optional(Match.Where(_.isFunction)), - errStr: Match.Optional(String), - - // Client-side Validation - continuousValidation: Match.Optional(Boolean), - negativeFeedback: Match.Optional(Boolean), - negativeValidation: Match.Optional(Boolean), - positiveValidation: Match.Optional(Boolean), - positiveFeedback: Match.Optional(Boolean), - - // Transforms - trim: Match.Optional(Boolean), - lowercase: Match.Optional(Boolean), - uppercase: Match.Optional(Boolean), - transform: Match.Optional(Match.Where(_.isFunction)), - - // Custom options - options: Match.Optional(Object), - template: Match.Optional(String), -}; - -// ----------------------------------------------------------------------------- -// AccountsTemplates object -// ----------------------------------------------------------------------------- - -// ------------------- -// Client/Server stuff -// ------------------- - -// Constructor -AT = function() { - -}; - -AT.prototype.CONFIG_PAT = CONFIG_PAT; - -/* - Each field object is represented by the following properties: - _id: String (required) // A unique field"s id / name - type: String (required) // Displayed input type - required: Boolean (optional) // Specifies Whether to fail or not when field is left empty - displayName: String (optional) // The field"s name to be displayed as a label above the input element - placeholder: String (optional) // The placeholder text to be displayed inside the input element - minLength: Integer (optional) // Possibly specifies the minimum allowed length - maxLength: Integer (optional) // Possibly specifies the maximum allowed length - re: RegExp (optional) // Regular expression for validation - func: Function (optional) // Custom function for validation - errStr: String (optional) // Error message to be displayed in case re validation fails -*/ - - -// Allowed input types -AT.prototype.INPUT_TYPES = [ - "checkbox", - "email", - "hidden", - "password", - "radio", - "select", - "tel", - "text", - "url", -]; - -// Current configuration values -AT.prototype.options = { - // Appearance - //defaultLayout: undefined, - showAddRemoveServices: false, - showForgotPasswordLink: false, - showResendVerificationEmailLink: false, - showLabels: true, - showPlaceholders: true, - - // Behaviour - confirmPassword: true, - defaultState: "signIn", - enablePasswordChange: false, - focusFirstInput: !Meteor.isCordova, - forbidClientAccountCreation: false, - lowercaseUsername: false, - overrideLoginErrors: true, - sendVerificationEmail: false, - socialLoginStyle: "popup", - - // Client-side Validation - //continuousValidation: false, - //negativeFeedback: false, - //negativeValidation: false, - //positiveValidation: false, - //positiveFeedback: false, - //showValidating: false, - - // Privacy Policy and Terms of Use - privacyUrl: undefined, - termsUrl: undefined, - - // Hooks - onSubmitHook: undefined, -}; - -AT.prototype.texts = { - button: { - changePwd: "updateYourPassword", - //enrollAccount: "createAccount", - enrollAccount: "signUp", - forgotPwd: "emailResetLink", - resetPwd: "setPassword", - signIn: "signIn", - signUp: "signUp", - resendVerificationEmail: "Send email again", - }, - errors: { - accountsCreationDisabled: "Client side accounts creation is disabled!!!", - cannotRemoveService: "Cannot remove the only active service!", - captchaVerification: "Captcha verification failed!", - loginForbidden: "error.accounts.Login forbidden", - mustBeLoggedIn: "error.accounts.Must be logged in", - pwdMismatch: "error.pwdsDontMatch", - validationErrors: "Validation Errors", - verifyEmailFirst: "Please verify your email first. Check the email and follow the link!", - }, - navSignIn: 'signIn', - navSignOut: 'signOut', - info: { - emailSent: "info.emailSent", - emailVerified: "info.emailVerified", - pwdChanged: "info.passwordChanged", - pwdReset: "info.passwordReset", - pwdSet: "Password Set", - signUpVerifyEmail: "Successful Registration! Please check your email and follow the instructions.", - verificationEmailSent: "A new email has been sent to you. If the email doesn't show up in your inbox, be sure to check your spam folder.", - }, - inputIcons: { - isValidating: "fa fa-spinner fa-spin", - hasSuccess: "fa fa-check", - hasError: "fa fa-times", - }, - maxAllowedLength: "Maximum allowed length", - minRequiredLength: "Minimum required length", - optionalField: "optional", - pwdLink_pre: "", - pwdLink_link: "forgotPassword", - pwdLink_suff: "", - requiredField: "Required Field", - resendVerificationEmailLink_pre: "Verification email lost?", - resendVerificationEmailLink_link: "Send again", - resendVerificationEmailLink_suff: "", - sep: "OR", - signInLink_pre: "ifYouAlreadyHaveAnAccount", - signInLink_link: "signin", - signInLink_suff: "", - signUpLink_pre: "dontHaveAnAccount", - signUpLink_link: "signUp", - signUpLink_suff: "", - socialAdd: "add", - socialConfigure: "configure", - socialIcons: { - "meteor-developer": "fa fa-rocket" - }, - socialRemove: "remove", - socialSignIn: "signIn", - socialSignUp: "signUp", - socialWith: "with", - termsPreamble: "clickAgree", - termsPrivacy: "privacyPolicy", - termsAnd: "and", - termsTerms: "terms", - title: { - changePwd: "changePassword", - enrollAccount: "createAccount", - forgotPwd: "resetYourPassword", - resetPwd: "resetYourPassword", - signIn: "signIn", - signUp: "createAccount", - verifyEmail: "", - resendVerificationEmail: "Send the verification email again", - }, -}; - -AT.prototype.SPECIAL_FIELDS = [ - "password_again", - "username_and_email", -]; - -// SignIn / SignUp fields -AT.prototype._fields = [ - new Field({ - _id: "email", - type: "email", - required: true, - lowercase: true, - trim: true, - func: function(email) { - return !_.contains(email, '@'); - }, - errStr: 'Invalid email', - }), - new Field({ - _id: "password", - type: "password", - required: true, - minLength: 6, - displayName: { - "default": "password", - changePwd: "newPassword", - resetPwd: "newPassword", - }, - placeholder: { - "default": "password", - changePwd: "newPassword", - resetPwd: "newPassword", - }, - }), -]; - - -AT.prototype._initialized = false; - -// Input type validation -AT.prototype._isValidInputType = function(value) { - return _.indexOf(this.INPUT_TYPES, value) !== -1; -}; - -AT.prototype.addField = function(field) { - // Fields can be added only before initialization - if (this._initialized) { - throw new Error("AccountsTemplates.addField should strictly be called before AccountsTemplates.init!"); - } - - field = _.pick(field, _.keys(FIELD_PAT)); - check(field, FIELD_PAT); - // Checks there"s currently no field called field._id - if (_.indexOf(_.pluck(this._fields, "_id"), field._id) !== -1) { - throw new Error("A field called " + field._id + " already exists!"); - } - // Validates field.type - if (!this._isValidInputType(field.type)) { - throw new Error("field.type is not valid!"); - } - // Checks field.minLength is strictly positive - if (typeof field.minLength !== "undefined" && field.minLength <= 0) { - throw new Error("field.minLength should be greater than zero!"); - } - // Checks field.maxLength is strictly positive - if (typeof field.maxLength !== "undefined" && field.maxLength <= 0) { - throw new Error("field.maxLength should be greater than zero!"); - } - // Checks field.maxLength is greater than field.minLength - if (typeof field.minLength !== "undefined" && typeof field.minLength !== "undefined" && field.maxLength < field.minLength) { - throw new Error("field.maxLength should be greater than field.maxLength!"); - } - - if (!(Meteor.isServer && _.contains(this.SPECIAL_FIELDS, field._id))) { - this._fields.push(new Field(field)); - } - - return this._fields; -}; - -AT.prototype.addFields = function(fields) { - var ok; - - try { // don"t bother with `typeof` - just access `length` and `catch` - ok = fields.length > 0 && "0" in Object(fields); - } catch (e) { - throw new Error("field argument should be an array of valid field objects!"); - } - if (ok) { - _.map(fields, function(field) { - this.addField(field); - }, this); - } else { - throw new Error("field argument should be an array of valid field objects!"); - } - - return this._fields; -}; - -AT.prototype.configure = function(config) { - // Configuration options can be set only before initialization - if (this._initialized) { - throw new Error("Configuration options must be set before AccountsTemplates.init!"); - } - - // Updates the current configuration - check(config, CONFIG_PAT); - var options = _.omit(config, "texts", "reCaptcha"); - this.options = _.defaults(options, this.options); - - // Possibly sets up reCaptcha options - var reCaptcha = config.reCaptcha; - if (reCaptcha) { - // Updates the current button object - this.options.reCaptcha = _.defaults(reCaptcha, this.options.reCaptcha || {}); - } - - // Possibly sets up texts... - if (config.texts) { - var texts = config.texts; - var simpleTexts = _.omit(texts, "button", "errors", "info", "inputIcons", "socialIcons", "title"); - - this.texts = _.defaults(simpleTexts, this.texts); - - if (texts.button) { - // Updates the current button object - this.texts.button = _.defaults(texts.button, this.texts.button); - } - - if (texts.errors) { - // Updates the current errors object - this.texts.errors = _.defaults(texts.errors, this.texts.errors); - } - - if (texts.info) { - // Updates the current info object - this.texts.info = _.defaults(texts.info, this.texts.info); - } - - if (texts.inputIcons) { - // Updates the current inputIcons object - this.texts.inputIcons = _.defaults(texts.inputIcons, this.texts.inputIcons); - } - - if (texts.socialIcons) { - // Updates the current socialIcons object - this.texts.socialIcons = _.defaults(texts.socialIcons, this.texts.socialIcons); - } - - if (texts.title) { - // Updates the current title object - this.texts.title = _.defaults(texts.title, this.texts.title); - } - } -}; - - -AT.prototype.configureRoute = function(route, options) { - console.warn('You now need a routing package like useraccounts:iron-routing or useraccounts:flow-routing to be able to configure routes!'); -}; - - -AT.prototype.hasField = function(fieldId) { - return !!this.getField(fieldId); -}; - -AT.prototype.getField = function(fieldId) { - var field = _.filter(this._fields, function(field) { - return field._id === fieldId; - }); - - return (field.length === 1) ? field[0] : undefined; -}; - -AT.prototype.getFields = function() { - return this._fields; -}; - -AT.prototype.getFieldIds = function() { - return _.pluck(this._fields, "_id"); -}; - -AT.prototype.getRoutePath = function(route) { - return "#"; -}; - -AT.prototype.oauthServices = function() { - // Extracts names of available services - var names; - - if (Meteor.isServer) { - names = (Accounts.oauth && Accounts.oauth.serviceNames()) || []; - } else { - names = (Accounts.oauth && Accounts.loginServicesConfigured() && Accounts.oauth.serviceNames()) || []; - } - // Extracts names of configured services - var configuredServices = []; - - if (Accounts.loginServiceConfiguration) { - configuredServices = _.pluck(Accounts.loginServiceConfiguration.find().fetch(), "service"); - } - - // Builds a list of objects containing service name as _id and its configuration status - var services = _.map(names, function(name) { - return { - _id : name, - configured: _.contains(configuredServices, name), - }; - }); - - // Checks whether there is a UI to configure services... - // XXX: this only works with the accounts-ui package - var showUnconfigured = typeof Accounts._loginButtonsSession !== "undefined"; - - // Filters out unconfigured services in case they"re not to be displayed - if (!showUnconfigured) { - services = _.filter(services, function(service) { - return service.configured; - }); - } - - // Sorts services by name - services = _.sortBy(services, function(service) { - return service._id; - }); - - return services; -}; - -AT.prototype.removeField = function(fieldId) { - // Fields can be removed only before initialization - if (this._initialized) { - throw new Error("AccountsTemplates.removeField should strictly be called before AccountsTemplates.init!"); - } - // Tries to look up the field with given _id - var index = _.indexOf(_.pluck(this._fields, "_id"), fieldId); - - if (index !== -1) { - return this._fields.splice(index, 1)[0]; - } else if (!(Meteor.isServer && _.contains(this.SPECIAL_FIELDS, fieldId))) { - throw new Error("A field called " + fieldId + " does not exist!"); - } -}; diff --git a/packages/meteor-useraccounts-core/lib/field.js b/packages/meteor-useraccounts-core/lib/field.js deleted file mode 100644 index c3ecfbb9d..000000000 --- a/packages/meteor-useraccounts-core/lib/field.js +++ /dev/null @@ -1,292 +0,0 @@ -// --------------------------------------------------------------------------------- -// Field object -// --------------------------------------------------------------------------------- - -Field = function(field) { - check(field, FIELD_PAT); - _.defaults(this, field); - - this.validating = new ReactiveVar(false); - this.status = new ReactiveVar(null); -}; - -if (Meteor.isClient) { - Field.prototype.clearStatus = function() { - return this.status.set(null); - }; -} - -if (Meteor.isServer) { - Field.prototype.clearStatus = function() { - // Nothing to do server-side - return; - }; -} - -Field.prototype.fixValue = function(value) { - if (this.type === "checkbox") { - return !!value; - } - - if (this.type === "select") { - // TODO: something working... - return value; - } - - if (this.type === "radio") { - // TODO: something working... - return value; - } - - // Possibly applies required transformations to the input value - if (this.trim) { - value = value.trim(); - } - - if (this.lowercase) { - value = value.toLowerCase(); - } - - if (this.uppercase) { - value = value.toUpperCase(); - } - - if (!!this.transform) { - value = this.transform(value); - } - - return value; -}; - -if (Meteor.isClient) { - Field.prototype.getDisplayName = function(state) { - var displayName = this.displayName; - - if (_.isFunction(displayName)) { - displayName = displayName(); - } else if (_.isObject(displayName)) { - displayName = displayName[state] || displayName["default"]; - } - - if (!displayName) { - displayName = capitalize(this._id); - } - - return displayName; - }; -} - -if (Meteor.isClient) { - Field.prototype.getPlaceholder = function(state) { - var placeholder = this.placeholder; - - if (_.isObject(placeholder)) { - placeholder = placeholder[state] || placeholder["default"]; - } - - if (!placeholder) { - placeholder = capitalize(this._id); - } - - return placeholder; - }; -} - -Field.prototype.getStatus = function() { - return this.status.get(); -}; - -if (Meteor.isClient) { - Field.prototype.getValue = function(templateInstance) { - if (this.type === "checkbox") { - return !!(templateInstance.$("#at-field-" + this._id + ":checked").val()); - } - - if (this.type === "radio") { - return templateInstance.$("[name=at-field-"+ this._id + "]:checked").val(); - } - - return templateInstance.$("#at-field-" + this._id).val(); - }; -} - -if (Meteor.isClient) { - Field.prototype.hasError = function() { - return this.negativeValidation && this.status.get(); - }; -} - -if (Meteor.isClient) { - Field.prototype.hasIcon = function() { - if (this.showValidating && this.isValidating()) { - return true; - } - - if (this.negativeFeedback && this.hasError()) { - return true; - } - - if (this.positiveFeedback && this.hasSuccess()) { - return true; - } - }; -} - -if (Meteor.isClient) { - Field.prototype.hasSuccess = function() { - return this.positiveValidation && this.status.get() === false; - }; -} - -if (Meteor.isClient) - Field.prototype.iconClass = function() { - if (this.isValidating()) { - return AccountsTemplates.texts.inputIcons["isValidating"]; - } - - if (this.hasError()) { - return AccountsTemplates.texts.inputIcons["hasError"]; - } - - if (this.hasSuccess()) { - return AccountsTemplates.texts.inputIcons["hasSuccess"]; - } - }; - -if (Meteor.isClient) { - Field.prototype.isValidating = function() { - return this.validating.get(); - }; -} - -if (Meteor.isClient) { - Field.prototype.setError = function(err) { - check(err, Match.OneOf(String, undefined, Boolean)); - - if (err === false) { - return this.status.set(false); - } - - return this.status.set(err || true); - }; -} - -if (Meteor.isServer) { - Field.prototype.setError = function(err) { - // Nothing to do server-side - return; - }; -} - -if (Meteor.isClient) { - Field.prototype.setSuccess = function() { - return this.status.set(false); - }; -} - -if (Meteor.isServer) { - Field.prototype.setSuccess = function() { - // Nothing to do server-side - return; - }; -} - -if (Meteor.isClient) { - Field.prototype.setValidating = function(state) { - check(state, Boolean); - return this.validating.set(state); - }; -} - -if (Meteor.isServer) { - Field.prototype.setValidating = function(state) { - // Nothing to do server-side - return; - }; -} - -if (Meteor.isClient) { - Field.prototype.setValue = function(templateInstance, value) { - if (this.type === "checkbox") { - templateInstance.$("#at-field-" + this._id).prop('checked', true); - return; - } - - if (this.type === "radio") { - templateInstance.$("[name=at-field-"+ this._id + "]").prop('checked', true); - return; - } - - templateInstance.$("#at-field-" + this._id).val(value); - }; -} - -Field.prototype.validate = function(value, strict) { - check(value, Match.OneOf(undefined, String, Boolean)); - this.setValidating(true); - this.clearStatus(); - - if (_.isUndefined(value) || value === '') { - if (!!strict) { - if (this.required) { - this.setError(AccountsTemplates.texts.requiredField); - this.setValidating(false); - - return AccountsTemplates.texts.requiredField; - } else { - this.setSuccess(); - this.setValidating(false); - - return false; - } - } else { - this.clearStatus(); - this.setValidating(false); - - return null; - } - } - - var valueLength = value.length; - var minLength = this.minLength; - if (minLength && valueLength < minLength) { - this.setError(AccountsTemplates.texts.minRequiredLength + ": " + minLength); - this.setValidating(false); - - return AccountsTemplates.texts.minRequiredLength + ": " + minLength; - } - - var maxLength = this.maxLength; - if (maxLength && valueLength > maxLength) { - this.setError(AccountsTemplates.texts.maxAllowedLength + ": " + maxLength); - this.setValidating(false); - - return AccountsTemplates.texts.maxAllowedLength + ": " + maxLength; - } - - if (this.re && valueLength && !value.match(this.re)) { - this.setError(this.errStr); - this.setValidating(false); - - return this.errStr; - } - - if (this.func) { - var result = this.func(value); - var err = result === true ? this.errStr || true : result; - - if (_.isUndefined(result)) { - return err; - } - - this.status.set(err); - this.setValidating(false); - - return err; - } - - this.setSuccess(); - this.setValidating(false); - - return false; -}; diff --git a/packages/meteor-useraccounts-core/lib/methods.js b/packages/meteor-useraccounts-core/lib/methods.js deleted file mode 100644 index 0d3a070dc..000000000 --- a/packages/meteor-useraccounts-core/lib/methods.js +++ /dev/null @@ -1,25 +0,0 @@ -/* global - AccountsTemplates: false -*/ -"use strict"; - -Meteor.methods({ - ATRemoveService: function(serviceName) { - check(serviceName, String); - - var userId = this.userId; - - if (userId) { - var user = Meteor.users.findOne(userId); - var numServices = _.keys(user.services).length; // including "resume" - var unset = {}; - - if (numServices === 2) { - throw new Meteor.Error(403, AccountsTemplates.texts.errors.cannotRemoveService, {}); - } - - unset["services." + serviceName] = ""; - Meteor.users.update(userId, {$unset: unset}); - } - }, -}); diff --git a/packages/meteor-useraccounts-core/lib/server.js b/packages/meteor-useraccounts-core/lib/server.js deleted file mode 100644 index 2a925dc7e..000000000 --- a/packages/meteor-useraccounts-core/lib/server.js +++ /dev/null @@ -1,184 +0,0 @@ -/* global - AT: false, - AccountsTemplates: false -*/ -"use strict"; - -// Initialization -AT.prototype.init = function() { - console.warn("[AccountsTemplates] There is no more need to call AccountsTemplates.init()! Simply remove the call ;-)"); -}; - -AT.prototype._init = function() { - if (this._initialized) { - return; - } - - // Checks there is at least one account service installed - if (!Package["accounts-password"] && (!Accounts.oauth || Accounts.oauth.serviceNames().length === 0)) { - throw Error("AccountsTemplates: You must add at least one account service!"); - } - - // A password field is strictly required - var password = this.getField("password"); - if (!password) { - throw Error("A password field is strictly required!"); - } - - if (password.type !== "password") { - throw Error("The type of password field should be password!"); - } - - // Then we can have "username" or "email" or even both of them - // but at least one of the two is strictly required - var username = this.getField("username"); - var email = this.getField("email"); - - if (!username && !email) { - throw Error("At least one field out of username and email is strictly required!"); - } - - if (username && !username.required) { - throw Error("The username field should be required!"); - } - - if (email) { - if (email.type !== "email") { - throw Error("The type of email field should be email!"); - } - - if (username) { - // username and email - if (username.type !== "text") { - throw Error("The type of username field should be text when email field is present!"); - } - } else { - // email only - if (!email.required) { - throw Error("The email field should be required when username is not present!"); - } - } - } else { - // username only - if (username.type !== "text" && username.type !== "tel") { - throw Error("The type of username field should be text or tel!"); - } - } - - // Possibly publish more user data in order to be able to show add/remove - // buttons for 3rd-party services - if (this.options.showAddRemoveServices) { - // Publish additional current user info to get the list of registered services - // XXX TODO: use - // Accounts.addAutopublishFields({ - // forLoggedInUser: ['services.facebook'], - // forOtherUsers: [], - // }) - // ...adds only user.services.*.id - Meteor.publish("userRegisteredServices", function() { - var userId = this.userId; - return Meteor.users.find(userId, {fields: {services: 1}}); - /* - if (userId) { - var user = Meteor.users.findOne(userId); - var services_id = _.chain(user.services) - .keys() - .reject(function(service) {return service === "resume";}) - .map(function(service) {return "services." + service + ".id";}) - .value(); - var projection = {}; - _.each(services_id, function(key) {projection[key] = 1;}); - return Meteor.users.find(userId, {fields: projection}); - } - */ - }); - } - - // Security stuff - if (this.options.overrideLoginErrors) { - Accounts.validateLoginAttempt(function(attempt) { - if (attempt.error) { - var reason = attempt.error.reason; - if (reason === "User not found" || reason === "Incorrect password") { - throw new Meteor.Error(403, AccountsTemplates.texts.errors.loginForbidden); - } - } - return attempt.allowed; - }); - } - - if (this.options.sendVerificationEmail && this.options.enforceEmailVerification) { - Accounts.validateLoginAttempt(function(attempt) { - if (!attempt.allowed) { - return false; - } - - if (attempt.type !== "password" || attempt.methodName !== "login") { - return attempt.allowed; - } - - var user = attempt.user; - if (!user) { - return attempt.allowed; - } - - var ok = true; - var loginEmail = attempt.methodArguments[0].user.email.toLowerCase(); - if (loginEmail) { - var email = _.filter(user.emails, function(obj) { - return obj.address.toLowerCase() === loginEmail; - }); - if (!email.length || !email[0].verified) { - ok = false; - } - } else { - // we got the username, lets check there's at lease one verified email - var emailVerified = _.chain(user.emails) - .pluck('verified') - .any() - .value(); - - if (!emailVerified) { - ok = false; - } - } - if (!ok) { - throw new Meteor.Error(401, AccountsTemplates.texts.errors.verifyEmailFirst); - } - - return attempt.allowed; - }); - } - - //Check that reCaptcha secret keys are available - if (this.options.showReCaptcha) { - var atSecretKey = AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.secretKey; - var settingsSecretKey = Meteor.settings.reCaptcha && Meteor.settings.reCaptcha.secretKey; - - if (!atSecretKey && !settingsSecretKey) { - throw new Meteor.Error(401, "User Accounts: reCaptcha secret key not found! Please provide it or set showReCaptcha to false." ); - } - } - - // Marks AccountsTemplates as initialized - this._initialized = true; -}; - -AccountsTemplates = new AT(); - -// Client side account creation is disabled by default: -// the methos ATCreateUserServer is used instead! -// to actually disable client side account creation use: -// -// AccountsTemplates.config({ -// forbidClientAccountCreation: true -// }); - -Accounts.config({ - forbidClientAccountCreation: true -}); - -// Initialization -Meteor.startup(function() { - AccountsTemplates._init(); -}); diff --git a/packages/meteor-useraccounts-core/lib/server_methods.js b/packages/meteor-useraccounts-core/lib/server_methods.js deleted file mode 100644 index 500440d70..000000000 --- a/packages/meteor-useraccounts-core/lib/server_methods.js +++ /dev/null @@ -1,142 +0,0 @@ -/* global - AccountsTemplates -*/ -"use strict"; - -Meteor.methods({ - ATCreateUserServer: function(options) { - if (AccountsTemplates.options.forbidClientAccountCreation) { - throw new Meteor.Error(403, AccountsTemplates.texts.errors.accountsCreationDisabled); - } - - // createUser() does more checking. - check(options, Object); - var allFieldIds = AccountsTemplates.getFieldIds(); - - // Picks-up whitelisted fields for profile - var profile = options.profile; - profile = _.pick(profile, allFieldIds); - profile = _.omit(profile, "username", "email", "password"); - - // Validates fields" value - var signupInfo = _.clone(profile); - if (options.username) { - signupInfo.username = options.username; - - if (AccountsTemplates.options.lowercaseUsername) { - signupInfo.username = signupInfo.username.trim().replace(/\s+/gm, ' '); - options.profile.name = signupInfo.username; - signupInfo.username = signupInfo.username.toLowerCase().replace(/\s+/gm, ''); - options.username = signupInfo.username; - } - } - - if (options.email) { - signupInfo.email = options.email; - - if (AccountsTemplates.options.lowercaseUsername) { - signupInfo.email = signupInfo.email.toLowerCase().replace(/\s+/gm, ''); - options.email = signupInfo.email; - } - } - - if (options.password) { - signupInfo.password = options.password; - } - - var validationErrors = {}; - var someError = false; - - // Validates fields values - _.each(AccountsTemplates.getFields(), function(field) { - var fieldId = field._id; - var value = signupInfo[fieldId]; - - if (fieldId === "password") { - // Can"t Pick-up password here - // NOTE: at this stage the password is already encripted, - // so there is no way to validate it!!! - check(value, Object); - return; - } - - var validationErr = field.validate(value, "strict"); - if (validationErr) { - validationErrors[fieldId] = validationErr; - someError = true; - } - }); - - if (AccountsTemplates.options.showReCaptcha) { - var secretKey = null; - - if (AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.secretKey) { - secretKey = AccountsTemplates.options.reCaptcha.secretKey; - } else { - secretKey = Meteor.settings.reCaptcha.secretKey; - } - - var apiResponse = HTTP.post("https://www.google.com/recaptcha/api/siteverify", { - params: { - secret: secretKey, - response: options.profile.reCaptchaResponse, - remoteip: this.connection.clientAddress, - } - }).data; - - if (!apiResponse.success) { - throw new Meteor.Error(403, AccountsTemplates.texts.errors.captchaVerification, - apiResponse['error-codes'] ? apiResponse['error-codes'].join(", ") : "Unknown Error."); - } - } - - if (someError) { - throw new Meteor.Error(403, AccountsTemplates.texts.errors.validationErrors, validationErrors); - } - - // Possibly removes the profile field - if (_.isEmpty(options.profile)) { - delete options.profile; - } - - // Create user. result contains id and token. - var userId = Accounts.createUser(options); - // safety belt. createUser is supposed to throw on error. send 500 error - // instead of sending a verification email with empty userid. - if (! userId) { - throw new Error("createUser failed to insert new user"); - } - - // Call postSignUpHook, if any... - var postSignUpHook = AccountsTemplates.options.postSignUpHook; - if (postSignUpHook) { - postSignUpHook(userId, options); - } - - // Send a email address verification email in case the context permits it - // and the specific configuration flag was set to true - if (options.email && AccountsTemplates.options.sendVerificationEmail) { - Accounts.sendVerificationEmail(userId, options.email); - } - }, - - // Resend a user's verification e-mail - ATResendVerificationEmail: function (email) { - check(email, String); - - var user = Meteor.users.findOne({ "emails.address": email }); - - // Send the standard error back to the client if no user exist with this e-mail - if (!user) { - throw new Meteor.Error(403, "User not found"); - } - - try { - Accounts.sendVerificationEmail(user._id); - } catch (error) { - // Handle error when email already verified - // https://github.com/dwinston/send-verification-email-bug - throw new Meteor.Error(403, "Already verified"); - } - }, -}); diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js deleted file mode 100644 index 5673dfe7a..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_error.js +++ /dev/null @@ -1,26 +0,0 @@ -AT.prototype.atErrorHelpers = { - singleError: function() { - var errors = AccountsTemplates.state.form.get("error"); - return errors && errors.length === 1; - }, - error: function() { - return AccountsTemplates.state.form.get("error"); - }, - errorText: function(){ - var field, err; - if (this.field){ - field = T9n.get(this.field, markIfMissing=false); - err = T9n.get(this.err, markIfMissing=false); - } - else - err = T9n.get(this.valueOf(), markIfMissing=false); - - // Possibly removes initial prefix in case the key in not found inside t9n - if (err.substring(0, 15) === "error.accounts.") - err = err.substring(15); - - if (field) - return field + ": " + err; - return err; - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js deleted file mode 100644 index 95a34c0cb..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_form.js +++ /dev/null @@ -1,83 +0,0 @@ -AT.prototype.atFormHelpers = { - hide: function(){ - var state = this.state || AccountsTemplates.getState(); - return state === "hide"; - }, - showTitle: function(next_state){ - var state = next_state || this.state || AccountsTemplates.getState(); - if (Meteor.userId() && state === "signIn") - return false; - return !!AccountsTemplates.texts.title[state]; - }, - showOauthServices: function(next_state){ - var state = next_state || this.state || AccountsTemplates.getState(); - if (!(state === "signIn" || state === "signUp")) - return false; - var services = AccountsTemplates.oauthServices(); - if (!services.length) - return false; - if (Meteor.userId()) - return AccountsTemplates.options.showAddRemoveServices; - return true; - }, - showServicesSeparator: function(next_state){ - var pwdService = Package["accounts-password"] !== undefined; - var state = next_state || this.state || AccountsTemplates.getState(); - var rightState = (state === "signIn" || state === "signUp"); - return rightState && !Meteor.userId() && pwdService && AccountsTemplates.oauthServices().length; - }, - showError: function(next_state) { - return !!AccountsTemplates.state.form.get("error"); - }, - showResult: function(next_state) { - return !!AccountsTemplates.state.form.get("result"); - }, - showMessage: function(next_state) { - return !!AccountsTemplates.state.form.get("message"); - }, - showPwdForm: function(next_state) { - if (Package["accounts-password"] === undefined) - return false; - var state = next_state || this.state || AccountsTemplates.getState(); - if ((state === "verifyEmail") || (state === "signIn" && Meteor.userId())) - return false; - return true; - }, - showSignInLink: function(next_state){ - if (AccountsTemplates.options.hideSignInLink) - return false; - var state = next_state || this.state || AccountsTemplates.getState(); - if (AccountsTemplates.options.forbidClientAccountCreation && state === "forgotPwd") - return true; - return state === "signUp"; - }, - showSignUpLink: function(next_state){ - if (AccountsTemplates.options.hideSignUpLink) - return false; - var state = next_state || this.state || AccountsTemplates.getState(); - return ((state === "signIn" && !Meteor.userId()) || state === "forgotPwd") && !AccountsTemplates.options.forbidClientAccountCreation; - }, - showTermsLink: function(next_state){ - //TODO: Add privacyRoute and termsRoute as alternatives (the point of named routes is - // being able to change the url in one place only) - if (!!AccountsTemplates.options.privacyUrl || !!AccountsTemplates.options.termsUrl) { - var state = next_state || this.state || AccountsTemplates.getState(); - if (state === "signUp" || state === "enrollAccount" ) { - return true; - } - } - /* - if (state === "signIn"){ - var pwdService = Package["accounts-password"] !== undefined; - if (!pwdService) - return true; - } - */ - return false; - }, - showResendVerificationEmailLink: function(){ - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return (state === "signIn" || state === "forgotPwd") && AccountsTemplates.options.showResendVerificationEmailLink; - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js deleted file mode 100644 index fe74eeb17..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_input.js +++ /dev/null @@ -1,124 +0,0 @@ -AT.prototype.atInputRendered = [function(){ - var fieldId = this.data._id; - - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - - if (AccountsTemplates.options.focusFirstInput) { - var firstVisibleInput = _.find(AccountsTemplates.getFields(), function(f){ - return _.contains(f.visible, state); - }); - - if (firstVisibleInput && firstVisibleInput._id === fieldId) { - this.$("input#at-field-" + fieldId).focus(); - } - } -}]; - -AT.prototype.atInputHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - showLabels: function() { - return AccountsTemplates.options.showLabels; - }, - displayName: function() { - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - var displayName = this.getDisplayName(state); - return T9n.get(displayName, markIfMissing=false); - }, - optionalText: function(){ - return "(" + T9n.get(AccountsTemplates.texts.optionalField, markIfMissing=false) + ")"; - }, - templateName: function() { - if (this.template) - return this.template; - if (this.type === "checkbox") - return "atCheckboxInput"; - if (this.type === "select") - return "atSelectInput"; - if (this.type === "radio") - return "atRadioInput"; - if (this.type === "hidden") - return "atHiddenInput"; - return "atTextInput"; - }, - values: function(){ - var id = this._id; - return _.map(this.select, function(select){ - var s = _.clone(select); - s._id = id + "-" + select.value; - s.id = id; - return s; - }); - }, - errorText: function() { - var err = this.getStatus(); - return T9n.get(err, markIfMissing=false); - }, - placeholder: function() { - if (AccountsTemplates.options.showPlaceholders) { - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - var placeholder = this.getPlaceholder(state); - return T9n.get(placeholder, markIfMissing=false); - } - }, -}; - -AT.prototype.atInputEvents = { - "focusin input": function(event, t){ - var field = Template.currentData(); - field.clearStatus(); - }, - "focusout input, change select": function(event, t){ - var field = Template.currentData(); - var fieldId = field._id; - var rawValue = field.getValue(t); - var value = field.fixValue(rawValue); - // Possibly updates the input value - if (value !== rawValue) { - field.setValue(t, value); - } - - // Client-side only validation - if (!field.validation) - return; - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - // No validation during signIn - if (state === "signIn") - return; - // Special case for password confirmation - if (value && fieldId === "password_again"){ - if (value !== $("#at-field-password").val()) - return field.setError(AccountsTemplates.texts.errors.pwdMismatch); - } - field.validate(value); - }, - "keyup input": function(event, t){ - var field = Template.currentData(); - // Client-side only continuous validation - if (!field.continuousValidation) - return; - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - // No validation during signIn - if (state === "signIn") - return; - var fieldId = field._id; - var rawValue = field.getValue(t); - var value = field.fixValue(rawValue); - // Possibly updates the input value - if (value !== rawValue) { - field.setValue(t, value); - } - // Special case for password confirmation - if (value && fieldId === "password_again"){ - if (value !== $("#at-field-password").val()) - return field.setError(AccountsTemplates.texts.errors.pwdMismatch); - } - field.validate(value); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js deleted file mode 100644 index baa9ca044..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_message.js +++ /dev/null @@ -1,7 +0,0 @@ -AT.prototype.atMessageHelpers = { - message: function() { - var messageText = AccountsTemplates.state.form.get("message"); - if (messageText) - return T9n.get(messageText, markIfMissing=false); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js deleted file mode 100644 index c434060d6..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_nav_button.js +++ /dev/null @@ -1,16 +0,0 @@ -AT.prototype.atNavButtonHelpers = { - text: function(){ - var key = Meteor.userId() ? AccountsTemplates.texts.navSignOut : AccountsTemplates.texts.navSignIn; - return T9n.get(key, markIfMissing=false); - } -}; - -AT.prototype.atNavButtonEvents = { - 'click #at-nav-button': function(event){ - event.preventDefault(); - if (Meteor.userId()) - AccountsTemplates.logout(); - else - AccountsTemplates.linkClick("signIn"); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js deleted file mode 100644 index 1b1d13c19..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_oauth.js +++ /dev/null @@ -1,5 +0,0 @@ -AT.prototype.atOauthHelpers = { - oauthService: function() { - return AccountsTemplates.oauthServices(); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js deleted file mode 100644 index 2f8d53c47..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js +++ /dev/null @@ -1,331 +0,0 @@ -AT.prototype.atPwdFormHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - fields: function() { - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return _.filter(AccountsTemplates.getFields(), function(s) { - return _.contains(s.visible, state); - }); - }, - showForgotPasswordLink: function() { - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return state === "signIn" && AccountsTemplates.options.showForgotPasswordLink; - }, - showReCaptcha: function() { - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return state === "signUp" && AccountsTemplates.options.showReCaptcha; - }, -}; - - -var toLowercaseUsername = function(value){ - return value.toLowerCase().replace(/\s+/gm, ''); -}; - -AT.prototype.atPwdFormEvents = { - // Form submit - "submit #at-pwd-form": function(event, t) { - event.preventDefault(); - t.$("#at-btn").blur(); - - AccountsTemplates.setDisabled(true); - - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - var preValidation = (state !== "signIn"); - - // Client-side pre-validation - // Validates fields values - // NOTE: This is the only place where password validation can be enforced! - var formData = {}; - var someError = false; - var errList = []; - _.each(AccountsTemplates.getFields(), function(field){ - // Considers only visible fields... - if (!_.contains(field.visible, state)) - return; - - var fieldId = field._id; - - var rawValue = field.getValue(t); - var value = field.fixValue(rawValue); - // Possibly updates the input value - if (value !== rawValue) { - field.setValue(t, value); - } - if (value !== undefined && value !== "") { - formData[fieldId] = value; - } - - // Validates the field value only if current state is not "signIn" - if (preValidation && field.getStatus() !== false){ - var validationErr = field.validate(value, "strict"); - if (validationErr) { - if (field.negativeValidation) - field.setError(validationErr); - else{ - var fId = T9n.get(field.getDisplayName(), markIfMissing=false); - //errList.push(fId + ": " + err); - errList.push({ - field: field.getDisplayName(), - err: validationErr - }); - } - someError = true; - } - else - field.setSuccess(); - } - }); - - // Clears error and result - AccountsTemplates.clearError(); - AccountsTemplates.clearResult(); - AccountsTemplates.clearMessage(); - // Possibly sets errors - if (someError){ - if (errList.length) - AccountsTemplates.state.form.set("error", errList); - AccountsTemplates.setDisabled(false); - //reset reCaptcha form - if (state === "signUp" && AccountsTemplates.options.showReCaptcha) { - grecaptcha.reset(); - } - return; - } - - // Extracts username, email, and pwds - var current_password = formData.current_password; - var email = formData.email; - var password = formData.password; - var password_again = formData.password_again; - var username = formData.username; - var username_and_email = formData.username_and_email; - // Clears profile data removing username, email, and pwd - delete formData.current_password; - delete formData.email; - delete formData.password; - delete formData.password_again; - delete formData.username; - delete formData.username_and_email; - - if (AccountsTemplates.options.confirmPassword){ - // Checks passwords for correct match - if (password_again && password !== password_again){ - var pwd_again = AccountsTemplates.getField("password_again"); - if (pwd_again.negativeValidation) - pwd_again.setError(AccountsTemplates.texts.errors.pwdMismatch); - else - AccountsTemplates.state.form.set("error", [{ - field: pwd_again.getDisplayName(), - err: AccountsTemplates.texts.errors.pwdMismatch - }]); - AccountsTemplates.setDisabled(false); - //reset reCaptcha form - if (state === "signUp" && AccountsTemplates.options.showReCaptcha) { - grecaptcha.reset(); - } - return; - } - } - - // ------- - // Sign In - // ------- - if (state === "signIn") { - var pwdOk = !!password; - var userOk = true; - var loginSelector; - if (email) { - if (AccountsTemplates.options.lowercaseUsername) { - email = toLowercaseUsername(email); - } - - loginSelector = {email: email}; - } - else if (username) { - if (AccountsTemplates.options.lowercaseUsername) { - username = toLowercaseUsername(username); - } - loginSelector = {username: username}; - } - else if (username_and_email) { - if (AccountsTemplates.options.lowercaseUsername) { - username_and_email = toLowercaseUsername(username_and_email); - } - loginSelector = username_and_email; - } - else - userOk = false; - - // Possibly exits if not both 'password' and 'username' are non-empty... - if (!pwdOk || !userOk){ - AccountsTemplates.state.form.set("error", [AccountsTemplates.texts.errors.loginForbidden]); - AccountsTemplates.setDisabled(false); - return; - } - - - return Meteor.loginWithPassword(loginSelector, password, function(error) { - AccountsTemplates.submitCallback(error, state); - }); - } - - // ------- - // Sign Up - // ------- - if (state === "signUp") { - // Possibly gets reCaptcha response - if (AccountsTemplates.options.showReCaptcha) { - var response = grecaptcha.getResponse(); - if (response === "") { - // recaptcha verification has not completed yet (or has expired)... - // ...simply ignore submit event! - AccountsTemplates.setDisabled(false); - return; - } else { - formData.reCaptchaResponse = response; - } - } - - var hash = Accounts._hashPassword(password); - var options = { - username: username, - email: email, - password: hash, - profile: formData, - }; - - // Call preSignUpHook, if any... - var preSignUpHook = AccountsTemplates.options.preSignUpHook; - if (preSignUpHook) { - preSignUpHook(password, options); - } - - return Meteor.call("ATCreateUserServer", options, function(error){ - if (error && error.reason === 'Email already exists.') { - if (AccountsTemplates.options.showReCaptcha) { - grecaptcha.reset(); - } - } - AccountsTemplates.submitCallback(error, undefined, function(){ - if (AccountsTemplates.options.sendVerificationEmail && AccountsTemplates.options.enforceEmailVerification){ - AccountsTemplates.submitCallback(error, state, function () { - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.signUpVerifyEmail); - // Cleans up input fields' content - _.each(AccountsTemplates.getFields(), function(field){ - // Considers only visible fields... - if (!_.contains(field.visible, state)) - return; - - var elem = t.$("#at-field-" + field._id); - - // Naïve reset - if (field.type === "checkbox") elem.prop('checked', false); - else elem.val(""); - - }); - AccountsTemplates.setDisabled(false); - AccountsTemplates.avoidRedirect = true; - }); - } - else { - var loginSelector; - - if (email) { - if (AccountsTemplates.options.lowercaseUsername) { - email = toLowercaseUsername(email); - } - - loginSelector = {email: email}; - } - else if (username) { - if (AccountsTemplates.options.lowercaseUsername) { - username = toLowercaseUsername(username); - } - loginSelector = {username: username}; - } - else { - if (AccountsTemplates.options.lowercaseUsername) { - username_and_email = toLowercaseUsername(username_and_email); - } - loginSelector = username_and_email; - } - - Meteor.loginWithPassword(loginSelector, password, function(error) { - AccountsTemplates.submitCallback(error, state, function(){ - AccountsTemplates.setState("signIn"); - }); - }); - } - }); - }); - } - - //---------------- - // Forgot Password - //---------------- - if (state === "forgotPwd"){ - return Accounts.forgotPassword({ - email: email - }, function(error) { - AccountsTemplates.submitCallback(error, state, function(){ - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.emailSent); - t.$("#at-field-email").val(""); - }); - }); - } - - //-------------------------------- - // Reset Password / Enroll Account - //-------------------------------- - if (state === "resetPwd" || state === "enrollAccount") { - var paramToken = AccountsTemplates.getparamToken(); - return Accounts.resetPassword(paramToken, password, function(error) { - AccountsTemplates.submitCallback(error, state, function(){ - var pwd_field_id; - if (state === "resetPwd") - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdReset); - else // Enroll Account - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdSet); - t.$("#at-field-password").val(""); - if (AccountsTemplates.options.confirmPassword) - t.$("#at-field-password_again").val(""); - }); - }); - } - - //---------------- - // Change Password - //---------------- - if (state === "changePwd"){ - return Accounts.changePassword(current_password, password, function(error) { - AccountsTemplates.submitCallback(error, state, function(){ - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdChanged); - t.$("#at-field-current_password").val(""); - t.$("#at-field-password").val(""); - if (AccountsTemplates.options.confirmPassword) - t.$("#at-field-password_again").val(""); - }); - }); - } - - //---------------- - // Resend Verification E-mail - //---------------- - if (state === "resendVerificationEmail"){ - return Meteor.call("ATResendVerificationEmail", email, function (error) { - AccountsTemplates.submitCallback(error, state, function(){ - AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.verificationEmailSent); - t.$("#at-field-email").val(""); - - AccountsTemplates.avoidRedirect = true; - }); - }); - } - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js deleted file mode 100644 index fc2636232..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form_btn.js +++ /dev/null @@ -1,18 +0,0 @@ -AT.prototype.atPwdFormBtnHelpers = { - submitDisabled: function(){ - var disable = _.chain(AccountsTemplates.getFields()) - .map(function(field){ - return field.hasError() || field.isValidating(); - }) - .some() - .value() - ; - if (disable) - return "disabled"; - }, - buttonText: function() { - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return T9n.get(AccountsTemplates.texts.button[state], markIfMissing=false); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js deleted file mode 100644 index dd93a398e..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_link.js +++ /dev/null @@ -1,24 +0,0 @@ -AT.prototype.atPwdLinkHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - forgotPwdLink: function(){ - return AccountsTemplates.getRoutePath("forgotPwd"); - }, - preText: function(){ - return T9n.get(AccountsTemplates.texts.pwdLink_pre, markIfMissing=false); - }, - linkText: function(){ - return T9n.get(AccountsTemplates.texts.pwdLink_link, markIfMissing=false); - }, - suffText: function(){ - return T9n.get(AccountsTemplates.texts.pwdLink_suff, markIfMissing=false); - }, -}; - -AT.prototype.atPwdLinkEvents = { - "click #at-forgotPwd": function(event, t) { - event.preventDefault(); - AccountsTemplates.linkClick("forgotPwd"); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js deleted file mode 100644 index ea0c0c694..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_reCaptcha.js +++ /dev/null @@ -1,19 +0,0 @@ -AT.prototype.atReCaptchaRendered = function() { - $.getScript('//www.google.com/recaptcha/api.js?hl=' + T9n.getLanguage()); -}; - -AT.prototype.atReCaptchaHelpers = { - key: function() { - if (AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.siteKey) - return AccountsTemplates.options.reCaptcha.siteKey; - return Meteor.settings.public.reCaptcha.siteKey; - }, - - theme: function() { - return AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.theme; - }, - - data_type: function() { - return AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.data_type; - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js deleted file mode 100644 index 5587900c6..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_resend_verification_email_link.js +++ /dev/null @@ -1,24 +0,0 @@ -AT.prototype.atResendVerificationEmailLinkHelpers = { - disabled: function () { - return AccountsTemplates.disabled(); - }, - resendVerificationEmailLink: function () { - return AccountsTemplates.getRoutePath("resendVerificationEmail"); - }, - preText: function(){ - return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_pre, markIfMissing=false); - }, - linkText: function(){ - return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_link, markIfMissing=false); - }, - suffText: function(){ - return T9n.get(AccountsTemplates.texts.resendVerificationEmailLink_suff, markIfMissing=false); - }, -}; - -AT.prototype.atResendVerificationEmailLinkEvents = { - "click #at-resend-verification-email": function(event, t) { - event.preventDefault(); - AccountsTemplates.linkClick('resendVerificationEmail'); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js deleted file mode 100644 index d4b287dd0..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_result.js +++ /dev/null @@ -1,7 +0,0 @@ -AT.prototype.atResultHelpers = { - result: function() { - var resultText = AccountsTemplates.state.form.get("result"); - if (resultText) - return T9n.get(resultText, markIfMissing=false); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js deleted file mode 100644 index 7c27557d3..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_sep.js +++ /dev/null @@ -1,5 +0,0 @@ -AT.prototype.atSepHelpers = { - sepText: function(){ - return T9n.get(AccountsTemplates.texts.sep, markIfMissing=false); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js deleted file mode 100644 index 14f6e88c1..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signin_link.js +++ /dev/null @@ -1,24 +0,0 @@ -AT.prototype.atSigninLinkHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - signInLink: function(){ - return AccountsTemplates.getRoutePath("signIn"); - }, - preText: function(){ - return T9n.get(AccountsTemplates.texts.signInLink_pre, markIfMissing=false); - }, - linkText: function(){ - return T9n.get(AccountsTemplates.texts.signInLink_link, markIfMissing=false); - }, - suffText: function(){ - return T9n.get(AccountsTemplates.texts.signInLink_suff, markIfMissing=false); - }, -}; - -AT.prototype.atSigninLinkEvents = { - "click #at-signIn": function(event, t) { - event.preventDefault(); - AccountsTemplates.linkClick("signIn"); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js deleted file mode 100644 index 29c809a4a..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_signup_link.js +++ /dev/null @@ -1,24 +0,0 @@ -AT.prototype.atSignupLinkHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - signUpLink: function(){ - return AccountsTemplates.getRoutePath("signUp"); - }, - preText: function(){ - return T9n.get(AccountsTemplates.texts.signUpLink_pre, markIfMissing=false); - }, - linkText: function(){ - return T9n.get(AccountsTemplates.texts.signUpLink_link, markIfMissing=false); - }, - suffText: function(){ - return T9n.get(AccountsTemplates.texts.signUpLink_suff, markIfMissing=false); - }, -}; - -AT.prototype.atSignupLinkEvents = { - "click #at-signUp": function(event, t) { - event.preventDefault(); - AccountsTemplates.linkClick('signUp'); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js deleted file mode 100644 index 912fd6e9e..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_social.js +++ /dev/null @@ -1,105 +0,0 @@ -AT.prototype.atSocialHelpers = { - disabled: function() { - if (AccountsTemplates.disabled()) - return "disabled"; - var user = Meteor.user(); - if (user){ - var numServices = 0; - if (user.services) - numServices = _.keys(user.services).length; // including "resume" - if (numServices === 2 && user.services[this._id]) - return "disabled"; - } - }, - name: function(){ - return this._id; - }, - iconClass: function() { - var ic = AccountsTemplates.texts.socialIcons[this._id]; - if (!ic) - ic = "fa fa-" + this._id; - return ic; - }, - buttonText: function() { - var service = this; - var serviceName = this._id; - if (serviceName === "meteor-developer") - serviceName = "meteor"; - serviceName = capitalize(serviceName); - if (!service.configured) - return T9n.get(AccountsTemplates.texts.socialConfigure, markIfMissing=false) + " " + serviceName; - var showAddRemove = AccountsTemplates.options.showAddRemoveServices; - var user = Meteor.user(); - if (user && showAddRemove){ - if (user.services && user.services[this._id]){ - var numServices = _.keys(user.services).length; // including "resume" - if (numServices === 2) - return serviceName; - else - return T9n.get(AccountsTemplates.texts.socialRemove, markIfMissing=false) + " " + serviceName; - } else - return T9n.get(AccountsTemplates.texts.socialAdd, markIfMissing=false) + " " + serviceName; - } - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - var prefix = state === "signIn" ? - T9n.get(AccountsTemplates.texts.socialSignIn, markIfMissing=false) : - T9n.get(AccountsTemplates.texts.socialSignUp, markIfMissing=false); - return prefix + " " + T9n.get(AccountsTemplates.texts.socialWith, markIfMissing=false) + " " + serviceName; - }, -}; - -AT.prototype.atSocialEvents = { - "click button": function(event, t) { - event.preventDefault(); - event.currentTarget.blur(); - if (AccountsTemplates.disabled()) - return; - var user = Meteor.user(); - if (user && user.services && user.services[this._id]){ - var numServices = _.keys(user.services).length; // including "resume" - if (numServices === 2) - return; - else{ - AccountsTemplates.setDisabled(true); - Meteor.call("ATRemoveService", this._id, function(error){ - AccountsTemplates.setDisabled(false); - }); - } - } else { - AccountsTemplates.setDisabled(true); - var parentData = Template.parentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - var serviceName = this._id; - var methodName; - if (serviceName === 'meteor-developer') - methodName = "loginWithMeteorDeveloperAccount"; - else - methodName = "loginWith" + capitalize(serviceName); - var loginWithService = Meteor[methodName]; - options = { - loginStyle: AccountsTemplates.options.socialLoginStyle, - }; - if (Accounts.ui) { - if (Accounts.ui._options.requestPermissions[serviceName]) { - options.requestPermissions = Accounts.ui._options.requestPermissions[serviceName]; - } - if (Accounts.ui._options.requestOfflineToken[serviceName]) { - options.requestOfflineToken = Accounts.ui._options.requestOfflineToken[serviceName]; - } - } - loginWithService(options, function(err) { - AccountsTemplates.setDisabled(false); - if (err && err instanceof Accounts.LoginCancelledError) { - // do nothing - } - else if (err && err instanceof ServiceConfiguration.ConfigError) { - if (Accounts._loginButtonsSession) - return Accounts._loginButtonsSession.configureService(serviceName); - } - else - AccountsTemplates.submitCallback(err, state); - }); - } - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js deleted file mode 100644 index 0ada35cbd..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_terms_link.js +++ /dev/null @@ -1,33 +0,0 @@ -AT.prototype.atTermsLinkHelpers = { - disabled: function() { - return AccountsTemplates.disabled(); - }, - text: function(){ - return T9n.get(AccountsTemplates.texts.termsPreamble, markIfMissing=false); - }, - privacyUrl: function(){ - return AccountsTemplates.options.privacyUrl; - }, - privacyLinkText: function(){ - return T9n.get(AccountsTemplates.texts.termsPrivacy, markIfMissing=false); - }, - showTermsAnd: function(){ - return !!AccountsTemplates.options.privacyUrl && !!AccountsTemplates.options.termsUrl; - }, - and: function(){ - return T9n.get(AccountsTemplates.texts.termsAnd, markIfMissing=false); - }, - termsUrl: function(){ - return AccountsTemplates.options.termsUrl; - }, - termsLinkText: function(){ - return T9n.get(AccountsTemplates.texts.termsTerms, markIfMissing=false); - }, -}; - -AT.prototype.atTermsLinkEvents = { - "click a": function(event) { - if (AccountsTemplates.disabled()) - event.preventDefault(); - }, -}; \ No newline at end of file diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js deleted file mode 100644 index 74f711b9e..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/at_title.js +++ /dev/null @@ -1,7 +0,0 @@ -AT.prototype.atTitleHelpers = { - title: function() { - var parentData = Template.currentData(); - var state = (parentData && parentData.state) || AccountsTemplates.getState(); - return T9n.get(AccountsTemplates.texts.title[state], markIfMissing = false); - }, -}; diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html deleted file mode 100644 index 08c0d7e3e..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.html +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js b/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js deleted file mode 100644 index 3d947aaec..000000000 --- a/packages/meteor-useraccounts-core/lib/templates_helpers/ensure_signed_in.js +++ /dev/null @@ -1,15 +0,0 @@ - -Template.ensureSignedIn.helpers({ - signedIn: function () { - if (!Meteor.user()) { - AccountsTemplates.setState(AccountsTemplates.options.defaultState, function(){ - var err = AccountsTemplates.texts.errors.mustBeLoggedIn; - AccountsTemplates.state.form.set('error', [err]); - }); - return false; - } else { - AccountsTemplates.clearError(); - return true; - } - } -}); diff --git a/packages/meteor-useraccounts-core/lib/utils.js b/packages/meteor-useraccounts-core/lib/utils.js deleted file mode 100644 index 30b108cad..000000000 --- a/packages/meteor-useraccounts-core/lib/utils.js +++ /dev/null @@ -1,19 +0,0 @@ -capitalize = function(str) { - return str.charAt(0).toUpperCase() + str.slice(1); -}; - -signedInAs = function() { - var user = Meteor.user(); - - if (user) { - if (user.username) { - return user.username; - } else if (user.profile && user.profile.name) { - return user.profile.name; - } else if (user.emails && user.emails[0]) { - return user.emails[0].address; - } else { - return "Signed In"; - } - } -}; diff --git a/packages/meteor-useraccounts-core/package.js b/packages/meteor-useraccounts-core/package.js deleted file mode 100644 index f6e0ca32b..000000000 --- a/packages/meteor-useraccounts-core/package.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict'; - -Package.describe({ - summary: 'Meteor sign up and sign in templates core package.', - version: '1.14.2', - name: 'useraccounts:core', - git: 'https://github.com/meteor-useraccounts/core.git', -}); - -Package.onUse(function(api) { - //api.versionsFrom('METEOR@1.0.3'); - - api.use([ - 'accounts-base', - 'check', - 'underscore', - 'reactive-var', - ], ['client', 'server']); - - api.use([ - 'blaze', - 'reactive-dict', - 'templating', - 'jquery' - ], 'client'); - - api.use([ - 'http' - ], 'server'); - - api.imply([ - 'accounts-base', - 'softwarerero:accounts-t9n@1.3.3', - ], ['client', 'server']); - - api.imply([ - 'templating', - ], ['client']); - - api.addFiles([ - 'lib/field.js', - 'lib/core.js', - 'lib/server.js', - 'lib/methods.js', - 'lib/server_methods.js', - ], ['server']); - - api.addFiles([ - 'lib/utils.js', - 'lib/field.js', - 'lib/core.js', - 'lib/client.js', - 'lib/templates_helpers/at_error.js', - 'lib/templates_helpers/at_form.js', - 'lib/templates_helpers/at_input.js', - 'lib/templates_helpers/at_nav_button.js', - 'lib/templates_helpers/at_oauth.js', - 'lib/templates_helpers/at_pwd_form.js', - 'lib/templates_helpers/at_pwd_form_btn.js', - 'lib/templates_helpers/at_pwd_link.js', - 'lib/templates_helpers/at_reCaptcha.js', - 'lib/templates_helpers/at_resend_verification_email_link.js', - 'lib/templates_helpers/at_result.js', - 'lib/templates_helpers/at_sep.js', - 'lib/templates_helpers/at_signin_link.js', - 'lib/templates_helpers/at_signup_link.js', - 'lib/templates_helpers/at_social.js', - 'lib/templates_helpers/at_terms_link.js', - 'lib/templates_helpers/at_title.js', - 'lib/templates_helpers/at_message.js', - 'lib/templates_helpers/ensure_signed_in.html', - 'lib/templates_helpers/ensure_signed_in.js', - 'lib/methods.js', - ], ['client']); - - api.export([ - 'AccountsTemplates', - ], ['client', 'server']); -}); - -Package.onTest(function(api) { - api.use('useraccounts:core@1.14.2'); - - api.use([ - 'accounts-password', - 'tinytest', - 'test-helpers', - 'underscore', - ], ['client', 'server']); - - api.addFiles([ - 'tests/tests.js', - ], ['client', 'server']); -}); diff --git a/packages/meteor-useraccounts-core/tests/tests.js b/packages/meteor-useraccounts-core/tests/tests.js deleted file mode 100644 index 985200a36..000000000 --- a/packages/meteor-useraccounts-core/tests/tests.js +++ /dev/null @@ -1,215 +0,0 @@ -Tinytest.add("AccountsTemplates - addField/removeField", function(test) { - // Calls after AccountsTemplates.init() - AccountsTemplates._initialized = true; - test.throws(function() { - AccountsTemplates.addField(""); - }, function(err) { - if (err instanceof Error && err.message === "AccountsTemplates.addField should strictly be called before AccountsTemplates.init!") - return true; - }); - test.throws(function() { - AccountsTemplates.removeField(""); - }, function(err) { - if (err instanceof Error && err.message === "AccountsTemplates.removeField should strictly be called before AccountsTemplates.init!") - return true; - }); - AccountsTemplates._initialized = false; - - // Trying to remove a non-existing field - test.throws(function() { - AccountsTemplates.removeField("foo"); - }, function(err) { - if (err instanceof Error && err.message == "A field called foo does not exist!") - return true; - }); - - // Trying to remove an existing field - var email = AccountsTemplates.removeField("email"); - test.isUndefined(AccountsTemplates.getField("email")); - // ...and puts it back in for tests re-run - AccountsTemplates.addField(email); - - // Trying to add an already existing field - test.throws(function() { - var pwd = AccountsTemplates.getField("password"); - AccountsTemplates.addField(pwd); - }, function(err) { - if (err instanceof Error && err.message == "A field called password already exists!") - return true; - }); - - var login = { - _id: "login", - displayName: "Email", - type: "email" - }; - - // Successful add - AccountsTemplates.addField(login); - // ...and removes it for tests re-run - AccountsTemplates.removeField("login"); - - // Invalid field.type - test.throws(function() { - AccountsTemplates.addField({ - _id: "foo", - displayName: "Foo", - type: "bar" - }); - }, function(err) { - if (err instanceof Error && err.message == "field.type is not valid!") - return true; - }); - - // Invalid minLength - test.throws(function() { - AccountsTemplates.addField({ - _id: "first-name", - displayName: "First Name", - type: "text", - minLength: 0 - }); - }, function(err) { - if (err instanceof Error && err.message == "field.minLength should be greater than zero!") - return true; - }); - // Invalid maxLength - test.throws(function() { - AccountsTemplates.addField({ - _id: "first-name", - displayName: "First Name", - type: "text", - maxLength: 0 - }); - }, function(err) { - if (err instanceof Error && err.message == "field.maxLength should be greater than zero!") - return true; - }); - // maxLength < minLength - test.throws(function() { - AccountsTemplates.addField({ - _id: "first-name", - displayName: "First Name", - type: "text", - minLength: 2, - maxLength: 1 - }); - }, function(err) { - if (err instanceof Error && err.message == "field.maxLength should be greater than field.maxLength!") - return true; - }); - - // Successful add - var first_name = { - _id: "first_name", - displayName: "First Name", - type: "text", - minLength: 2, - maxLength: 50, - required: true - }; - AccountsTemplates.addField(first_name); - // Now removes it to be consistent with tests re-run - AccountsTemplates.removeField("first_name"); -}); - - -Tinytest.add("AccountsTemplates - addFields", function(test) { - // Fake uninitialized state... - AccountsTemplates._initialized = false; - - if (Meteor.isClient) { - // addFields does not exist client-side - test.throws(function() { - AccountsTemplates.addFields(); - }); - } else { - // Not an array of objects - test.throws(function() { - AccountsTemplates.addFields(""); - }, function(err) { - if (err instanceof Error && err.message === "field argument should be an array of valid field objects!") - return true; - }); - test.throws(function() { - AccountsTemplates.addFields(100); - }, function(err) { - if (err instanceof Error && err.message === "field argument should be an array of valid field objects!") - return true; - }); - // Empty array - test.throws(function() { - AccountsTemplates.addFields([]); - }, function(err) { - if (err instanceof Error && err.message === "field argument should be an array of valid field objects!") - return true; - }); - - // Successful add - var first_name = { - _id: "first_name", - displayName: "First Name", - type: "text", - minLength: 2, - maxLength: 50, - required: true - }; - var last_name = { - _id: "last_name", - displayName: "Last Name", - type: "text", - minLength: 2, - maxLength: 100, - required: false - }; - AccountsTemplates.addFields([first_name, last_name]); - // Now removes ot to be consistend with tests re-run - AccountsTemplates.removeField("first_name"); - AccountsTemplates.removeField("last_name"); - } - // Restores initialized state... - AccountsTemplates._initialized = true; -}); - - -Tinytest.add("AccountsTemplates - setState/getState", function(test) { - if (Meteor.isServer) { - // getState does not exist server-side - test.throws(function() { - AccountsTemplates.getState(); - }); - // setState does not exist server-side - test.throws(function() { - AccountsTemplates.setState(); - }); - } else { - _.each(AccountsTemplates.STATES, function(state){ - AccountsTemplates.setState(state); - test.equal(AccountsTemplates.getState(), state); - }); - // Setting an invalid state should throw a Meteor.Error - test.throws(function() { - AccountsTemplates.setState("foo"); - }, function(err) { - if (err instanceof Meteor.Error && err.details == "accounts-templates-core package got an invalid state value!") - return true; - }); - } -}); - - -// ------------------------------------- -// TODO: complite the following tests... -// ------------------------------------- - - -Tinytest.add("AccountsTemplates - configure", function(test) { - if (Meteor.isClient) { - // configure does not exist client-side - test.throws(function() { - AccountsTemplates.configure({}); - }); - } else { - // TODO: write actual tests... - } -}); \ No newline at end of file diff --git a/packages/meteorx/package.js b/packages/meteorx/package.js deleted file mode 100644 index 0bdad1cab..000000000 --- a/packages/meteorx/package.js +++ /dev/null @@ -1,13 +0,0 @@ -Package.describe({ - name: 'meteorhacks:meteorx', - summary: 'Proxy for getting another meteorx fork', - version: '1.4.1' -}); - -Package.onUse((api) => { - api.export('MeteorX'); - api.use([ - 'lamhieu:meteorx', - ]); -}); - diff --git a/packages/wekan-accounts-cas/README.md b/packages/wekan-accounts-cas/README.md deleted file mode 100644 index 3e246c4f1..000000000 --- a/packages/wekan-accounts-cas/README.md +++ /dev/null @@ -1,88 +0,0 @@ -This is a merged repository of useful forks of: atoy40:accounts-cas -=================== -([(https://atmospherejs.com/atoy40/accounts-cas](https://atmospherejs.com/atoy40/accounts-cas)) - -## Essential improvements by ppoulard to atoy40 and xaionaro versions - -* Added support of CAS attributes - -With this plugin, you can pick CAS attributes : https://github.com/joshchan/node-cas/wiki/CAS-Attributes - -Moved to Wekan GitHub org from from https://github.com/ppoulard/meteor-accounts-cas - -## Install - -``` -cd ~site -mkdir packages -cd packages -git clone https://github.com/wekan/meteor-accounts-cas -cd ~site -meteor add wekan:accounts-cas -``` - -## Usage - -Put CAS settings in Meteor.settings (for example using METEOR_SETTINGS env or --settings) like so: - -If casVersion is not defined, it will assume you use CAS 1.0. (note by xaionaro: option `casVersion` seems to be just ignored in the code, ATM). - -Server side settings: - -``` -Meteor.settings = { - "cas": { - "baseUrl": "https://cas.example.com/cas", - "autoClose": true, - "validateUrl":"https://cas.example.com/cas/p3/serviceValidate", - "casVersion": 3.0, - "attributes": { - "debug" : true - } - }, -} -``` - -CAS `attributes` settings : - -* `attributes`: by default `{}` : all default values below will apply -* * `debug` : by default `false` ; `true` will print to the server console the CAS attribute names to map, the CAS attributes values retrieved, if necessary the new user account created, and finally the user to use -* * `id` : by default, the CAS user is used for the user account, but you can specified another CAS attribute -* * `firstname` : by default `cas:givenName` ; but you can use your own CAS attribute -* * `lastname` : by default `cas:sn` (respectively) ; but you can use your own CAS attribute -* * `fullname` : by default unused, but if you specify your own CAS attribute, it will be used instead of the `firstname` + `lastname` -* * `mail` : by default `cas:mail` - -Client side settings: - -``` -Meteor.settings = { - "public": { - "cas": { - "loginUrl": "https://cas.example.com/login", - "serviceParam": "service", - "popupWidth": 810, - "popupHeight": 610, - "popup": true, - } - } -} -``` - -`proxyUrl` is not required. Setup [ROOT_URL](http://docs.meteor.com/api/core.html#Meteor-absoluteUrl) environment variable instead. - -Then, to start authentication, you have to call the following method from the client (for example in a click handler) : - -``` -Meteor.loginWithCas([callback]); -``` - -It must open a popup containing you CAS login form or redirect to the CAS login form (depending on "popup" setting). - -If popup is disabled (== false), then it's required to execute `Meteor.initCas([callback])` in `Meteor.startup` of the client side. ATM, `Meteor.initCas()` completes authentication. - -## Examples - -* [https://devel.mephi.ru/dyokunev/start-mephi-ru](https://devel.mephi.ru/dyokunev/start-mephi-ru) - - diff --git a/packages/wekan-accounts-cas/cas_client.js b/packages/wekan-accounts-cas/cas_client.js deleted file mode 100644 index bd94be6be..000000000 --- a/packages/wekan-accounts-cas/cas_client.js +++ /dev/null @@ -1,112 +0,0 @@ - -function addParameterToURL(url, param){ - var urlSplit = url.split('?'); - return url+(urlSplit.length>0 ? '?':'&') + param; -} - -Meteor.initCas = function(callback) { - const casTokenMatch = window.location.href.match(/[?&]casToken=([^&]+)/); - if (casTokenMatch == null) { - return; - } - - window.history.pushState('', document.title, window.location.href.replace(/([&?])casToken=[^&]+[&]?/, '$1').replace(/[?&]+$/g, '')); - - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: casTokenMatch[1] } }], - userCallback: function(err){ - if (err == null) { - // should we do anything on success? - } - if (callback != null) { - callback(err); - } - } - }); -} - -Meteor.loginWithCas = function(options, callback) { - - var credentialToken = Random.id(); - - if (!Meteor.settings.public && - !Meteor.settings.public.cas && - !Meteor.settings.public.cas.loginUrl) { - return; - } - - var settings = Meteor.settings.public.cas; - - var backURL = window.location.href.replace('#', ''); - if (options != null && options.redirectUrl != null) - backURL = options.redirectUrl; - - var serviceURL = addParameterToURL(backURL, 'casToken='+credentialToken); - - var loginUrl = settings.loginUrl + - "?" + (settings.serviceParam || "service") + "=" + - encodeURIComponent(serviceURL) - - if (settings.popup == false) { - window.location = loginUrl; - return; - } - - var popup = openCenteredPopup( - loginUrl, - settings.width || 800, - settings.height || 600 - ); - - var checkPopupOpen = setInterval(function() { - try { - if(popup && popup.document && popup.document.getElementById('popupCanBeClosed')) { - popup.close(); - } - // Fix for #328 - added a second test criteria (popup.closed === undefined) - // to humour this Android quirk: - // http://code.google.com/p/android/issues/detail?id=21061 - var popupClosed = popup.closed || popup.closed === undefined; - } catch (e) { - // For some unknown reason, IE9 (and others?) sometimes (when - // the popup closes too quickly?) throws "SCRIPT16386: No such - // interface supported" when trying to read 'popup.closed'. Try - // again in 100ms. - return; - } - - if (popupClosed) { - clearInterval(checkPopupOpen); - - // check auth on server. - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: credentialToken } }], - userCallback: callback - }); - } - }, 100); -}; - -var openCenteredPopup = function(url, width, height) { - var screenX = typeof window.screenX !== 'undefined' - ? window.screenX : window.screenLeft; - var screenY = typeof window.screenY !== 'undefined' - ? window.screenY : window.screenTop; - var outerWidth = typeof window.outerWidth !== 'undefined' - ? window.outerWidth : document.body.clientWidth; - var outerHeight = typeof window.outerHeight !== 'undefined' - ? window.outerHeight : (document.body.clientHeight - 22); - // XXX what is the 22? - - // Use `outerWidth - width` and `outerHeight - height` for help in - // positioning the popup centered relative to the current window - var left = screenX + (outerWidth - width) / 2; - var top = screenY + (outerHeight - height) / 2; - var features = ('width=' + width + ',height=' + height + - ',left=' + left + ',top=' + top + ',scrollbars=yes'); - - var newwindow = window.open(url, '_blank', features); - if (newwindow.focus) - newwindow.focus(); - return newwindow; -}; diff --git a/packages/wekan-accounts-cas/cas_client_cordova.js b/packages/wekan-accounts-cas/cas_client_cordova.js deleted file mode 100644 index c7f95b500..000000000 --- a/packages/wekan-accounts-cas/cas_client_cordova.js +++ /dev/null @@ -1,71 +0,0 @@ - -Meteor.loginWithCas = function(callback) { - - var credentialToken = Random.id(); - - if (!Meteor.settings.public && - !Meteor.settings.public.cas && - !Meteor.settings.public.cas.loginUrl) { - return; - } - - var settings = Meteor.settings.public.cas; - - var loginUrl = settings.loginUrl + - "?" + (settings.service || "service") + "=" + - Meteor.absoluteUrl('_cas/') + - credentialToken; - - - var fail = function (err) { - Meteor._debug("Error from OAuth popup: " + JSON.stringify(err)); - }; - - // When running on an android device, we sometimes see the - // `pageLoaded` callback fire twice for the final page in the OAuth - // popup, even though the page only loads once. This is maybe an - // Android bug or maybe something intentional about how onPageFinished - // works that we don't understand and isn't well-documented. - var oauthFinished = false; - - var pageLoaded = function (event) { - if (oauthFinished) { - return; - } - - if (event.url.indexOf(Meteor.absoluteUrl('_cas')) === 0) { - - oauthFinished = true; - - // On iOS, this seems to prevent "Warning: Attempt to dismiss from - // view controller while a presentation - // or dismiss is in progress". My guess is that the last - // navigation of the OAuth popup is still in progress while we try - // to close the popup. See - // https://issues.apache.org/jira/browse/CB-2285. - // - // XXX Can we make this timeout smaller? - setTimeout(function () { - popup.close(); - // check auth on server. - Accounts.callLoginMethod({ - methodArguments: [{ cas: { credentialToken: credentialToken } }], - userCallback: callback - }); - }, 100); - } - }; - - var onExit = function () { - popup.removeEventListener('loadstop', pageLoaded); - popup.removeEventListener('loaderror', fail); - popup.removeEventListener('exit', onExit); - }; - - var popup = window.open(loginUrl, '_blank', 'location=no,hidden=no'); - popup.addEventListener('loadstop', pageLoaded); - popup.addEventListener('loaderror', fail); - popup.addEventListener('exit', onExit); - popup.show(); - -}; \ No newline at end of file diff --git a/packages/wekan-accounts-cas/cas_server.js b/packages/wekan-accounts-cas/cas_server.js deleted file mode 100644 index c13a6df19..000000000 --- a/packages/wekan-accounts-cas/cas_server.js +++ /dev/null @@ -1,281 +0,0 @@ -"use strict"; - -const Fiber = Npm.require('fibers'); -const https = Npm.require('https'); -const url = Npm.require('url'); -const xmlParser = Npm.require('xml2js'); - -// Library -class CAS { - constructor(options) { - options = options || {}; - - if (!options.validate_url) { - throw new Error('Required CAS option `validateUrl` missing.'); - } - - if (!options.service) { - throw new Error('Required CAS option `service` missing.'); - } - - const cas_url = url.parse(options.validate_url); - if (cas_url.protocol != 'https:' ) { - throw new Error('Only https CAS servers are supported.'); - } else if (!cas_url.hostname) { - throw new Error('Option `validateUrl` must be a valid url like: https://example.com/cas/serviceValidate'); - } else { - this.hostname = cas_url.host; - this.port = 443;// Should be 443 for https - this.validate_path = cas_url.pathname; - } - - this.service = options.service; - } - - validate(ticket, callback) { - const httparams = { - host: this.hostname, - port: this.port, - path: url.format({ - pathname: this.validate_path, - query: {ticket: ticket, service: this.service}, - }), - }; - - https.get(httparams, (res) => { - res.on('error', (e) => { - console.log('error' + e); - callback(e); - }); - - // Read result - res.setEncoding('utf8'); - let response = ''; - res.on('data', (chunk) => { - response += chunk; - }); - - res.on('end', (error) => { - if (error) { - console.log('error callback'); - console.log(error); - callback(undefined, false); - } else { - xmlParser.parseString(response, (err, result) => { - if (err) { - console.log('Bad response format.'); - callback({message: 'Bad response format. XML could not parse it'}); - } else { - if (result['cas:serviceResponse'] == null) { - console.log('Empty response.'); - callback({message: 'Empty response.'}); - } - if (result['cas:serviceResponse']['cas:authenticationSuccess']) { - var userData = { - id: result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:user'][0].toLowerCase(), - } - const attributes = result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:attributes'][0]; - for (var fieldName in attributes) { - userData[fieldName] = attributes[fieldName][0]; - }; - callback(undefined, true, userData); - } else { - callback(undefined, false); - } - } - }); - } - }); - }); - } -} -////// END OF CAS MODULE - -let _casCredentialTokens = {}; -let _userData = {}; - -//RoutePolicy.declare('/_cas/', 'network'); - -// Listen to incoming OAuth http requests -WebApp.connectHandlers.use((req, res, next) => { - // Need to create a Fiber since we're using synchronous http calls and nothing - // else is wrapping this in a fiber automatically - - Fiber(() => { - middleware(req, res, next); - }).run(); -}); - -const middleware = (req, res, next) => { - // Make sure to catch any exceptions because otherwise we'd crash - // the runner - try { - urlParsed = url.parse(req.url, true); - - // Getting the ticket (if it's defined in GET-params) - // If no ticket, then request will continue down the default - // middlewares. - const query = urlParsed.query; - if (query == null) { - next(); - return; - } - const ticket = query.ticket; - if (ticket == null) { - next(); - return; - } - - const serviceUrl = Meteor.absoluteUrl(urlParsed.href.replace(/^\//g, '')).replace(/([&?])ticket=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); - const redirectUrl = serviceUrl;//.replace(/([&?])casToken=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); - - // get auth token - const credentialToken = query.casToken; - if (!credentialToken) { - end(res, redirectUrl); - return; - } - - // validate ticket - casValidate(req, ticket, credentialToken, serviceUrl, () => { - end(res, redirectUrl); - }); - - } catch (err) { - console.log("account-cas: unexpected error : " + err.message); - end(res, redirectUrl); - } -}; - -const casValidate = (req, ticket, token, service, callback) => { - // get configuration - if (!Meteor.settings.cas/* || !Meteor.settings.cas.validate*/) { - throw new Error('accounts-cas: unable to get configuration.'); - } - - const cas = new CAS({ - validate_url: Meteor.settings.cas.validateUrl, - service: service, - version: Meteor.settings.cas.casVersion - }); - - cas.validate(ticket, (err, status, userData) => { - if (err) { - console.log("accounts-cas: error when trying to validate " + err); - console.log(err); - } else { - if (status) { - console.log(`accounts-cas: user validated ${userData.id} - (${JSON.stringify(userData)})`); - _casCredentialTokens[token] = { id: userData.id }; - _userData = userData; - } else { - console.log("accounts-cas: unable to validate " + ticket); - } - } - callback(); - }); - - return; -}; - -/* - * Register a server-side login handle. - * It is call after Accounts.callLoginMethod() is call from client. - */ - Accounts.registerLoginHandler((options) => { - if (!options.cas) - return undefined; - - if (!_hasCredential(options.cas.credentialToken)) { - throw new Meteor.Error(Accounts.LoginCancelledError.numericError, - 'no matching login attempt found'); - } - - const result = _retrieveCredential(options.cas.credentialToken); - - const attrs = Meteor.settings.cas.attributes || {}; - // CAS keys - const fn = attrs.firstname || 'cas:givenName'; - const ln = attrs.lastname || 'cas:sn'; - const full = attrs.fullname; - const mail = attrs.mail || 'cas:mail'; // or 'email' - const uid = attrs.id || 'id'; - if (attrs.debug) { - if (full) { - console.log(`CAS fields : id:"${uid}", fullname:"${full}", mail:"${mail}"`); - } else { - console.log(`CAS fields : id:"${uid}", firstname:"${fn}", lastname:"${ln}", mail:"${mail}"`); - } - } - const name = full ? _userData[full] : _userData[fn] + ' ' + _userData[ln]; - // https://docs.meteor.com/api/accounts.html#Meteor-users - options = { - // _id: Meteor.userId() - username: _userData[uid], // Unique name - emails: [ - { address: _userData[mail], verified: true } - ], - createdAt: new Date(), - profile: { - // The profile is writable by the user by default. - name: name, - fullname : name, - email : _userData[mail] - }, - active: true, - globalRoles: ['user'] - }; - if (attrs.debug) { - console.log(`CAS response : ${JSON.stringify(result)}`); - } - let user = Users.findOne({ 'username': options.username }); - if (! user) { - if (attrs.debug) { - console.log(`Creating user account ${JSON.stringify(options)}`); - } - const userId = Accounts.insertUserDoc({}, options); - user = Users.findOne(userId); - } - if (attrs.debug) { - console.log(`Using user account ${JSON.stringify(user)}`); - } - return { userId: user._id }; -}); - -const _hasCredential = (credentialToken) => { - return _.has(_casCredentialTokens, credentialToken); -} - -/* - * Retrieve token and delete it to avoid replaying it. - */ -const _retrieveCredential = (credentialToken) => { - const result = _casCredentialTokens[credentialToken]; - delete _casCredentialTokens[credentialToken]; - return result; -} - -const closePopup = (res) => { - if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { - return; - } - res.writeHead(200, {'Content-Type': 'text/html'}); - const content = '
'; - res.end(content, 'utf-8'); -} - -const redirect = (res, whereTo) => { - res.writeHead(302, {'Location': whereTo}); - const content = 'Redirection to '+whereTo+''; - res.end(content, 'utf-8'); - return -} - -const end = (res, whereTo) => { - if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { - redirect(res, whereTo); - } else { - closePopup(res); - } -} diff --git a/packages/wekan-accounts-cas/package.js b/packages/wekan-accounts-cas/package.js deleted file mode 100644 index d4b46c54d..000000000 --- a/packages/wekan-accounts-cas/package.js +++ /dev/null @@ -1,29 +0,0 @@ -Package.describe({ - summary: "CAS support for accounts", - version: "0.1.0", - name: "wekan-accounts-cas", - git: "https://github.com/wekan/wekan-accounts-cas" -}); - -Package.onUse(function(api) { - api.versionsFrom('METEOR@1.3.5.1'); - api.use('routepolicy', 'server'); - api.use('webapp', 'server'); - api.use('accounts-base', ['client', 'server']); - // Export Accounts (etc) to packages using this one. - api.imply('accounts-base', ['client', 'server']); - api.use('underscore'); - api.add_files('cas_client.js', 'web.browser'); - api.add_files('cas_client_cordova.js', 'web.cordova'); - api.add_files('cas_server.js', 'server'); - -}); - -Npm.depends({ - xml2js: "0.4.17", - cas: "https://github.com/anrizal/node-cas/tarball/2baed530842e7a437f8f71b9346bcac8e84773cc" -}); - -Cordova.depends({ - 'cordova-plugin-inappbrowser': '1.2.0' -}); diff --git a/packages/wekan-accounts-oidc/.gitignore b/packages/wekan-accounts-oidc/.gitignore deleted file mode 100644 index 5379d4c38..000000000 --- a/packages/wekan-accounts-oidc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.versions diff --git a/packages/wekan-accounts-oidc/LICENSE.txt b/packages/wekan-accounts-oidc/LICENSE.txt deleted file mode 100644 index c7be32647..000000000 --- a/packages/wekan-accounts-oidc/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (C) 2016 SWITCH - -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. - diff --git a/packages/wekan-accounts-oidc/README.md b/packages/wekan-accounts-oidc/README.md deleted file mode 100644 index ce0b5738b..000000000 --- a/packages/wekan-accounts-oidc/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# salleman:accounts-oidc package - -A Meteor login service for OpenID Connect (OIDC). - -## Installation - - meteor add salleman:accounts-oidc - -## Usage - -`Meteor.loginWithOidc(options, callback)` -* `options` - object containing options, see below (optional) -* `callback` - callback function (optional) - -#### Example - -```js -Template.myTemplateName.events({ - 'click #login-button': function() { - Meteor.loginWithOidc(); - } -); -``` - - -## Options - -These options override service configuration stored in the database. - -* `loginStyle`: `redirect` or `popup` -* `redirectUrl`: Where to redirect after successful login. Only used if `loginStyle` is set to `redirect` - -## Manual Configuration Setup - -You can manually configure this package by upserting the service configuration on startup. First, add the `service-configuration` package: - - meteor add service-configuration - -### Service Configuration - -The following service configuration are available: - -* `clientId`: OIDC client identifier -* `secret`: OIDC client shared secret -* `serverUrl`: URL of the OIDC server. e.g. `https://openid.example.org:8443` -* `authorizationEndpoint`: Endpoint of the OIDC authorization service, e.g. `/oidc/authorize` -* `tokenEndpoint`: Endpoint of the OIDC token service, e.g. `/oidc/token` -* `userinfoEndpoint`: Endpoint of the OIDC userinfo service, e.g. `/oidc/userinfo` -* `idTokenWhitelistFields`: A list of fields from IDToken to be added to Meteor.user().services.oidc object - -### Project Configuration - -Then in your project: - -```js -if (Meteor.isServer) { - Meteor.startup(function () { - ServiceConfiguration.configurations.upsert( - { service: 'oidc' }, - { - $set: { - loginStyle: 'redirect', - clientId: 'my-client-id-registered-with-the-oidc-server', - secret: 'my-client-shared-secret', - serverUrl: 'https://openid.example.org', - authorizationEndpoint: '/oidc/authorize', - tokenEndpoint: '/oidc/token', - userinfoEndpoint: '/oidc/userinfo', - idTokenWhitelistFields: [] - } - } - ); - }); -} -``` diff --git a/packages/wekan-accounts-oidc/oidc.js b/packages/wekan-accounts-oidc/oidc.js deleted file mode 100644 index 75cd89aeb..000000000 --- a/packages/wekan-accounts-oidc/oidc.js +++ /dev/null @@ -1,22 +0,0 @@ -Accounts.oauth.registerService('oidc'); - -if (Meteor.isClient) { - Meteor.loginWithOidc = function(options, callback) { - // support a callback without options - if (! callback && typeof options === "function") { - callback = options; - options = null; - } - - var credentialRequestCompleteCallback = Accounts.oauth.credentialRequestCompleteHandler(callback); - Oidc.requestCredential(options, credentialRequestCompleteCallback); - }; -} else { - Accounts.addAutopublishFields({ - // not sure whether the OIDC api can be used from the browser, - // thus not sure if we should be sending access tokens; but we do it - // for all other oauth2 providers, and it may come in handy. - forLoggedInUser: ['services.oidc'], - forOtherUsers: ['services.oidc.id'] - }); -} diff --git a/packages/wekan-accounts-oidc/oidc_login_button.css b/packages/wekan-accounts-oidc/oidc_login_button.css deleted file mode 100644 index da42120b8..000000000 --- a/packages/wekan-accounts-oidc/oidc_login_button.css +++ /dev/null @@ -1,3 +0,0 @@ -#login-buttons-image-oidc { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQUlEQVQ4T5WTy2taQRTGv4kSXw0IoYIihCjFmhhfhUqW9a+o0I2LInTRRbtw05V2I9KQuuimi24KXQqChIhQQcQgGGNz0YpvMCG1yL1tGqvBZsKMIIXcjQcOcznnfL+ZOecOEUVx4/Ly8mQ6neqxhKlUKmltbc1Nut2uqJ/bEnJAkiTmEhEEgVqtViiVyjuAP70j/Pj6Htbglzu52WyGdrsNUq1Wqc1mk939+9sHPP7wTVM232g0QMrlMrXb7bIFndgcbAk3ZPP1eh2kVCrRra2tRcFoNEK1WoXf78fg3Rxsfl3H3t4e3G43dnd3wWrMZjNqtRpIsVhcAFKpFPL5PBfF43H8TDj49/2XAvb393F2dgaNRgNKKaLR6ByQz+epw+HAwcEBisUijEYjgsEg1Go1pA9ODtC/+MZFDCKKIo9FIhEIggCSy+Xozs4OYrEY2ChDoRAIIVww/ujhxdrnFTSbTX6Cfr+Pi4sLhMNhnJ6egmSzWepyuZBIJGAwGBAIBLiY2ezTI74qg2UoFIqFr6ys4OrqiveKHB4eckAmk8FgMMD29jZ8Ph8XKj4/5uu/ZyXZKXBAOp2mHo+H/0isD6zDOp0Om5ubsAuvcA+/8ffpkSygUqmApFIp6vV6+b2ZsNfrodVqYTgcwqXtwul04pfhiSzg+PgYJJlMUovFwhvIbHV1lTs70c3NDSaTCa6vr+8A2FvodDr8CmwuepPJtIDIbvdfkInPz89ZRCKFQmFjNBqdjMfjpZ6jVquV1tfX3bcYegI7CyIWlgAAAABJRU5ErkJggg=='); -} diff --git a/packages/wekan-accounts-oidc/package.js b/packages/wekan-accounts-oidc/package.js deleted file mode 100644 index 251fb2653..000000000 --- a/packages/wekan-accounts-oidc/package.js +++ /dev/null @@ -1,19 +0,0 @@ -Package.describe({ - summary: "OpenID Connect (OIDC) for Meteor accounts", - version: "1.0.10", - name: "wekan-accounts-oidc", - git: "https://github.com/wekan/meteor-accounts-oidc.git", - -}); - -Package.onUse(function(api) { - api.use('accounts-base@1.2.0', ['client', 'server']); - // Export Accounts (etc) to packages using this one. - api.imply('accounts-base', ['client', 'server']); - api.use('accounts-oauth@1.1.0', ['client', 'server']); - api.use('wekan-oidc@1.0.10', ['client', 'server']); - - api.addFiles('oidc_login_button.css', 'client'); - - api.addFiles('oidc.js'); -}); diff --git a/packages/wekan-cfs-access-point/.travis.yml b/packages/wekan-cfs-access-point/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-access-point/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-access-point/CHANGELOG.md b/packages/wekan-cfs-access-point/CHANGELOG.md deleted file mode 100644 index 759f22a03..000000000 --- a/packages/wekan-cfs-access-point/CHANGELOG.md +++ /dev/null @@ -1,288 +0,0 @@ -# Changelog - -## [v0.1.50] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.46) -#### 21/1/19 by Harry Adel - -- Bump to version 0.1.50 - -- *Merged pull-request:* "filename conversion for FS.HTTP.Handlers.Get" [#9](https://github.com/zcfs/Meteor-CollectionFS/pull/994) ([yatusiter](https://github.com/yatusiter)) - - - -## [v0.1.46] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.46) -#### 30/3/15 by Eric Dobbertin - -- Bump to version 0.1.46 - -- *Merged pull-request:* [#611](https://github.com/zcfs/Meteor-CollectionFS/issues/611) - -- Exposed request handlers on `FS.HTTP.Handlers` object so that app can override - -## [v0.1.43] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.43) -#### 20/12/14 by Morten Henriksen -- add changelog - -- Bump to version 0.1.43 - -- *Fixed bug:* "Doesn't work in IE 8" [#10](https://github.com/zcfs/Meteor-cfs-access-point/issues/10) - -- *Merged pull-request:* "rootUrlPathPrefix fix for cordova" [#9](https://github.com/zcfs/Meteor-cfs-access-point/issues/9) ([dmitriyles](https://github.com/dmitriyles)) - -- *Merged pull-request:* "Support for expiration token" [#1](https://github.com/zcfs/Meteor-cfs-access-point/issues/1) ([tanis2000](https://github.com/tanis2000)) - -Patches by GitHub users [@dmitriyles](https://github.com/dmitriyles), [@tanis2000](https://github.com/tanis2000). - -## [v0.1.42] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.42) -#### 17/12/14 by Morten Henriksen -## [v0.1.41] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.41) -#### 17/12/14 by Morten Henriksen -- mbr update, remove versions.json - -- Cordova rootUrlPathPrefix fix - -- Bump to version 0.1.41 - -## [v0.1.40] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.1.40) -#### 17/12/14 by Morten Henriksen -- mbr fixed warnings - -- fixes to GET handler - -- add back tests - -- support apps in server subdirectories; closes #8 - -- 0.9.1 support - -## [v0.0.39] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.39) -#### 28/08/14 by Morten Henriksen -- Meteor Package System Update - -## [v0.0.38] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.38) -#### 27/08/14 by Eric Dobbertin -## [v0.0.37] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.37) -#### 26/08/14 by Eric Dobbertin -- change package name to lowercase - -## [v0.0.36] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.36) -#### 06/08/14 by Eric Dobbertin -- pass correct arg - -## [v0.0.35] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.35) -#### 06/08/14 by Eric Dobbertin -- move to correct place - -## [v0.0.34] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.34) -#### 05/08/14 by Eric Dobbertin -- *Merged pull-request:* "Added contentLength for ranges and inline content" [#5](https://github.com/zcfs/Meteor-cfs-access-point/issues/5) ([maomorales](https://github.com/maomorales)) - -- Content-Length and Last-Modified headers - -Patches by GitHub user [@maomorales](https://github.com/maomorales). - -## [v0.0.33] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.33) -#### 31/07/14 by Eric Dobbertin -- *Merged pull-request:* "Force browser to download with filename passed in url" [#3](https://github.com/zcfs/Meteor-cfs-access-point/issues/3) ([elbowz](https://github.com/elbowz)) - -- Force browser to download with filename passed in url - -Patches by GitHub user [@elbowz](https://github.com/elbowz). - -## [v0.0.32] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.32) -#### 28/07/14 by Eric Dobbertin -- support collection-specific GET headers - -- update API docs - -## [v0.0.31] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.31) -#### 06/07/14 by Eric Dobbertin -- allow override filename - -## [v0.0.30] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.30) -#### 30/04/14 by Eric Dobbertin -- ignore auth on server so that url method can be called on the server - -## [v0.0.29] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.29) -#### 30/04/14 by Eric Dobbertin -- rework the new authtoken stuff to make it easier to debug and cleaner - -## [v0.0.28] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.28) -#### 29/04/14 by Eric Dobbertin -- generate api docs - -- adjustments to use new FS.File API functions, plus have `url` function omit query string whenever possible - -- *Merged pull-request:* "Support for expiration token" [#1](https://github.com/zcfs/Meteor-cfs-access-point/issues/1) ([tanis2000](https://github.com/tanis2000)) - -- Switched to HTTP.call() to get the server time - -- Better check for options.auth being a number. Check to see if we have Buffer() available on the server side. New check to make sure we have the token. Switched Metheor.method to HTTP.methods for the getServerTime() function. - -- Expiration is now optional. If auth is set to a number, that is the number of seconds the token is valid for. - -- Added time sync with the server for token generation. - -- Added code to pass a token with a set expiration date from the client. Added token check on the server side. - -Patches by GitHub user [@tanis2000](https://github.com/tanis2000). - -## [v0.0.27] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.27) -#### 08/04/14 by Eric Dobbertin -- clean up/fix whole-file upload handler - -## [v0.0.26] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.26) -#### 07/04/14 by Eric Dobbertin -- add URL options to get temporary images while uploading and storing - -## [v0.0.25] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.25) -#### 03/04/14 by Eric Dobbertin -- * allow `setBaseUrl` to be called either outside of Meteor.startup or inside * move encodeParams helper to FS.Utility - -## [v0.0.24] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.24) -#### 03/04/14 by Eric Dobbertin -- properly remount URLs - -- when uploading chunks, check the insert allow/deny since it's part of inserting - -## [v0.0.23] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.23) -#### 31/03/14 by Eric Dobbertin -- use latest releases - -## [v0.0.22] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.22) -#### 29/03/14 by Morten Henriksen -- remove underscore deps - -## [v0.0.21] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.21) -#### 25/03/14 by Morten Henriksen -- add comments about shareId - -## [v0.0.20] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.20) -#### 23/03/14 by Morten Henriksen -- Rollback to specific git dependency - -- Try modified test script - -- deps are already in collectionFS - -## [v0.0.19] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.19) -#### 22/03/14 by Morten Henriksen -- try to fix travis test by using general package references - -## [v0.0.18] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.18) -#### 22/03/14 by Morten Henriksen -- If the read stream fails we send an error to the client - -## [v0.0.17] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.17) -#### 21/03/14 by Morten Henriksen -- remove smart lock - -- commit smart.lock, trying to get tests to pass on travis - -- some minor pkg adjustments; trying to get tests to pass on travis - -## [v0.0.16] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.16) -#### 18/03/14 by Morten Henriksen -- Rollback to using the direct storage adapter - makes more sense when serving files - -- shift to new http.methods streaming api - -- move server side DDP access points to cfs-download-ddp pkg; update API docs - -- fix typo... - -- return something useful - -- convert to streaming - -- Add streaming WIP - -- fix/adjust some tests; minor improvements to some handlers - -- Add unmount and allow mount to use default selector function - -- Refactor access point - wip - -## [v0.0.15] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.15) -#### 05/03/14 by Morten Henriksen -- Refactor note, encode stuff should be prefixed into FS.Utility - -- FS.File.url add user deps when auth is used - -- fix url method - -- query string fix - -- move PUT access points for HTTP upload into this package; mount DELETE on /record/ as well as /files/; some fixes and improvements to handlers - -## [v0.0.14] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.14) -#### 03/03/14 by Eric Dobbertin -- better error; return Buffer instead of converting to Uint8Array - -## [v0.0.13] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.13) -#### 02/03/14 by Eric Dobbertin -- more tests, make everything work, add unpublish method - -- Merge branch 'master' of https://github.com/zcfs/Meteor-cfs-access-point - -## [v0.0.12] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.12) -#### 01/03/14 by Eric Dobbertin -- add travis-ci image - -- rework URLs a bit, use http-publish package to publish FS.Collection listing, and add a test for this (!) - -- add http-publish dependency - -- del should be delete - -## [v0.0.11] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.11) -#### 28/02/14 by Eric Dobbertin -- move some code to other packages; redo the HTTP GET/DEL methods - -## [v0.0.10] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.10) -#### 28/02/14 by Eric Dobbertin -- move DDP upload methods to new cfs-upload-ddp package - -## [v0.0.9] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.9) -#### 21/02/14 by Eric Dobbertin -- new URL syntax; use the store's file key instead of ID; also fix allow/deny checks with insecure - -## [v0.0.8] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.8) -#### 20/02/14 by Eric Dobbertin -- support HTTP PUT of new file and fix PUT of existing file - -## [v0.0.7] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.7) -#### 17/02/14 by Morten Henriksen -- add http-methods dependency - -## [v0.0.6] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.6) -#### 16/02/14 by Morten Henriksen -## [v0.0.5] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.5) -#### 16/02/14 by Morten Henriksen -- a few fixes and improvements - -- need to actually mount it - -- attempt at switching to generic HTTP access point; also add support for chunked http downloads (range header) - -## [v0.0.4] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.4) -#### 15/02/14 by Morten Henriksen -- Merge branch 'master' of https://github.com/zcfs/Meteor-cfs-access-point - -- corrected typo - -- added debugging - -- call HTTP.methods on server only - -- run client side, too, for side effects - -- rework for additional abstraction; also DDP methods don't need to be per-collection so they no longer are - -## [v0.0.3] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.3) -#### 13/02/14 by Morten Henriksen -## [v0.0.2] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.2) -#### 13/02/14 by Morten Henriksen -## [v0.0.1] (https://github.com/zcfs/Meteor-cfs-access-point/tree/v0.0.1) -#### 13/02/14 by Morten Henriksen -- init commit - diff --git a/packages/wekan-cfs-access-point/LICENSE.md b/packages/wekan-cfs-access-point/LICENSE.md deleted file mode 100644 index 1a3820821..000000000 --- a/packages/wekan-cfs-access-point/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-access-point/README.md b/packages/wekan-cfs-access-point/README.md deleted file mode 100644 index fe7583265..000000000 --- a/packages/wekan-cfs-access-point/README.md +++ /dev/null @@ -1,32 +0,0 @@ -wekan-cfs-access-point [![Build Status](https://travis-ci.org/CollectionFS/Meteor-cfs-access-point.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-cfs-access-point) -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. You could potentially use your own access point -package instead. - -## Define a URL for Collection Listing - -To define a URL that accepts GET requests and returns a list of published -files in a FS.Collection: - -```js -Images = new FS.Collection("images", { - stores: [myStore] -}); - -FS.HTTP.publish(Images, function () { - // `this` provides a context similar to Meteor.publish - return Images.find(); -}); -``` - -The URL will be '/cfs/record/images', where the `cfs` piece is configurable -using the `FS.HTTP.setBaseUrl` method. - -## API Documentation - -[Here](api.md) diff --git a/packages/wekan-cfs-access-point/access-point-client.js b/packages/wekan-cfs-access-point/access-point-client.js deleted file mode 100644 index bc25d0bca..000000000 --- a/packages/wekan-cfs-access-point/access-point-client.js +++ /dev/null @@ -1,58 +0,0 @@ -FS.HTTP.setHeadersForGet = function setHeadersForGet() { - // Client Stub -}; - -FS.HTTP.now = function() { - return new Date(new Date() + FS.HTTP._serverTimeDiff); -}; - -// Returns the localstorage if its found and working -// TODO: check if this works in IE -// could use Meteor._localStorage - just needs a rewrite -FS.HTTP._storage = function() { - var storage, - fail, - uid; - try { - uid = "test"; - (storage = window.localStorage).setItem(uid, uid); - fail = (storage.getItem(uid) !== uid); - storage.removeItem(uid); - if (fail) { - storage = false; - } - } catch(e) { - console.log("Error initializing storage for FS.HTTP"); - console.log(e); - } - - return storage; -}; - -// get our storage if found -FS.HTTP.storage = FS.HTTP._storage(); - -FS.HTTP._prefix = 'fsHTTP.'; - -FS.HTTP._serverTimeDiff = 0; // Time difference in ms - -if (FS.HTTP.storage) { - // Initialize the FS.HTTP._serverTimeDiff - FS.HTTP._serverTimeDiff = (1*FS.HTTP.storage.getItem(FS.HTTP._prefix+'timeDiff')) || 0; - // At client startup we figure out the time difference between server and - // client time - this includes lag and timezone - Meteor.startup(function() { - // Call the server method an get server time - HTTP.get(rootUrlPathPrefix + '/cfs/servertime', function(error, result) { - if (!error) { - // Update our server time diff - var dateNew = new Date(+result.content); - FS.HTTP._serverTimeDiff = dateNew - new Date();// - lag or/and timezone - // Update the localstorage - FS.HTTP.storage.setItem(FS.HTTP._prefix + 'timeDiff', FS.HTTP._serverTimeDiff); - } else { - console.log(error.message); - } - }); // EO Server call - }); -} diff --git a/packages/wekan-cfs-access-point/access-point-common.js b/packages/wekan-cfs-access-point/access-point-common.js deleted file mode 100644 index bccf7c14c..000000000 --- a/packages/wekan-cfs-access-point/access-point-common.js +++ /dev/null @@ -1,199 +0,0 @@ -rootUrlPathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; -// Adjust the rootUrlPathPrefix if necessary -if (rootUrlPathPrefix.length > 0) { - if (rootUrlPathPrefix.slice(0, 1) !== '/') { - rootUrlPathPrefix = '/' + rootUrlPathPrefix; - } - if (rootUrlPathPrefix.slice(-1) === '/') { - rootUrlPathPrefix = rootUrlPathPrefix.slice(0, -1); - } -} - -// prepend ROOT_URL when isCordova -if (Meteor.isCordova) { - rootUrlPathPrefix = Meteor.absoluteUrl(rootUrlPathPrefix.replace(/^\/+/, '')).replace(/\/+$/, ''); -} - -baseUrl = '/cfs'; -FS.HTTP = FS.HTTP || {}; - -// Note the upload URL so that client uploader packages know what it is -FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; - -/** - * @method FS.HTTP.setBaseUrl - * @public - * @param {String} newBaseUrl - Change the base URL for the HTTP GET and DELETE endpoints. - * @returns {undefined} - */ -FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { - - // Adjust the baseUrl if necessary - if (newBaseUrl.slice(0, 1) !== '/') { - newBaseUrl = '/' + newBaseUrl; - } - if (newBaseUrl.slice(-1) === '/') { - newBaseUrl = newBaseUrl.slice(0, -1); - } - - // Update the base URL - baseUrl = newBaseUrl; - - // Change the upload URL so that client uploader packages know what it is - FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; - - // Remount URLs with the new baseUrl, unmounting the old, on the server only. - // If existingMountPoints is empty, then we haven't run the server startup - // code yet, so this new URL will be used at that point for the initial mount. - if (Meteor.isServer && !FS.Utility.isEmpty(_existingMountPoints)) { - mountUrls(); - } -}; - -/* - * FS.File extensions - */ - -/** - * @method FS.File.prototype.urlRelative Construct the file url - * @public - * @param {Object} [options] - * @param {String} [options.store] Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used. - * @param {Boolean} [options.auth=null] Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds. - * @param {Boolean} [options.download=false] Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser. - * @param {Boolean} [options.brokenIsFine=false] Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet. - * @param {Boolean} [options.returnWhenStored=false] Flag relevant only on server, Return the URL only when file has been saved to the requested store. - * @param {Boolean} [options.metadata=false] Return the URL for the file metadata access point rather than the file itself. - * @param {String} [options.uploading=null] A URL to return while the file is being uploaded. - * @param {String} [options.storing=null] A URL to return while the file is being stored. - * @param {String} [options.filename=null] Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store. - * - * Returns the relative HTTP URL for getting the file or its metadata. - */ -FS.File.prototype.urlRelative = function(options) { - var self = this; - options = options || {}; - options = FS.Utility.extend({ - store: null, - auth: null, - download: false, - metadata: false, - brokenIsFine: false, - returnWhenStored: false, - uploading: null, // return this URL while uploading - storing: null, // return this URL while storing - filename: null // override the filename that is shown to the user - }, options.hash || options); // check for "hash" prop if called as helper - - // Primarily useful for displaying a temporary image while uploading an image - if (options.uploading && !self.isUploaded()) { - return options.uploading; - } - - if (self.isMounted()) { - // See if we've stored in the requested store yet - var storeName = options.store || self.collection.primaryStore.name; - if (!self.hasStored(storeName)) { - if (options.storing) { - return options.storing; - } else if (!options.brokenIsFine) { - // In case we want to get back the url only when he is stored - if (Meteor.isServer && options.returnWhenStored) { - // Wait till file is stored to storeName - self.onStored(storeName); - } else { - // We want to return null if we know the URL will be a broken - // link because then we can avoid rendering broken links, broken - // images, etc. - return null; - } - } - } - - // Add filename to end of URL if we can determine one - var filename = options.filename || self.name({store: storeName}); - if (typeof filename === "string" && filename.length) { - filename = '/' + filename; - } else { - filename = ''; - } - - // TODO: Could we somehow figure out if the collection requires login? - var authToken = ''; - if (Meteor.isClient && typeof Accounts !== "undefined" && typeof Accounts._storedLoginToken === "function") { - if (options.auth !== false) { - // Add reactive deps on the user - Meteor.userId(); - - var authObject = { - authToken: Accounts._storedLoginToken() || '' - }; - - // If it's a number, we use that as the expiration time (in seconds) - if (options.auth === +options.auth) { - authObject.expiration = FS.HTTP.now() + options.auth * 1000; - } - - // Set the authToken - var authString = JSON.stringify(authObject); - authToken = FS.Utility.btoa(authString); - } - } else if (typeof options.auth === "string") { - // If the user supplies auth token the user will be responsible for - // updating - authToken = options.auth; - } - - // Construct query string - var params = {}; - if (authToken !== '') { - params.token = authToken; - } - if (options.download) { - params.download = true; - } - if (options.store) { - // We use options.store here instead of storeName because we want to omit the queryString - // whenever possible, allowing users to have "clean" URLs if they want. The server will - // assume the first store defined on the server, which means that we are assuming that - // the first on the client is also the first on the server. If that's not the case, the - // store option should be supplied. - params.store = options.store; - } - var queryString = FS.Utility.encodeParams(params); - if (queryString.length) { - queryString = '?' + queryString; - } - - // Determine which URL to use - var area; - if (options.metadata) { - area = '/record'; - } else { - area = '/files'; - } - - // Construct and return the http method url - return baseUrl + area + '/' + self.collection.name + '/' + self._id + filename + queryString; - } -}; - -/** - * @method FS.File.prototype.url Construct the file url - * @public - * @param {Object} [options] - * @param {String} [options.store] Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used. - * @param {Boolean} [options.auth=null] Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds. - * @param {Boolean} [options.download=false] Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser. - * @param {Boolean} [options.brokenIsFine=false] Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet. - * @param {Boolean} [options.metadata=false] Return the URL for the file metadata access point rather than the file itself. - * @param {String} [options.uploading=null] A URL to return while the file is being uploaded. - * @param {String} [options.storing=null] A URL to return while the file is being stored. - * @param {String} [options.filename=null] Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store. - * - * Returns the HTTP URL for getting the file or its metadata. - */ -FS.File.prototype.url = function(options) { - self = this; - return rootUrlPathPrefix + self.urlRelative(options); -}; \ No newline at end of file diff --git a/packages/wekan-cfs-access-point/access-point-handlers.js b/packages/wekan-cfs-access-point/access-point-handlers.js deleted file mode 100644 index e4615f069..000000000 --- a/packages/wekan-cfs-access-point/access-point-handlers.js +++ /dev/null @@ -1,307 +0,0 @@ -getHeaders = []; -getHeadersByCollection = {}; - -var contentDisposition = Npm.require('content-disposition'); - -FS.HTTP.Handlers = {}; - -/** - * @method FS.HTTP.Handlers.Del - * @public - * @returns {any} response - * - * HTTP DEL request handler - */ -FS.HTTP.Handlers.Del = function httpDelHandler(ref) { - var self = this; - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); - - // If DELETE request, validate with 'remove' allow/deny, delete the file, and return - FS.Utility.validateAction(ref.collection.files._validators['remove'], ref.file, self.userId); - - /* - * From the DELETE spec: - * A successful response SHOULD be 200 (OK) if the response includes an - * entity describing the status, 202 (Accepted) if the action has not - * yet been enacted, or 204 (No Content) if the action has been enacted - * but the response does not include an entity. - */ - self.setStatusCode(200); - - return { - deleted: !!ref.file.remove() - }; -}; - -/** - * @method FS.HTTP.Handlers.GetList - * @public - * @returns {Object} response - * - * HTTP GET file list request handler - */ -FS.HTTP.Handlers.GetList = function httpGetListHandler() { - // Not Yet Implemented - // Need to check publications and return file list based on - // what user is allowed to see -}; - -/* - requestRange will parse the range set in request header - if not possible it - will throw fitting errors and autofill range for both partial and full ranges - - throws error or returns the object: - { - start - end - length - unit - partial - } -*/ -var requestRange = function(req, fileSize) { - if (req) { - if (req.headers) { - var rangeString = req.headers.range; - - // Make sure range is a string - if (rangeString === ''+rangeString) { - - // range will be in the format "bytes=0-32767" - var parts = rangeString.split('='); - var unit = parts[0]; - - // Make sure parts consists of two strings and range is of type "byte" - if (parts.length == 2 && unit == 'bytes') { - // Parse the range - var range = parts[1].split('-'); - var start = Number(range[0]); - var end = Number(range[1]); - - // Fix invalid ranges? - if (range[0] != start) start = 0; - if (range[1] != end || !end) end = fileSize - 1; - - // Make sure range consists of a start and end point of numbers and start is less than end - if (start < end) { - - var partSize = 0 - start + end + 1; - - // Return the parsed range - return { - start: start, - end: end, - length: partSize, - size: fileSize, - unit: unit, - partial: (partSize < fileSize) - }; - - } else { - throw new Meteor.Error(416, "Requested Range Not Satisfiable"); - } - - } else { - // The first part should be bytes - throw new Meteor.Error(416, "Requested Range Unit Not Satisfiable"); - } - - } else { - // No range found - } - - } else { - // throw new Error('No request headers set for _parseRange function'); - } - } else { - throw new Error('No request object passed to _parseRange function'); - } - - return { - start: 0, - end: fileSize - 1, - length: fileSize, - size: fileSize, - unit: 'bytes', - partial: false - }; -}; - -/** - * @method FS.HTTP.Handlers.Get - * @public - * @returns {any} response - * - * HTTP GET request handler - */ -FS.HTTP.Handlers.Get = function httpGetHandler(ref) { - var self = this; - // Once we have the file, we can test allow/deny validators - // XXX: pass on the "share" query eg. ?share=342hkjh23ggj for shared url access? - FS.Utility.validateAction(ref.collection._validators['download'], ref.file, self.userId /*, self.query.shareId*/); - - var storeName = ref.storeName; - - // If no storeName was specified, use the first defined storeName - if (typeof storeName !== "string") { - // No store handed, we default to primary store - storeName = ref.collection.primaryStore.name; - } - - // Get the storage reference - var storage = ref.collection.storesLookup[storeName]; - - if (!storage) { - throw new Meteor.Error(404, "Not Found", 'There is no store "' + storeName + '"'); - } - - // Get the file - var copyInfo = ref.file.copies[storeName]; - - if (!copyInfo) { - throw new Meteor.Error(404, "Not Found", 'This file was not stored in the ' + storeName + ' store'); - } - - // Set the content type for file - if (typeof copyInfo.type === "string") { - self.setContentType(copyInfo.type); - } else { - self.setContentType('application/octet-stream'); - } - - // Add 'Content-Disposition' header if requested a download/attachment URL - if (typeof ref.download !== "undefined") { - var filename = ref.filename || copyInfo.name; - self.addHeader('Content-Disposition', contentDisposition(filename)); - } else { - self.addHeader('Content-Disposition', 'inline'); - } - - // Get the contents range from request - var range = requestRange(self.request, copyInfo.size); - - // Some browsers cope better if the content-range header is - // still included even for the full file being returned. - self.addHeader('Content-Range', range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); - - // If a chunk/range was requested instead of the whole file, serve that' - if (range.partial) { - self.setStatusCode(206, 'Partial Content'); - } else { - self.setStatusCode(200, 'OK'); - } - - // Add any other global custom headers and collection-specific custom headers - FS.Utility.each(getHeaders.concat(getHeadersByCollection[ref.collection.name] || []), function(header) { - self.addHeader(header[0], header[1]); - }); - - // Inform clients about length (or chunk length in case of ranges) - self.addHeader('Content-Length', range.length); - - // Last modified header (updatedAt from file info) - self.addHeader('Last-Modified', copyInfo.updatedAt.toUTCString()); - - // Inform clients that we accept ranges for resumable chunked downloads - self.addHeader('Accept-Ranges', range.unit); - - if (FS.debug) console.log('Read file "' + (ref.filename || copyInfo.name) + '" ' + range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); - - var readStream = storage.adapter.createReadStream(ref.file, {start: range.start, end: range.end}); - - readStream.on('error', function(err) { - // Send proper error message on get error - if (err.message && err.statusCode) { - self.Error(new Meteor.Error(err.statusCode, err.message)); - } else { - self.Error(new Meteor.Error(503, 'Service unavailable')); - } - }); - - readStream.pipe(self.createWriteStream()); -}; - -// File with unicode or other encodings filename can upload to server susscessfully, -// but when download, the HTTP header "Content-Disposition" cannot accept -// characters other than ASCII, the filename should be converted to binary or URI encoded. -// https://github.com/wekan/wekan/issues/784 -const originalHandler = FS.HTTP.Handlers.Get; -FS.HTTP.Handlers.Get = function (ref) { - try { - var userAgent = (this.requestHeaders['user-agent']||'').toLowerCase(); - if(userAgent.indexOf('msie') >= 0 || userAgent.indexOf('chrome') >= 0) { - ref.filename = encodeURIComponent(ref.filename); - } else if(userAgent.indexOf('firefox') >= 0) { - ref.filename = new Buffer(ref.filename).toString('binary'); - } else { - /* safari*/ - ref.filename = new Buffer(ref.filename).toString('binary'); - } - } catch (ex){ - ref.filename = ref.filename; - } - return originalHandler.call(this, ref); -}; - - -/** - * @method FS.HTTP.Handlers.PutInsert - * @public - * @returns {Object} response object with _id property - * - * HTTP PUT file insert request handler - */ -FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { - var self = this; - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); - - FS.debug && console.log("HTTP PUT (insert) handler"); - - // Create the nice FS.File - var fileObj = new FS.File(); - - // Set its name - fileObj.name(opts.filename || null); - - // Attach the readstream as the file's data - fileObj.attachData(self.createReadStream(), {type: self.requestHeaders['content-type'] || 'application/octet-stream'}); - - // Validate with insert allow/deny - FS.Utility.validateAction(ref.collection.files._validators['insert'], fileObj, self.userId); - - // Insert file into collection, triggering readStream storage - ref.collection.insert(fileObj); - - // Send response - self.setStatusCode(200); - - // Return the new file id - return {_id: fileObj._id}; -}; - -/** - * @method FS.HTTP.Handlers.PutUpdate - * @public - * @returns {Object} response object with _id and chunk properties - * - * HTTP PUT file update chunk request handler - */ -FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { - var self = this; - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); - - var chunk = parseInt(opts.chunk, 10); - if (isNaN(chunk)) chunk = 0; - - FS.debug && console.log("HTTP PUT (update) handler received chunk: ", chunk); - - // Validate with insert allow/deny; also mounts and retrieves the file - FS.Utility.validateAction(ref.collection.files._validators['insert'], ref.file, self.userId); - - self.createReadStream().pipe( FS.TempStore.createWriteStream(ref.file, chunk) ); - - // Send response - self.setStatusCode(200); - - return { _id: ref.file._id, chunk: chunk }; -}; diff --git a/packages/wekan-cfs-access-point/access-point-server.js b/packages/wekan-cfs-access-point/access-point-server.js deleted file mode 100644 index 2f17cf9a0..000000000 --- a/packages/wekan-cfs-access-point/access-point-server.js +++ /dev/null @@ -1,362 +0,0 @@ -var path = Npm.require("path"); - -HTTP.publishFormats({ - fileRecordFormat: function (input) { - // Set the method scope content type to json - this.setContentType('application/json'); - if (FS.Utility.isArray(input)) { - return EJSON.stringify(FS.Utility.map(input, function (obj) { - return FS.Utility.cloneFileRecord(obj); - })); - } else { - return EJSON.stringify(FS.Utility.cloneFileRecord(input)); - } - } -}); - -/** - * @method FS.HTTP.setHeadersForGet - * @public - * @param {Array} headers - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value. - * @param {Array|String} [collections] - Which collections the headers should be added for. Omit this argument to add the header for all collections. - * @returns {undefined} - */ -FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { - if (typeof collections === "string") { - collections = [collections]; - } - if (collections) { - FS.Utility.each(collections, function(collectionName) { - getHeadersByCollection[collectionName] = headers || []; - }); - } else { - getHeaders = headers || []; - } -}; - -/** - * @method FS.HTTP.publish - * @public - * @param {FS.Collection} collection - * @param {Function} func - Publish function that returns a cursor. - * @returns {undefined} - * - * Publishes all documents returned by the cursor at a GET URL - * with the format baseUrl/record/collectionName. The publish - * function `this` is similar to normal `Meteor.publish`. - */ -FS.HTTP.publish = function fsHttpPublish(collection, func) { - var name = baseUrl + '/record/' + collection.name; - // Mount collection listing URL using http-publish package - HTTP.publish({ - name: name, - defaultFormat: 'fileRecordFormat', - collection: collection, - collectionGet: true, - collectionPost: false, - documentGet: true, - documentPut: false, - documentDelete: false - }, func); - - FS.debug && console.log("Registered HTTP method GET URLs:\n\n" + name + '\n' + name + '/:id\n'); -}; - -/** - * @method FS.HTTP.unpublish - * @public - * @param {FS.Collection} collection - * @returns {undefined} - * - * Unpublishes a restpoint created by a call to `FS.HTTP.publish` - */ -FS.HTTP.unpublish = function fsHttpUnpublish(collection) { - // Mount collection listing URL using http-publish package - HTTP.unpublish(baseUrl + '/record/' + collection.name); -}; - -_existingMountPoints = {}; - -/** - * @method defaultSelectorFunction - * @private - * @returns { collection, file } - * - * This is the default selector function - */ -var defaultSelectorFunction = function() { - var self = this; - // Selector function - // - // This function will have to return the collection and the - // file. If file not found undefined is returned - if null is returned the - // search was not possible - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); - - // Get the collection name from the url - var collectionName = opts.collectionName; - - // Get the id from the url - var id = opts.id; - - // Get the collection - var collection = FS._collections[collectionName]; - - //if Mongo ObjectIds are used, then we need to use that in find statement - if(collection.options.idGeneration && collection.options.idGeneration === 'MONGO') { - // Get the file if possible else return null - var file = (id && collection)? collection.findOne({ _id: new Meteor.Collection.ObjectID(id)}): null; - } else { - var file = (id && collection)? collection.findOne({ _id: id }): null; - } - - - // Return the collection and the file - return { - collection: collection, - file: file, - storeName: opts.store, - download: opts.download, - filename: opts.filename - }; -}; - -/* - * @method FS.HTTP.mount - * @public - * @param {array of string} mountPoints mount points to map rest functinality on - * @param {function} selector_f [selector] function returns `{ collection, file }` for mount points to work with - * -*/ -FS.HTTP.mount = function(mountPoints, selector_f) { - // We take mount points as an array and we get a selector function - var selectorFunction = selector_f || defaultSelectorFunction; - - var accessPoint = { - 'stream': true, - 'auth': expirationAuth, - 'post': function(data) { - // Use the selector for finding the collection and file reference - var ref = selectorFunction.call(this); - - // We dont support post - this would be normal insert eg. of filerecord? - throw new Meteor.Error(501, "Not implemented", "Post is not supported"); - }, - 'put': function(data) { - // Use the selector for finding the collection and file reference - var ref = selectorFunction.call(this); - - // Make sure we have a collection reference - if (!ref.collection) - throw new Meteor.Error(404, "Not Found", "No collection found"); - - // Make sure we have a file reference - if (ref.file === null) { - // No id supplied so we will create a new FS.File instance and - // insert the supplied data. - return FS.HTTP.Handlers.PutInsert.apply(this, [ref]); - } else { - if (ref.file) { - return FS.HTTP.Handlers.PutUpdate.apply(this, [ref]); - } else { - throw new Meteor.Error(404, "Not Found", 'No file found'); - } - } - }, - 'get': function(data) { - // Use the selector for finding the collection and file reference - var ref = selectorFunction.call(this); - - // Make sure we have a collection reference - if (!ref.collection) - throw new Meteor.Error(404, "Not Found", "No collection found"); - - // Make sure we have a file reference - if (ref.file === null) { - // No id supplied so we will return the published list of files ala - // http.publish in json format - return FS.HTTP.Handlers.GetList.apply(this, [ref]); - } else { - if (ref.file) { - return FS.HTTP.Handlers.Get.apply(this, [ref]); - } else { - throw new Meteor.Error(404, "Not Found", 'No file found'); - } - } - }, - 'delete': function(data) { - // Use the selector for finding the collection and file reference - var ref = selectorFunction.call(this); - - // Make sure we have a collection reference - if (!ref.collection) - throw new Meteor.Error(404, "Not Found", "No collection found"); - - // Make sure we have a file reference - if (ref.file) { - return FS.HTTP.Handlers.Del.apply(this, [ref]); - } else { - throw new Meteor.Error(404, "Not Found", 'No file found'); - } - } - }; - - var accessPoints = {}; - - // Add debug message - FS.debug && console.log('Registered HTTP method URLs:'); - - FS.Utility.each(mountPoints, function(mountPoint) { - // Couple mountpoint and accesspoint - accessPoints[mountPoint] = accessPoint; - // Remember our mountpoints - _existingMountPoints[mountPoint] = mountPoint; - // Add debug message - FS.debug && console.log(mountPoint); - }); - - // XXX: HTTP:methods should unmount existing mounts in case of overwriting? - HTTP.methods(accessPoints); - -}; - -/** - * @method FS.HTTP.unmount - * @public - * @param {string | array of string} [mountPoints] Optional, if not specified all mountpoints are unmounted - * - */ -FS.HTTP.unmount = function(mountPoints) { - // The mountPoints is optional, can be string or array if undefined then - // _existingMountPoints will be used - var unmountList; - // Container for the mount points to unmount - var unmountPoints = {}; - - if (typeof mountPoints === 'undefined') { - // Use existing mount points - unmount all - unmountList = _existingMountPoints; - } else if (mountPoints === ''+mountPoints) { - // Got a string - unmountList = [mountPoints]; - } else if (mountPoints.length) { - // Got an array - unmountList = mountPoints; - } - - // If we have a list to unmount - if (unmountList) { - // Iterate over each item - FS.Utility.each(unmountList, function(mountPoint) { - // Check _existingMountPoints to make sure the mount point exists in our - // context / was created by the FS.HTTP.mount - if (_existingMountPoints[mountPoint]) { - // Mark as unmount - unmountPoints[mountPoint] = false; - // Release - delete _existingMountPoints[mountPoint]; - } - }); - FS.debug && console.log('FS.HTTP.unmount:'); - FS.debug && console.log(unmountPoints); - // Complete unmount - HTTP.methods(unmountPoints); - } -}; - -// ### FS.Collection maps on HTTP pr. default on the following restpoints: -// * -// baseUrl + '/files/:collectionName/:id/:filename', -// baseUrl + '/files/:collectionName/:id', -// baseUrl + '/files/:collectionName' -// -// Change/ replace the existing mount point by: -// ```js -// // unmount all existing -// FS.HTTP.unmount(); -// // Create new mount point -// FS.HTTP.mount([ -// '/cfs/files/:collectionName/:id/:filename', -// '/cfs/files/:collectionName/:id', -// '/cfs/files/:collectionName' -// ]); -// ``` -// -mountUrls = function mountUrls() { - // We unmount first in case we are calling this a second time - FS.HTTP.unmount(); - - FS.HTTP.mount([ - baseUrl + '/files/:collectionName/:id/:filename', - baseUrl + '/files/:collectionName/:id', - baseUrl + '/files/:collectionName' - ]); -}; - -// Returns the userId from URL token -var expirationAuth = function expirationAuth() { - var self = this; - - // Read the token from '/hello?token=base64' - var encodedToken = self.query.token; - - FS.debug && console.log("token: "+encodedToken); - - if (!encodedToken || !Meteor.users) return false; - - // Check the userToken before adding it to the db query - // Set the this.userId - var tokenString = FS.Utility.atob(encodedToken); - - var tokenObject; - try { - tokenObject = JSON.parse(tokenString); - } catch(err) { - throw new Meteor.Error(400, 'Bad Request'); - } - - // XXX: Do some check here of the object - var userToken = tokenObject.authToken; - if (userToken !== ''+userToken) { - throw new Meteor.Error(400, 'Bad Request'); - } - - // If we have an expiration token we should check that it's still valid - if (tokenObject.expiration != null) { - // check if its too old - var now = Date.now(); - if (tokenObject.expiration < now) { - FS.debug && console.log('Expired token: ' + tokenObject.expiration + ' is less than ' + now); - throw new Meteor.Error(500, 'Expired token'); - } - } - - // We are not on a secure line - so we have to look up the user... - var user = Meteor.users.findOne({ - $or: [ - {'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(userToken)}, - {'services.resume.loginTokens.token': userToken} - ] - }); - - // Set the userId in the scope - return user && user._id; -}; - -HTTP.methods( - {'/cfs/servertime': { - get: function(data) { - return Date.now().toString(); - } - } -}); - -// Unify client / server api -FS.HTTP.now = function() { - return Date.now(); -}; - -// Start up the basic mount points -Meteor.startup(function () { - mountUrls(); -}); diff --git a/packages/wekan-cfs-access-point/api.md b/packages/wekan-cfs-access-point/api.md deleted file mode 100644 index 18a92c7a3..000000000 --- a/packages/wekan-cfs-access-point/api.md +++ /dev/null @@ -1,271 +0,0 @@ -## wekan-cfs-access-point Public API ## - -CollectionFS, add ddp and http accesspoint capability - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -- - -### *FSHTTP*.setBaseUrl(newBaseUrl)  Anywhere ### - -*This method __setBaseUrl__ is defined in `FS.HTTP`* - -__Arguments__ - -* __newBaseUrl__ *{String}* - - Change the base URL for the HTTP GET and DELETE endpoints. - - -__Returns__ *{undefined}* - - -> ```FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { ...``` [access-point-common.js:29](access-point-common.js#L29) - - -- - -### *fsFile*.url([options])  Anywhere ### - -*This method __url__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{Object}* (Optional) - * __store__ *{String}* (Optional) - - Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used. - - * __auth__ *{Boolean}* (Optional, Default = null) - - Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds. - - * __download__ *{Boolean}* (Optional, Default = false) - - Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser. - - * __brokenIsFine__ *{Boolean}* (Optional, Default = false) - - Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet. - - * __metadata__ *{Boolean}* (Optional, Default = false) - - Return the URL for the file metadata access point rather than the file itself. - - * __uploading__ *{String}* (Optional, Default = null) - - A URL to return while the file is being uploaded. - - * __storing__ *{String}* (Optional, Default = null) - - A URL to return while the file is being stored. - - * __filename__ *{String}* (Optional, Default = null) - - Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store. - - - -Returns the HTTP URL for getting the file or its metadata. - -> ```FS.File.prototype.url = function(options) { ...``` [access-point-common.js:72](access-point-common.js#L72) - - -- - -### *FSHTTPHandlers*.Del()  Server ### - -*This method __Del__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{any}* -response - - -HTTP DEL request handler - -> ```FS.HTTP.Handlers.Del = function httpDelHandler(ref) { ...``` [access-point-handlers.js:13](access-point-handlers.js#L13) - - -- - -### *FSHTTPHandlers*.GetList()  Server ### - -*This method __GetList__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response - - -HTTP GET file list request handler - -> ```FS.HTTP.Handlers.GetList = function httpGetListHandler() { ...``` [access-point-handlers.js:41](access-point-handlers.js#L41) - - -- - -### *FSHTTPHandlers*.Get()  Server ### - -*This method __Get__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{any}* -response - - -HTTP GET request handler - -> ```FS.HTTP.Handlers.Get = function httpGetHandler(ref) { ...``` [access-point-handlers.js:135](access-point-handlers.js#L135) - - -- - -### *FSHTTPHandlers*.PutInsert()  Server ### - -*This method __PutInsert__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response object with _id property - - -HTTP PUT file insert request handler - -> ```FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { ...``` [access-point-handlers.js:229](access-point-handlers.js#L229) - - -- - -### *FSHTTPHandlers*.PutUpdate()  Server ### - -*This method __PutUpdate__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response object with _id and chunk properties - - -HTTP PUT file update chunk request handler - -> ```FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { ...``` [access-point-handlers.js:264](access-point-handlers.js#L264) - - -- - -### *FSHTTP*.setHeadersForGet(headers, [collections])  Server ### - -*This method __setHeadersForGet__ is defined in `FS.HTTP`* - -__Arguments__ - -* __headers__ *{Array}* - - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value. - -* __collections__ *{Array|String}* (Optional) - - Which collections the headers should be added for. Omit this argument to add the header for all collections. - - -__Returns__ *{undefined}* - - -> ```FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { ...``` [access-point-server.js:24](access-point-server.js#L24) - - -- - -### *FSHTTP*.publish(collection, func)  Server ### - -*This method __publish__ is defined in `FS.HTTP`* - -__Arguments__ - -* __collection__ *{[FS.Collection](#FS.Collection)}* -* __func__ *{Function}* - - Publish function that returns a cursor. - - -__Returns__ *{undefined}* - - -Publishes all documents returned by the cursor at a GET URL -with the format baseUrl/record/collectionName. The publish -function `this` is similar to normal `Meteor.publish`. - -> ```FS.HTTP.publish = function fsHttpPublish(collection, func) { ...``` [access-point-server.js:48](access-point-server.js#L48) - - -- - -### *FSHTTP*.unpublish(collection)  Server ### - -*This method __unpublish__ is defined in `FS.HTTP`* - -__Arguments__ - -* __collection__ *{[FS.Collection](#FS.Collection)}* - -__Returns__ *{undefined}* - - -Unpublishes a restpoint created by a call to `FS.HTTP.publish` - -> ```FS.HTTP.unpublish = function fsHttpUnpublish(collection) { ...``` [access-point-server.js:73](access-point-server.js#L73) - - -- - -### *FSHTTP*.mount(mountPoints, selector_f)  Server ### - -*This method __mount__ is defined in `FS.HTTP`* - -__Arguments__ - -* __mountPoints__ *{[array of string](#array of string)}* - - mount points to map rest functinality on - -* __selector_f__ *{function}* - - [selector] function returns `{ collection, file }` for mount points to work with - - - -> ```FS.HTTP.mount = function(mountPoints, selector_f) { ...``` [access-point-server.js:125](access-point-server.js#L125) - - -- - -### *FSHTTP*.unmount([mountPoints])  Server ### - -*This method __unmount__ is defined in `FS.HTTP`* - -__Arguments__ - -* __mountPoints__ *{[string ](#string )|[ array of string](# array of string)}* (Optional) - - Optional, if not specified all mountpoints are unmounted - - - - -> ```FS.HTTP.unmount = function(mountPoints) { ...``` [access-point-server.js:223](access-point-server.js#L223) - - - -- -### FS.Collection maps on HTTP pr. default on the following restpoints: -* -baseUrl + '/files/:collectionName/:id/:filename', -baseUrl + '/files/:collectionName/:id', -baseUrl + '/files/:collectionName' - -Change/ replace the existing mount point by: -```js -unmount all existing -FS.HTTP.unmount(); -Create new mount point -FS.HTTP.mount([ -'/cfs/files/:collectionName/:id/:filename', -'/cfs/files/:collectionName/:id', -'/cfs/files/:collectionName' -]); -``` diff --git a/packages/wekan-cfs-access-point/internal.api.md b/packages/wekan-cfs-access-point/internal.api.md deleted file mode 100644 index a7bf6477e..000000000 --- a/packages/wekan-cfs-access-point/internal.api.md +++ /dev/null @@ -1,332 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["access-point-common.js"](access-point-common.js) Where: {server|client}__ - -*** - -### *FSHTTP*.setBaseUrl(newBaseUrl)  Anywhere ### - -*This method __setBaseUrl__ is defined in `FS.HTTP`* - -__Arguments__ - -* __newBaseUrl__ *{String}* - - Change the base URL for the HTTP GET and DELETE endpoints. - - -__Returns__ *{undefined}* - - -> ```FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { ...``` [access-point-common.js:29](access-point-common.js#L29) - - -- - -### *fsFile*.url([options])  Anywhere ### - -*This method __url__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{Object}* (Optional) - * __store__ *{String}* (Optional) - - Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used. - - * __auth__ *{Boolean}* (Optional, Default = null) - - Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds. - - * __download__ *{Boolean}* (Optional, Default = false) - - Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser. - - * __brokenIsFine__ *{Boolean}* (Optional, Default = false) - - Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet. - - * __metadata__ *{Boolean}* (Optional, Default = false) - - Return the URL for the file metadata access point rather than the file itself. - - * __uploading__ *{String}* (Optional, Default = null) - - A URL to return while the file is being uploaded. - - * __storing__ *{String}* (Optional, Default = null) - - A URL to return while the file is being stored. - - * __filename__ *{String}* (Optional, Default = null) - - Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store. - - - -Returns the HTTP URL for getting the file or its metadata. - -> ```FS.File.prototype.url = function(options) { ...``` [access-point-common.js:72](access-point-common.js#L72) - - -*** - -__File: ["access-point-handlers.js"](access-point-handlers.js) Where: {server}__ - -*** - -### *FSHTTPHandlers*.Del()  Server ### - -*This method __Del__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{any}* -response - - -HTTP DEL request handler - -> ```FS.HTTP.Handlers.Del = function httpDelHandler(ref) { ...``` [access-point-handlers.js:13](access-point-handlers.js#L13) - - -- - -### *self*.setStatusCode {any}  Server ### - -``` -From the DELETE spec: -A successful response SHOULD be 200 (OK) if the response includes an -entity describing the status, 202 (Accepted) if the action has not -yet been enacted, or 204 (No Content) if the action has been enacted -but the response does not include an entity. -``` -*This property __setStatusCode__ is defined in `self`* - -> ```self.setStatusCode(200);``` [access-point-handlers.js:27](access-point-handlers.js#L27) - - -- - -### *FSHTTPHandlers*.GetList()  Server ### - -*This method __GetList__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response - - -HTTP GET file list request handler - -> ```FS.HTTP.Handlers.GetList = function httpGetListHandler() { ...``` [access-point-handlers.js:41](access-point-handlers.js#L41) - - -- - -### requestRange {any}  Server ### - -``` -requestRange will parse the range set in request header - if not possible it -will throw fitting errors and autofill range for both partial and full ranges -throws error or returns the object: -{ -start -end -length -unit -partial -} -``` -*This property is private* - -> ```var requestRange = function(req, fileSize) { ...``` [access-point-handlers.js:60](access-point-handlers.js#L60) - - -- - -### *FSHTTPHandlers*.Get()  Server ### - -*This method __Get__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{any}* -response - - -HTTP GET request handler - -> ```FS.HTTP.Handlers.Get = function httpGetHandler(ref) { ...``` [access-point-handlers.js:135](access-point-handlers.js#L135) - - -- - -### *FSHTTPHandlers*.PutInsert()  Server ### - -*This method __PutInsert__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response object with _id property - - -HTTP PUT file insert request handler - -> ```FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { ...``` [access-point-handlers.js:229](access-point-handlers.js#L229) - - -- - -### *FSHTTPHandlers*.PutUpdate()  Server ### - -*This method __PutUpdate__ is defined in `FS.HTTP.Handlers`* - -__Returns__ *{Object}* -response object with _id and chunk properties - - -HTTP PUT file update chunk request handler - -> ```FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { ...``` [access-point-handlers.js:264](access-point-handlers.js#L264) - - -*** - -__File: ["access-point-server.js"](access-point-server.js) Where: {server}__ - -*** - -### *FSHTTP*.setHeadersForGet(headers, [collections])  Server ### - -*This method __setHeadersForGet__ is defined in `FS.HTTP`* - -__Arguments__ - -* __headers__ *{Array}* - - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value. - -* __collections__ *{Array|String}* (Optional) - - Which collections the headers should be added for. Omit this argument to add the header for all collections. - - -__Returns__ *{undefined}* - - -> ```FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { ...``` [access-point-server.js:24](access-point-server.js#L24) - - -- - -### *FSHTTP*.publish(collection, func)  Server ### - -*This method __publish__ is defined in `FS.HTTP`* - -__Arguments__ - -* __collection__ *{[FS.Collection](#FS.Collection)}* -* __func__ *{Function}* - - Publish function that returns a cursor. - - -__Returns__ *{undefined}* - - -Publishes all documents returned by the cursor at a GET URL -with the format baseUrl/record/collectionName. The publish -function `this` is similar to normal `Meteor.publish`. - -> ```FS.HTTP.publish = function fsHttpPublish(collection, func) { ...``` [access-point-server.js:48](access-point-server.js#L48) - - -- - -### *FSHTTP*.unpublish(collection)  Server ### - -*This method __unpublish__ is defined in `FS.HTTP`* - -__Arguments__ - -* __collection__ *{[FS.Collection](#FS.Collection)}* - -__Returns__ *{undefined}* - - -Unpublishes a restpoint created by a call to `FS.HTTP.publish` - -> ```FS.HTTP.unpublish = function fsHttpUnpublish(collection) { ...``` [access-point-server.js:73](access-point-server.js#L73) - - -- - -### defaultSelectorFunction()  Server ### - -*This method is private* - -__Returns__ *{ collection, file }* - - -This is the default selector function - -> ```var defaultSelectorFunction = function() { ...``` [access-point-server.js:87](access-point-server.js#L87) - - -- - -### *FSHTTP*.mount(mountPoints, selector_f)  Server ### - -*This method __mount__ is defined in `FS.HTTP`* - -__Arguments__ - -* __mountPoints__ *{[array of string](#array of string)}* - - mount points to map rest functinality on - -* __selector_f__ *{function}* - - [selector] function returns `{ collection, file }` for mount points to work with - - - -> ```FS.HTTP.mount = function(mountPoints, selector_f) { ...``` [access-point-server.js:125](access-point-server.js#L125) - - -- - -### *FSHTTP*.unmount([mountPoints])  Server ### - -*This method __unmount__ is defined in `FS.HTTP`* - -__Arguments__ - -* __mountPoints__ *{[string ](#string )|[ array of string](# array of string)}* (Optional) - - Optional, if not specified all mountpoints are unmounted - - - - -> ```FS.HTTP.unmount = function(mountPoints) { ...``` [access-point-server.js:223](access-point-server.js#L223) - - - -- -### FS.Collection maps on HTTP pr. default on the following restpoints: -* -baseUrl + '/files/:collectionName/:id/:filename', -baseUrl + '/files/:collectionName/:id', -baseUrl + '/files/:collectionName' - -Change/ replace the existing mount point by: -```js -unmount all existing -FS.HTTP.unmount(); -Create new mount point -FS.HTTP.mount([ -'/cfs/files/:collectionName/:id/:filename', -'/cfs/files/:collectionName/:id', -'/cfs/files/:collectionName' -]); -``` diff --git a/packages/wekan-cfs-access-point/package.js b/packages/wekan-cfs-access-point/package.js deleted file mode 100644 index 913252e2a..000000000 --- a/packages/wekan-cfs-access-point/package.js +++ /dev/null @@ -1,65 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-access-point', - version: '0.1.50', - summary: 'CollectionFS, add ddp and http accesspoint capability', - git: 'https://github.com/zcfs/Meteor-cfs-access-point.git' -}); - -Npm.depends({ - "content-disposition": "0.5.0" -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - // This imply is needed for tests, and is technically probably correct anyway. - api.imply([ - 'wekan-cfs-base-package' - ]); - - api.use([ - //CFS packages - 'wekan-cfs-base-package@0.0.30', - 'wekan-cfs-file@0.1.16', - //Core packages - 'check', - 'ejson', - //Other packages - 'wekan-cfs-http-methods@0.0.29', - 'wekan-cfs-http-publish@0.0.13' - ]); - - api.addFiles([ - 'access-point-common.js', - 'access-point-handlers.js', - 'access-point-server.js' - ], 'server'); - - api.addFiles([ - 'access-point-common.js', - 'access-point-client.js' - ], 'client'); -}); - -Package.onTest(function (api) { - api.versionsFrom('1.0'); - - api.use([ - //CFS packages - 'wekan-cfs-access-point', - 'wekan-cfs-standard-packages@0.0.2', - 'wekan-cfs-gridfs@0.0.0', - //Core packages - 'test-helpers', - 'http', - 'tinytest', - 'underscore', - 'ejson', - 'ordered-dict', - 'random', - 'deps' - ]); - - api.addFiles('tests/client-tests.js', 'client'); - api.addFiles('tests/server-tests.js', 'server'); -}); diff --git a/packages/wekan-cfs-access-point/tests/client-tests.js b/packages/wekan-cfs-access-point/tests/client-tests.js deleted file mode 100644 index a0148ec17..000000000 --- a/packages/wekan-cfs-access-point/tests/client-tests.js +++ /dev/null @@ -1,125 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-access-point - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof FS.HTTP !== 'undefined', 'test environment not initialized FS.HTTP'); -}); - -Images = new FS.Collection('images', { - stores: [ - new FS.Store.GridFS('gridList') - ] -}); - -Meteor.subscribe("img"); - -var id; - -Tinytest.addAsync('cfs-access-point - client - addTestImage', function(test, onComplete) { - Meteor.call('addTestImage', function(err, result) { - id = result; - test.equal(typeof id, "string", "Test image was not inserted properly"); - //Don't continue until the data has been stored - Deps.autorun(function (c) { - var img = Images.findOne(id); - if (img && img.hasCopy('gridList')) { - onComplete(); - c.stop(); - } - }); - }); -}); - -Tinytest.addAsync('cfs-access-point - client - GET list of files in collection', function(test, onComplete) { - - HTTP.get(Meteor.absoluteUrl('cfs/record/images'), function(err, result) { - // Test the length of array result - var len = result.data && result.data.length; - test.isTrue(!!len, 'Result was empty'); - // Get the object - var obj = result.data && result.data[0] || {}; - test.equal(obj._id, id, 'Didn\'t get the expected result'); - onComplete(); - }); - -}); - -Tinytest.addAsync('cfs-access-point - client - GET filerecord', function(test, onComplete) { - - HTTP.get(Meteor.absoluteUrl('cfs/record/images/' + id), function(err, result) { - // Get the object - var obj = result.data; - test.equal(typeof obj, "object", "Expected object data"); - test.equal(obj._id, id, 'Didn\'t get the expected result'); - onComplete(); - }); - -}); - -Tinytest.addAsync('cfs-access-point - client - GET file itself', function(test, onComplete) { - - HTTP.get(Meteor.absoluteUrl('cfs/files/images/' + id), function(err, result) { - test.isTrue(!!result.content, "Expected content in response"); - console.log(result); - test.equal(result.statusCode, 200, "Expected 200 OK response"); - onComplete(); - }); - -}); - -Tinytest.addAsync('cfs-access-point - client - PUT new file data (update)', function(test, onComplete) { -// TODO -// HTTP.put(Meteor.absoluteUrl('cfs/files/images/' + id), function(err, result) { -// test.equal(result.statusCode, 200, "Expected 200 OK response"); - onComplete(); -// }); - -}); - -Tinytest.addAsync('cfs-access-point - client - PUT insert a new file', function(test, onComplete) { -// TODO -// HTTP.put(Meteor.absoluteUrl('cfs/files/images'), function(err, result) { -// test.equal(result.statusCode, 200, "Expected 200 OK response"); - onComplete(); -// }); - -}); - -Tinytest.addAsync('cfs-access-point - client - DELETE filerecord and data', function(test, onComplete) { - - HTTP.del(Meteor.absoluteUrl('cfs/files/images/' + id), function(err, result) { - test.equal(result.statusCode, 200, "Expected 200 OK response"); - - // Make sure it's gone - HTTP.get(Meteor.absoluteUrl('cfs/record/images/' + id), function(err, result) { - test.isTrue(!!err, 'Expected 404 error'); - test.equal(result.statusCode, 404, "Expected 404 response"); - onComplete(); - }); - }); - -}); - -//TODO test FS.File.prototype.url method with various options - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-access-point/tests/server-tests.js b/packages/wekan-cfs-access-point/tests/server-tests.js deleted file mode 100644 index 4a23f1cb6..000000000 --- a/packages/wekan-cfs-access-point/tests/server-tests.js +++ /dev/null @@ -1,68 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -FS.debug = true; - -Tinytest.add('cfs-access-point - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof FS.HTTP !== 'undefined', 'test environment not initialized FS.HTTP'); -}); - -Images = new FS.Collection('images', { - stores: [ - new FS.Store.GridFS('gridList') - ] -}); - -Images.allow({ - insert: function() { - return true; - }, - update: function() { - return true; - }, - remove: function() { - return true; - }, - download: function() { - return true; - } -}); - -Meteor.publish("img", function () { - return Images.find(); -}); - -FS.HTTP.publish(Images, function () { - return Images.find(); -}); - -Meteor.methods({ - addTestImage: function() { - Images.remove({}); - var url = "http://cdn.morguefile.com/imageData/public/files/b/bboomerindenial/preview/fldr_2009_04_01/file3301238617907.jpg"; - var fsFile = Images.insert(url); - return fsFile._id; - } -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-base-package/.travis.yml b/packages/wekan-cfs-base-package/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-base-package/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-base-package/LICENSE.md b/packages/wekan-cfs-base-package/LICENSE.md deleted file mode 100644 index 51e60c3d0..000000000 --- a/packages/wekan-cfs-base-package/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2015 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-base-package/README.md b/packages/wekan-cfs-base-package/README.md deleted file mode 100644 index 235ca9aa0..000000000 --- a/packages/wekan-cfs-base-package/README.md +++ /dev/null @@ -1,11 +0,0 @@ -wekan-cfs-base-package -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. - -This package provides the `FS` namespace and helper methods used by many -CollectionFS packages. \ No newline at end of file diff --git a/packages/wekan-cfs-base-package/api.md b/packages/wekan-cfs-base-package/api.md deleted file mode 100644 index cb7667945..000000000 --- a/packages/wekan-cfs-base-package/api.md +++ /dev/null @@ -1,213 +0,0 @@ -## cfs-base-package Public API ## - -CollectionFS, Base package - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -############################################################################# - -HELPERS - -############################################################################# -- - -### *fsUtility*.cloneFileRecord(rec, [options])  Anywhere ### - -*This method __cloneFileRecord__ is defined in `FS.Utility`* - -__Arguments__ - -* __rec__ *{[FS.File](#FS.File)|[FS.Collection filerecord](#FS.Collection filerecord)}* -* __options__ *{Object}* (Optional) - * __full__ *{Boolean}* (Optional, Default = false) - - Set `true` to prevent certain properties from being omitted from the clone. - - -__Returns__ *{Object}* -Cloned filerecord - - -Makes a shallow clone of `rec`, filtering out some properties that might be present if -it's an FS.File instance, but which we never want to be part of the stored -filerecord. - -This is a blacklist clone rather than a whitelist because we want the user to be able -to specify whatever additional properties they wish. - -In general, we expect the following whitelist properties used by the internal and -external APIs: - -_id, name, size, type, chunkCount, chunkSize, chunkSum, copies, createdAt, updatedAt, uploadedAt - -Those properties, and any additional properties added by the user, should be present -in the returned object, which is suitable for inserting into the backing collection or -extending an FS.File instance. - - -> ```FS.Utility.cloneFileRecord = function(rec, options) { ...``` [base-common.js:71](base-common.js#L71) - - -- - -### *fsUtility*.defaultCallback([err])  Anywhere ### - -*This method __defaultCallback__ is defined in `FS.Utility`* - -__Arguments__ - -* __err__ *{[Error](#Error)}* (Optional) - -__Returns__ *{undefined}* - - -Can be used as a default callback for client methods that need a callback. -Simply throws the provided error if there is one. - -> ```FS.Utility.defaultCallback = function defaultCallback(err) { ...``` [base-common.js:96](base-common.js#L96) - - -- - -### *fsUtility*.defaultCallback([f], [err])  Anywhere ### - -*This method __defaultCallback__ is defined in `FS.Utility`* - -__Arguments__ - -* __f__ *{Function}* (Optional) - - A callback function, if you have one. Can be undefined or null. - -* __err__ *{[Meteor.Error ](#Meteor.Error )|[ Error ](# Error )|[ String](# String)}* (Optional) - - Error or error message (string) - - -__Returns__ *{Any}* -the callback result if any - - -Handle Error, creates an Error instance with the given text. If callback is -a function, passes the error to that function. Otherwise throws it. Useful -for dealing with errors in methods that optionally accept a callback. - -> ```FS.Utility.handleError = function(f, err, result) { ...``` [base-common.js:120](base-common.js#L120) - - -- - -### *fsUtility*.noop()  Anywhere ### - -*This method __noop__ is defined in `FS.Utility`* - -Use this to hand a no operation / empty function - -> ```FS.Utility.noop = function() { ...``` [base-common.js:134](base-common.js#L134) - - -- - -### *fsUtility*.getFileExtension(name)  Anywhere ### - -*This method __getFileExtension__ is defined in `FS.Utility`* - -__Arguments__ - -* __name__ *{String}* - - A filename, filepath, or URL that may or may not have an extension. - - -__Returns__ *{String}* -The extension or an empty string if no extension found. - - -> ```FS.Utility.getFileExtension = function utilGetFileExtension(name) { ...``` [base-common.js:205](base-common.js#L205) - - -- - -### *fsUtility*.setFileExtension(name, ext)  Anywhere ### - -*This method __setFileExtension__ is defined in `FS.Utility`* - -__Arguments__ - -* __name__ *{String}* - - A filename that may or may not already have an extension. - -* __ext__ *{String}* - - An extension without leading period, which you want to be the new extension on `name`. - - -__Returns__ *{String}* -The filename with changed extension. - - -> ```FS.Utility.setFileExtension = function utilSetFileExtension(name, ext) { ...``` [base-common.js:222](base-common.js#L222) - - -- - -### *fsUtility*.binaryToBuffer(data)  Server ### - -*This method __binaryToBuffer__ is defined in `FS.Utility`* - -__Arguments__ - -* __data__ *{Uint8Array}* - -__Returns__ *{Buffer}* - - -Converts a Uint8Array instance to a Node Buffer instance - -> ```FS.Utility.binaryToBuffer = function(data) { ...``` [base-server.js:9](base-server.js#L9) - - -- - -### *fsUtility*.bufferToBinary(data)  Server ### - -*This method __bufferToBinary__ is defined in `FS.Utility`* - -__Arguments__ - -* __data__ *{Buffer}* - -__Returns__ *{Uint8Array}* - - -Converts a Node Buffer instance to a Uint8Array instance - -> ```FS.Utility.bufferToBinary = function(data) { ...``` [base-server.js:26](base-server.js#L26) - - -- - -### *fsUtility*.eachFile(e, f)  Client ### - -*This method __eachFile__ is defined in `FS.Utility`* - -__Arguments__ - -* __e__ *{[Event](#Event)}* - - Browser event - -* __f__ *{Function}* - - Function to run for each file found in the event. - - -__Returns__ *{undefined}* - - -Utility for iteration over files in event - -> ```FS.Utility.eachFile = function(e, f) { ...``` [base-client.js:37](base-client.js#L37) - - diff --git a/packages/wekan-cfs-base-package/base-client.js b/packages/wekan-cfs-base-package/base-client.js deleted file mode 100644 index 4d0d2ff59..000000000 --- a/packages/wekan-cfs-base-package/base-client.js +++ /dev/null @@ -1,51 +0,0 @@ - -//XXX not sure this is still working properly? -FS.Utility.connectionLogin = function(connection) { - // We check if the accounts package is installed, since we depend on - // `Meteor.userId()` - if (typeof Accounts !== 'undefined') { - // Monitor logout from main connection - Meteor.startup(function() { - Tracker.autorun(function() { - var userId = Meteor.userId(); - if (userId) { - connection.onReconnect = function() { - var token = Accounts._storedLoginToken(); - connection.apply('login', [{resume: token}], function(err, result) { - if (!err && result) { - connection.setUserId(result.id); - } - }); - }; - } else { - connection.onReconnect = null; - connection.setUserId(null); - } - }); - }); - - } -}; - -/** - * @method FS.Utility.eachFile - * @public - * @param {Event} e - Browser event - * @param {Function} f - Function to run for each file found in the event. - * @returns {undefined} - * - * Utility for iteration over files in event - */ -FS.Utility.eachFile = function(e, f) { - var evt = (e.originalEvent || e); - - var files = evt.target.files; - - if (!files || files.length === 0) { - files = evt.dataTransfer ? evt.dataTransfer.files : []; - } - - for (var i = 0; i < files.length; i++) { - f(files[i], i); - } -}; diff --git a/packages/wekan-cfs-base-package/base-common.js b/packages/wekan-cfs-base-package/base-common.js deleted file mode 100644 index 082621e7b..000000000 --- a/packages/wekan-cfs-base-package/base-common.js +++ /dev/null @@ -1,317 +0,0 @@ -// Exported namespace -FS = {}; - -// namespace for adapters; XXX should this be added by cfs-storage-adapter pkg instead? -FS.Store = { - GridFS: function () { - throw new Error('To use FS.Store.GridFS, you must add the "wekan-cfs-gridfs" package.'); - }, - FileSystem: function () { - throw new Error('To use FS.Store.FileSystem, you must add the "wekan-cfs-filesystem" package.'); - }, - S3: function () { - throw new Error('To use FS.Store.S3, you must add the "wekan-cfs-s3" package.'); - }, - WABS: function () { - throw new Error('To use FS.Store.WABS, you must add the "wekan-cfs-wabs" package.'); - }, - Dropbox: function () { - throw new Error('To use FS.Store.Dropbox, you must add the "wekan-cfs-dropbox" package.'); - } -}; - -// namespace for access points -FS.AccessPoint = {}; - -// namespace for utillities -FS.Utility = {}; - -// A general place for any package to store global config settings -FS.config = {}; - -// An internal collection reference -FS._collections = {}; - -// Test scope -_Utility = {}; - -// ############################################################################# -// -// HELPERS -// -// ############################################################################# - -/** @method _Utility.defaultZero - * @private - * @param {Any} val Returns number or 0 if value is a falsy - */ -_Utility.defaultZero = function(val) { - return +(val || 0); -}; - -/** - * @method FS.Utility.cloneFileRecord - * @public - * @param {FS.File|FS.Collection filerecord} rec - * @param {Object} [options] - * @param {Boolean} [options.full=false] Set `true` to prevent certain properties from being omitted from the clone. - * @returns {Object} Cloned filerecord - * - * Makes a shallow clone of `rec`, filtering out some properties that might be present if - * it's an FS.File instance, but which we never want to be part of the stored - * filerecord. - * - * This is a blacklist clone rather than a whitelist because we want the user to be able - * to specify whatever additional properties they wish. - * - * In general, we expect the following whitelist properties used by the internal and - * external APIs: - * - * _id, name, size, type, chunkCount, chunkSize, chunkSum, copies, createdAt, updatedAt, uploadedAt - * - * Those properties, and any additional properties added by the user, should be present - * in the returned object, which is suitable for inserting into the backing collection or - * extending an FS.File instance. - * - */ -FS.Utility.cloneFileRecord = function(rec, options) { - options = options || {}; - var result = {}; - // We use this method for two purposes. If using it to clone one FS.File into another, then - // we want a full clone. But if using it to get a filerecord object for inserting into the - // internal collection, then there are certain properties we want to omit so that they aren't - // stored in the collection. - var omit = options.full ? [] : ['collectionName', 'collection', 'data', 'createdByTransform']; - for (var prop in rec) { - if (rec.hasOwnProperty(prop) && !_.contains(omit, prop)) { - result[prop] = rec[prop]; - } - } - return result; -}; - -/** - * @method FS.Utility.defaultCallback - * @public - * @param {Error} [err] - * @returns {undefined} - * - * Can be used as a default callback for client methods that need a callback. - * Simply throws the provided error if there is one. - */ -FS.Utility.defaultCallback = function defaultCallback(err) { - if (err) { - // Show gentle error if Meteor error - if (err instanceof Meteor.Error) { - console.error(err.message); - } else { - // Normal error, just throw error - throw err; - } - - } -}; - -/** - * @method FS.Utility.defaultCallback - * @public - * @param {Function} [f] A callback function, if you have one. Can be undefined or null. - * @param {Meteor.Error | Error | String} [err] Error or error message (string) - * @returns {Any} the callback result if any - * - * Handle Error, creates an Error instance with the given text. If callback is - * a function, passes the error to that function. Otherwise throws it. Useful - * for dealing with errors in methods that optionally accept a callback. - */ -FS.Utility.handleError = function(f, err, result) { - // Set callback - var callback = (typeof f === 'function')? f : FS.Utility.defaultCallback; - // Set the err - var error = (err === ''+err)? new Error(err) : err; - // callback - return callback(error, result); -} - -/** - * @method FS.Utility.noop - * @public - * Use this to hand a no operation / empty function - */ -FS.Utility.noop = function() {}; - -/** - * @method validateAction - * @private - * @param {Object} validators - The validators object to use, with `deny` and `allow` properties. - * @param {FS.File} fileObj - Mounted or mountable file object to be passed to validators. - * @param {String} userId - The ID of the user who is attempting the action. - * @returns {undefined} - * - * Throws a "400-Bad Request" Meteor error if the file is not mounted or - * a "400-Access denied" Meteor error if the action is not allowed. - */ -FS.Utility.validateAction = function validateAction(validators, fileObj, userId) { - var denyValidators = validators.deny; - var allowValidators = validators.allow; - - // If insecure package is used and there are no validators defined, - // allow the action. - if (typeof Package === 'object' - && Package.insecure - && denyValidators.length + allowValidators.length === 0) { - return; - } - - // If already mounted, validators should receive a fileObj - // that is fully populated - if (fileObj.isMounted()) { - fileObj.getFileRecord(); - } - - // Any deny returns true means denied. - if (_.any(denyValidators, function(validator) { - return validator(userId, fileObj); - })) { - throw new Meteor.Error(403, "Access denied"); - } - // Any allow returns true means proceed. Throw error if they all fail. - if (_.all(allowValidators, function(validator) { - return !validator(userId, fileObj); - })) { - throw new Meteor.Error(403, "Access denied"); - } -}; - -/** - * @method FS.Utility.getFileName - * @private - * @param {String} name - A filename, filepath, or URL - * @returns {String} The filename without the URL, filepath, or query string - */ -FS.Utility.getFileName = function utilGetFileName(name) { - // in case it's a URL, strip off potential query string - // should have no effect on filepath - name = name.split('?')[0]; - // strip off beginning path or url - var lastSlash = name.lastIndexOf('/'); - if (lastSlash !== -1) { - name = name.slice(lastSlash + 1); - } - return name; -}; - -/** - * @method FS.Utility.getFileExtension - * @public - * @param {String} name - A filename, filepath, or URL that may or may not have an extension. - * @returns {String} The extension or an empty string if no extension found. - */ -FS.Utility.getFileExtension = function utilGetFileExtension(name) { - name = FS.Utility.getFileName(name); - // Seekout the last '.' if found - var found = name.lastIndexOf('.'); - // Return the extension if found else '' - // If found is -1, we return '' because there is no extension - // If found is 0, we return '' because it's a hidden file - return (found > 0 ? name.slice(found + 1).toLowerCase() : ''); -}; - -/** - * @method FS.Utility.setFileExtension - * @public - * @param {String} name - A filename that may or may not already have an extension. - * @param {String} ext - An extension without leading period, which you want to be the new extension on `name`. - * @returns {String} The filename with changed extension. - */ -FS.Utility.setFileExtension = function utilSetFileExtension(name, ext) { - if (!name || !name.length) { - return name; - } - var currentExt = FS.Utility.getFileExtension(name); - if (currentExt.length) { - name = name.slice(0, currentExt.length * -1) + ext; - } else { - name = name + '.' + ext; - } - return name; -}; - -/* - * Borrowed these from http package - */ -FS.Utility.encodeParams = function encodeParams(params) { - var buf = []; - _.each(params, function(value, key) { - if (buf.length) - buf.push('&'); - buf.push(FS.Utility.encodeString(key), '=', FS.Utility.encodeString(value)); - }); - return buf.join('').replace(/%20/g, '+'); -}; - -FS.Utility.encodeString = function encodeString(str) { - return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A"); -}; - -/* - * btoa and atob shims for client and server - */ - -FS.Utility._btoa = function _fsUtility_btoa(str) { - var buffer; - - if (str instanceof Buffer) { - buffer = str; - } else { - buffer = new Buffer(str.toString(), 'binary'); - } - - return buffer.toString('base64'); -}; - -FS.Utility.btoa = function fsUtility_btoa(str) { - if (typeof btoa === 'function') { - // Client - return btoa(str); - } else if (typeof Buffer !== 'undefined') { - // Server - return FS.Utility._btoa(str); - } else { - throw new Error('FS.Utility.btoa: Cannot base64 encode on your system'); - } -}; - -FS.Utility._atob = function _fsUtility_atob(str) { - return new Buffer(str, 'base64').toString('binary'); -}; - -FS.Utility.atob = function fsUtility_atob(str) { - if (typeof atob === 'function') { - // Client - return atob(str); - } else if (typeof Buffer !== 'undefined') { - // Server - return FS.Utility._atob(str); - } else { - throw new Error('FS.Utility.atob: Cannot base64 encode on your system'); - } -}; - -// Api wrap for 3party libs like underscore -FS.Utility.extend = _.extend; - -FS.Utility.each = _.each; - -FS.Utility.isEmpty = _.isEmpty; - -FS.Utility.indexOf = _.indexOf; - -FS.Utility.isArray = _.isArray; - -FS.Utility.map = _.map; - -FS.Utility.once = _.once; - -FS.Utility.include = _.include; - -FS.Utility.size = _.size; diff --git a/packages/wekan-cfs-base-package/base-server.js b/packages/wekan-cfs-base-package/base-server.js deleted file mode 100644 index 7b9309b7d..000000000 --- a/packages/wekan-cfs-base-package/base-server.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @method FS.Utility.binaryToBuffer - * @public - * @param {Uint8Array} data - * @returns {Buffer} - * - * Converts a Uint8Array instance to a Node Buffer instance - */ -FS.Utility.binaryToBuffer = function(data) { - var len = data.length; - var buffer = new Buffer(len); - for (var i = 0; i < len; i++) { - buffer[i] = data[i]; - } - return buffer; -}; - -/** - * @method FS.Utility.bufferToBinary - * @public - * @param {Buffer} data - * @returns {Uint8Array} - * - * Converts a Node Buffer instance to a Uint8Array instance - */ -FS.Utility.bufferToBinary = function(data) { - var len = data.length; - var binary = EJSON.newBinary(len); - for (var i = 0; i < len; i++) { - binary[i] = data[i]; - } - return binary; -}; - -/** - * @method FS.Utility.safeCallback - * @public - * @param {Function} callback - * @returns {Function} - * - * Makes a callback safe for Meteor code - */ -FS.Utility.safeCallback = function (callback) { - return Meteor.bindEnvironment(callback, function(err) { throw err; }); -}; - -/** - * @method FS.Utility.safeStream - * @public - * @param {Stream} nodestream - * @returns {Stream} - * - * Adds `safeOn` and `safeOnce` methods to a NodeJS Stream - * object. These are the same as `on` and `once`, except - * that the callback is wrapped for use in Meteor. - */ -FS.Utility.safeStream = function(nodestream) { - if (!nodestream || typeof nodestream.on !== 'function') - throw new Error('FS.Utility.safeStream requires a NodeJS Stream'); - - // Create Meteor safe events - nodestream.safeOn = function(name, callback) { - return nodestream.on(name, FS.Utility.safeCallback(callback)); - }; - - // Create Meteor safe events - nodestream.safeOnce = function(name, callback) { - return nodestream.once(name, FS.Utility.safeCallback(callback)); - }; - - // Return the modified stream - modified anyway - return nodestream; -}; - -/** - * @method FS.Utility.eachFileFromPath - * @public - * @param {String} p - Server path - * @param {Function} f - Function to run for each file found in the path. - * @returns {undefined} - * - * Utility for iteration over files from path on server - */ -FS.Utility.eachFileFromPath = function(p, f) { - var fs = Npm.require('fs'); - var path = Npm.require('path'); - var files = fs.readdirSync(p); - files.map(function (file) { - return path.join(p, file); - }).filter(function (filePath) { - return fs.statSync(filePath).isFile() && path.basename(filePath)[0] !== '.'; - }).forEach(function (filePath) { - f(filePath); - }); -}; diff --git a/packages/wekan-cfs-base-package/internal.api.md b/packages/wekan-cfs-base-package/internal.api.md deleted file mode 100644 index 559c4e7a9..000000000 --- a/packages/wekan-cfs-base-package/internal.api.md +++ /dev/null @@ -1,293 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["base-common.js"](base-common.js) Where: {server|client}__ - -*** - -############################################################################# - -HELPERS - -############################################################################# -- - -### *_utility*.defaultZero(val)  Anywhere ### - -*This method is private* -*This method __defaultZero__ is defined in `_Utility`* - -__Arguments__ - -* __val__ *{Any}* - - Returns number or 0 if value is a falsy - - -> ```_Utility.defaultZero = function(val) { ...``` [base-common.js:42](base-common.js#L42) - - -- - -### *fsUtility*.cloneFileRecord(rec, [options])  Anywhere ### - -*This method __cloneFileRecord__ is defined in `FS.Utility`* - -__Arguments__ - -* __rec__ *{[FS.File](#FS.File)|[FS.Collection filerecord](#FS.Collection filerecord)}* -* __options__ *{Object}* (Optional) - * __full__ *{Boolean}* (Optional, Default = false) - - Set `true` to prevent certain properties from being omitted from the clone. - - -__Returns__ *{Object}* -Cloned filerecord - - -Makes a shallow clone of `rec`, filtering out some properties that might be present if -it's an FS.File instance, but which we never want to be part of the stored -filerecord. - -This is a blacklist clone rather than a whitelist because we want the user to be able -to specify whatever additional properties they wish. - -In general, we expect the following whitelist properties used by the internal and -external APIs: - -_id, name, size, type, chunkCount, chunkSize, chunkSum, copies, createdAt, updatedAt, uploadedAt - -Those properties, and any additional properties added by the user, should be present -in the returned object, which is suitable for inserting into the backing collection or -extending an FS.File instance. - - -> ```FS.Utility.cloneFileRecord = function(rec, options) { ...``` [base-common.js:71](base-common.js#L71) - - -- - -### *fsUtility*.defaultCallback([err])  Anywhere ### - -*This method __defaultCallback__ is defined in `FS.Utility`* - -__Arguments__ - -* __err__ *{[Error](#Error)}* (Optional) - -__Returns__ *{undefined}* - - -Can be used as a default callback for client methods that need a callback. -Simply throws the provided error if there is one. - -> ```FS.Utility.defaultCallback = function defaultCallback(err) { ...``` [base-common.js:96](base-common.js#L96) - - -- - -### *fsUtility*.defaultCallback([f], [err])  Anywhere ### - -*This method __defaultCallback__ is defined in `FS.Utility`* - -__Arguments__ - -* __f__ *{Function}* (Optional) - - A callback function, if you have one. Can be undefined or null. - -* __err__ *{[Meteor.Error ](#Meteor.Error )|[ Error ](# Error )|[ String](# String)}* (Optional) - - Error or error message (string) - - -__Returns__ *{Any}* -the callback result if any - - -Handle Error, creates an Error instance with the given text. If callback is -a function, passes the error to that function. Otherwise throws it. Useful -for dealing with errors in methods that optionally accept a callback. - -> ```FS.Utility.handleError = function(f, err, result) { ...``` [base-common.js:120](base-common.js#L120) - - -- - -### *fsUtility*.noop()  Anywhere ### - -*This method __noop__ is defined in `FS.Utility`* - -Use this to hand a no operation / empty function - -> ```FS.Utility.noop = function() { ...``` [base-common.js:134](base-common.js#L134) - - -- - -### validateAction(validators, fileObj, userId)  Anywhere ### - -*This method is private* - -__Arguments__ - -* __validators__ *{Object}* - - The validators object to use, with `deny` and `allow` properties. - -* __fileObj__ *{[FS.File](#FS.File)}* - - Mounted or mountable file object to be passed to validators. - -* __userId__ *{String}* - - The ID of the user who is attempting the action. - - -__Returns__ *{undefined}* - - -Throws a "400-Bad Request" Meteor error if the file is not mounted or -a "400-Access denied" Meteor error if the action is not allowed. - -> ```FS.Utility.validateAction = function validateAction(validators, fileObj, userId) { ...``` [base-common.js:147](base-common.js#L147) - - -- - -### *fsUtility*.getFileName(name)  Anywhere ### - -*This method is private* -*This method __getFileName__ is defined in `FS.Utility`* - -__Arguments__ - -* __name__ *{String}* - - A filename, filepath, or URL - - -__Returns__ *{String}* -The filename without the URL, filepath, or query string - - -> ```FS.Utility.getFileName = function utilGetFileName(name) { ...``` [base-common.js:187](base-common.js#L187) - - -- - -### *fsUtility*.getFileExtension(name)  Anywhere ### - -*This method __getFileExtension__ is defined in `FS.Utility`* - -__Arguments__ - -* __name__ *{String}* - - A filename, filepath, or URL that may or may not have an extension. - - -__Returns__ *{String}* -The extension or an empty string if no extension found. - - -> ```FS.Utility.getFileExtension = function utilGetFileExtension(name) { ...``` [base-common.js:205](base-common.js#L205) - - -- - -### *fsUtility*.setFileExtension(name, ext)  Anywhere ### - -*This method __setFileExtension__ is defined in `FS.Utility`* - -__Arguments__ - -* __name__ *{String}* - - A filename that may or may not already have an extension. - -* __ext__ *{String}* - - An extension without leading period, which you want to be the new extension on `name`. - - -__Returns__ *{String}* -The filename with changed extension. - - -> ```FS.Utility.setFileExtension = function utilSetFileExtension(name, ext) { ...``` [base-common.js:222](base-common.js#L222) - - -*** - -__File: ["base-server.js"](base-server.js) Where: {server}__ - -*** - -### *fsUtility*.binaryToBuffer(data)  Server ### - -*This method __binaryToBuffer__ is defined in `FS.Utility`* - -__Arguments__ - -* __data__ *{Uint8Array}* - -__Returns__ *{Buffer}* - - -Converts a Uint8Array instance to a Node Buffer instance - -> ```FS.Utility.binaryToBuffer = function(data) { ...``` [base-server.js:9](base-server.js#L9) - - -- - -### *fsUtility*.bufferToBinary(data)  Server ### - -*This method __bufferToBinary__ is defined in `FS.Utility`* - -__Arguments__ - -* __data__ *{Buffer}* - -__Returns__ *{Uint8Array}* - - -Converts a Node Buffer instance to a Uint8Array instance - -> ```FS.Utility.bufferToBinary = function(data) { ...``` [base-server.js:26](base-server.js#L26) - - -*** - -__File: ["base-client.js"](base-client.js) Where: {client}__ - -*** - -### *fsUtility*.eachFile(e, f)  Client ### - -*This method __eachFile__ is defined in `FS.Utility`* - -__Arguments__ - -* __e__ *{[Event](#Event)}* - - Browser event - -* __f__ *{Function}* - - Function to run for each file found in the event. - - -__Returns__ *{undefined}* - - -Utility for iteration over files in event - -> ```FS.Utility.eachFile = function(e, f) { ...``` [base-client.js:37](base-client.js#L37) - - diff --git a/packages/wekan-cfs-base-package/package.js b/packages/wekan-cfs-base-package/package.js deleted file mode 100644 index 82b3f712c..000000000 --- a/packages/wekan-cfs-base-package/package.js +++ /dev/null @@ -1,37 +0,0 @@ -Package.describe({ - version: '0.0.30', - name: 'wekan-cfs-base-package', - summary: 'CollectionFS, Base package', - git: 'https://github.com/zcfs/Meteor-cfs-base-package.git' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use(['deps', 'underscore', 'ejson']); - - if (api.export) { - api.export('FS'); - api.export('_Utility', { testOnly: true }); - } - - api.addFiles([ - 'base-common.js', - 'base-server.js' - ], 'server'); - - api.addFiles([ - 'polyfill.base64.js', - 'base-common.js', - 'base-client.js' - ], 'client'); -}); - -// Package.on_test(function (api) { -// api.use(['wekan-cfs-base-package', 'cfs-file']); -// api.use('test-helpers', 'server'); -// api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', -// 'random', 'deps']); - -// api.add_files('tests/common-tests.js', ['client', 'server']); -// }); diff --git a/packages/wekan-cfs-base-package/polyfill.base64.js b/packages/wekan-cfs-base-package/polyfill.base64.js deleted file mode 100644 index 14bf52f75..000000000 --- a/packages/wekan-cfs-base-package/polyfill.base64.js +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2010 Nick Galbreath - * http://code.google.com/p/stringencoders/source/browse/#svn/trunk/javascript - * - * 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. - */ - -/* base64 encode/decode compatible with window.btoa/atob - * - * window.atob/btoa is a Firefox extension to convert binary data (the "b") - * to base64 (ascii, the "a"). - * - * It is also found in Safari and Chrome. It is not available in IE. - * - * if (!window.btoa) window.btoa = base64.encode - * if (!window.atob) window.atob = base64.decode - * - * The original spec's for atob/btoa are a bit lacking - * https://developer.mozilla.org/en/DOM/window.atob - * https://developer.mozilla.org/en/DOM/window.btoa - * - * window.btoa and base64.encode takes a string where charCodeAt is [0,255] - * If any character is not [0,255], then an DOMException(5) is thrown. - * - * window.atob and base64.decode take a base64-encoded string - * If the input length is not a multiple of 4, or contains invalid characters - * then an DOMException(5) is thrown. - */ -var base64 = {}; -base64.PADCHAR = '='; -base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -base64.makeDOMException = function() { - // sadly in FF,Safari,Chrome you can't make a DOMException - var e, tmp; - - try { - return new DOMException(DOMException.INVALID_CHARACTER_ERR); - } catch (tmp) { - // not available, just passback a duck-typed equiv - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error/prototype - var ex = new Error("DOM Exception 5"); - - // ex.number and ex.description is IE-specific. - ex.code = ex.number = 5; - ex.name = ex.description = "INVALID_CHARACTER_ERR"; - - // Safari/Chrome output format - ex.toString = function() { return 'Error: ' + ex.name + ': ' + ex.message; }; - return ex; - } -} - -base64.getbyte64 = function(s,i) { - // This is oddly fast, except on Chrome/V8. - // Minimal or no improvement in performance by using a - // object with properties mapping chars to value (eg. 'A': 0) - var idx = base64.ALPHA.indexOf(s.charAt(i)); - if (idx === -1) { - throw base64.makeDOMException(); - } - return idx; -} - -base64.decode = function(s) { - // convert to string - s = '' + s; - var getbyte64 = base64.getbyte64; - var pads, i, b10; - var imax = s.length - if (imax === 0) { - return s; - } - - if (imax % 4 !== 0) { - throw base64.makeDOMException(); - } - - pads = 0 - if (s.charAt(imax - 1) === base64.PADCHAR) { - pads = 1; - if (s.charAt(imax - 2) === base64.PADCHAR) { - pads = 2; - } - // either way, we want to ignore this last block - imax -= 4; - } - - var x = []; - for (i = 0; i < imax; i += 4) { - b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | - (getbyte64(s,i+2) << 6) | getbyte64(s,i+3); - x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff)); - } - - switch (pads) { - case 1: - b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | (getbyte64(s,i+2) << 6); - x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff)); - break; - case 2: - b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12); - x.push(String.fromCharCode(b10 >> 16)); - break; - } - return x.join(''); -} - -base64.getbyte = function(s,i) { - var x = s.charCodeAt(i); - if (x > 255) { - throw base64.makeDOMException(); - } - return x; -} - -base64.encode = function(s) { - if (arguments.length !== 1) { - throw new SyntaxError("Not enough arguments"); - } - var padchar = base64.PADCHAR; - var alpha = base64.ALPHA; - var getbyte = base64.getbyte; - - var i, b10; - var x = []; - - // convert to string - s = '' + s; - - var imax = s.length - s.length % 3; - - if (s.length === 0) { - return s; - } - for (i = 0; i < imax; i += 3) { - b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8) | getbyte(s,i+2); - x.push(alpha.charAt(b10 >> 18)); - x.push(alpha.charAt((b10 >> 12) & 0x3F)); - x.push(alpha.charAt((b10 >> 6) & 0x3f)); - x.push(alpha.charAt(b10 & 0x3f)); - } - switch (s.length - imax) { - case 1: - b10 = getbyte(s,i) << 16; - x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) + - padchar + padchar); - break; - case 2: - b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8); - x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) + - alpha.charAt((b10 >> 6) & 0x3f) + padchar); - break; - } - return x.join(''); -} - -if (!window.btoa) window.btoa = base64.encode -if (!window.atob) window.atob = base64.decode \ No newline at end of file diff --git a/packages/wekan-cfs-base-package/tests/common-tests.js b/packages/wekan-cfs-base-package/tests/common-tests.js deleted file mode 100644 index 310d3b66b..000000000 --- a/packages/wekan-cfs-base-package/tests/common-tests.js +++ /dev/null @@ -1,161 +0,0 @@ -function equals(a, b) { - return EJSON.stringify(a) === EJSON.stringify(b); -} - -Tinytest.add('cfs-base-package - test environment', function(test) { - test.isTrue(typeof FS !== 'undefined', - 'FS scope not declared'); - - test.isTrue(typeof FS.Store !== 'undefined', - 'FS scope "FS.Store" not declared'); - - test.isTrue(typeof FS.AccessPoint !== 'undefined', - 'FS scope "FS.AccessPoint" not declared'); - - test.isTrue(typeof FS.Utility !== 'undefined', - 'FS scope "FS.Utility" not declared'); - - test.isTrue(typeof FS._collections !== 'undefined', - 'FS scope "FS._collections" not declared'); - - test.isTrue(typeof _Utility !== 'undefined', - '_Utility test scope not declared'); -}); - -Tinytest.add('cfs-base-package - _Utility.defaultZero', function(test) { - test.equal(_Utility.defaultZero(), 0, 'Failes to return 0 when (undefined)'); - test.equal(_Utility.defaultZero(undefined), 0, 'Failes to return 0 when undefined'); - test.equal(_Utility.defaultZero(null), 0, 'Failes to return 0 when null'); - test.equal(_Utility.defaultZero(false), 0, 'Failes to return 0 when false'); - test.equal(_Utility.defaultZero(0), 0, 'Failes to return 0 when 0'); - test.equal(_Utility.defaultZero(-1), -1, 'Failes to return -1'); - test.equal(_Utility.defaultZero(1), 1, 'Failes to return 1'); - test.equal(_Utility.defaultZero(-0.1), -0.1, 'Failes to return -0.1'); - test.equal(_Utility.defaultZero(0.1), 0.1, 'Failes to return 0.1'); - test.equal(_Utility.defaultZero(''), 0, 'Failes to return ""'); - test.equal(_Utility.defaultZero({}), NaN, 'Failes to return NaN when object'); - test.equal(_Utility.defaultZero("dfdsfs"), NaN, 'Failes to return NaN when string'); - test.equal(_Utility.defaultZero("1"), 1, 'Failes to return 1 when string "1"'); -}); - -Tinytest.add('cfs-base-package - FS.Utility.cloneFileRecord', function(test) { - // Given an object with any props, should filter out 'collectionName', - // 'collection', 'data', and 'createdByTransform' - var result = FS.Utility.cloneFileRecord({a: 1, b: {c: 1}, d: [1, 2], collectionName: 'test', collection: {}, data: {}, createdByTransform: false}); - test.equal(result, {a: 1, b: {c: 1}, d: [1, 2]}); - - // Given an FS.File instance, should filter out 'collectionName', - // 'collection', 'data', and 'createdByTransform' and return a plain Object - var fileObj = new FS.File({a: 1, b: {c: 1}, d: [1, 2], name: 'name.png', type: 'image/png', size: 100, collectionName: 'test', collection: {}, data: {}, createdByTransform: false}); - test.isTrue(fileObj instanceof FS.File); - var result = FS.Utility.cloneFileRecord(fileObj); - test.isFalse(result instanceof FS.File); - test.isTrue(equals(result, {a: 1, b: {c: 1}, d: [1, 2], name: 'name.png', type: 'image/png', size: 100})); -}); - -Tinytest.add('cfs-base-package - FS.Utility.defaultCallback', function(test) { - // should throw an error passed in, but not a Meteor.Error - test.throws(function () { - var cb = FS.Utility.defaultCallback; - cb(new Error('test')); - }); - - var cb2 = FS.Utility.defaultCallback; - test.isUndefined(cb2(new Meteor.Error('test'))); -}); - -Tinytest.add('cfs-base-package - FS.Utility.handleError', function(test) { - test.isTrue(true); - // TODO -}); - -Tinytest.add('cfs-base-package - FS.Utility.binaryToBuffer', function(test) { - test.isTrue(true); - // TODO -}); - -Tinytest.add('cfs-base-package - FS.Utility.bufferToBinary', function(test) { - test.isTrue(true); - // TODO -}); - -Tinytest.add('cfs-base-package - FS.Utility.connectionLogin', function(test) { - test.isTrue(true); - // TODO -}); - -Tinytest.add('cfs-base-package - FS.Utility.getFileName', function(test) { - - function t(input, expected) { - var ext = FS.Utility.getFileName(input); - test.equal(ext, expected, 'Got incorrect filename'); - } - - t('bar.png', 'bar.png'); - t('foo/bar.png', 'bar.png'); - t('/foo/foo/bar.png', 'bar.png'); - t('http://foobar.com/file.png', 'file.png'); - t('http://foobar.com/file', 'file'); - t('http://foobar.com/file.png?a=b', 'file.png'); - t('http://foobar.com/.file?a=b', '.file'); - t('file', 'file'); - t('.file', '.file'); - t('foo/.file', '.file'); - t('/foo/foo/.file', '.file'); -}); - -Tinytest.add('cfs-base-package - FS.Utility.getFileExtension', function(test) { - - function t(input, expected) { - var ext = FS.Utility.getFileExtension(input); - test.equal(ext, expected, 'Got incorrect extension'); - } - - t('bar.png', 'png'); - t('foo/bar.png', 'png'); - t('/foo/foo/bar.png', 'png'); - t('http://foobar.com/file.png', 'png'); - t('http://foobar.com/file', ''); - t('http://foobar.com/file.png?a=b', 'png'); - t('http://foobar.com/file?a=b', ''); - t('file', ''); - t('.file', ''); - t('foo/.file', ''); - t('/foo/foo/.file', ''); -}); - -Tinytest.add('cfs-base-package - FS.Utility.setFileExtension', function(test) { - - function t(name, ext, expected) { - var newName = FS.Utility.setFileExtension(name, ext); - test.equal(newName, expected, 'Extension was not set correctly'); - } - - t('bar.png', 'jpeg', 'bar.jpeg'); - t('bar', 'jpeg', 'bar.jpeg'); - t('.bar', 'jpeg', '.bar.jpeg'); - t('', 'jpeg', ''); - t(null, 'jpeg', null); -}); - -//Test API: -//Tinytest.add('', function(test) {}); -//Tinytest.addAsync('', function(test, onComplete) {}); -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-collection-filters/.travis.yml b/packages/wekan-cfs-collection-filters/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-collection-filters/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-collection-filters/LICENSE.md b/packages/wekan-cfs-collection-filters/LICENSE.md deleted file mode 100644 index b8d7fab60..000000000 --- a/packages/wekan-cfs-collection-filters/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2014 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-collection-filters/README.md b/packages/wekan-cfs-collection-filters/README.md deleted file mode 100644 index bf86e25e3..000000000 --- a/packages/wekan-cfs-collection-filters/README.md +++ /dev/null @@ -1,8 +0,0 @@ -wekan-cfs-collection-filters -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. \ No newline at end of file diff --git a/packages/wekan-cfs-collection-filters/api.md b/packages/wekan-cfs-collection-filters/api.md deleted file mode 100644 index 2013ed0a5..000000000 --- a/packages/wekan-cfs-collection-filters/api.md +++ /dev/null @@ -1,44 +0,0 @@ -## cfs-collection-filters Public API ## - -CollectionFS, adds FS.Collection filters - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -- - -### *fsCollection*.filters(filters)  Anywhere ### - -*This method __filters__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __filters__ *{Object}* - - File filters for this collection. - - -__Returns__ *{undefined}* - - -> ```FS.Collection.prototype.filters = function fsColFilters(filters) { ...``` [filters.js:7](filters.js#L7) - - -- - -### *fsCollection*.allowsFile()  Anywhere ### - -*This method __allowsFile__ is defined in `prototype` of `FS.Collection`* - -__Returns__ *{boolean}* -True if the collection allows this file. - - -Checks based on any filters defined on the collection. If the -file is not valid according to the filters, this method returns false -and also calls the filter `onInvalid` method defined for the -collection, passing it an English error string that explains why it -failed. - -> ```FS.Collection.prototype.allowsFile = function fsColAllowsFile(fileObj) { ...``` [filters.js:108](filters.js#L108) - - diff --git a/packages/wekan-cfs-collection-filters/filters.js b/packages/wekan-cfs-collection-filters/filters.js deleted file mode 100644 index 52bae78a6..000000000 --- a/packages/wekan-cfs-collection-filters/filters.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @method FS.Collection.prototype.filters - * @public - * @param {Object} filters - File filters for this collection. - * @returns {undefined} - */ -FS.Collection.prototype.filters = function fsColFilters(filters) { - var self = this; - - // Check filter option values and normalize them for quicker checking later - if (filters) { - // check/adjust allow/deny - FS.Utility.each(['allow', 'deny'], function (type) { - if (!filters[type]) { - filters[type] = {}; - } else if (typeof filters[type] !== "object") { - throw new Error(type + ' filter must be an object'); - } - }); - - // check/adjust maxSize - if (typeof filters.maxSize === "undefined") { - filters.maxSize = null; - } else if (filters.maxSize && typeof filters.maxSize !== "number") { - throw new Error('maxSize filter must be an number'); - } - - // check/adjust extensions - FS.Utility.each(['allow', 'deny'], function (type) { - if (!filters[type].extensions) { - filters[type].extensions = []; - } else if (!FS.Utility.isArray(filters[type].extensions)) { - throw new Error(type + '.extensions filter must be an array of extensions'); - } else { - //convert all to lowercase - for (var i = 0, ln = filters[type].extensions.length; i < ln; i++) { - filters[type].extensions[i] = filters[type].extensions[i].toLowerCase(); - } - } - }); - - // check/adjust content types - FS.Utility.each(['allow', 'deny'], function (type) { - if (!filters[type].contentTypes) { - filters[type].contentTypes = []; - } else if (!FS.Utility.isArray(filters[type].contentTypes)) { - throw new Error(type + '.contentTypes filter must be an array of content types'); - } - }); - - self.options.filter = filters; - } - - // Define deny functions to enforce file filters on the server - // for inserts and updates that initiate from untrusted code. - self.files.deny({ - insert: function(userId, fsFile) { - return !self.allowsFile(fsFile); - }, - update: function(userId, fsFile, fields, modifier) { - // TODO will need some kind of additional security here: - // Don't allow them to change the type, size, name, and - // anything else that would be security or data integrity issue. - // Such security should probably be added by cfs-collection package, not here. - return !self.allowsFile(fsFile); - }, - fetch: [] - }); - - // If insecure package is in use, we need to add allow rules that return - // true. Otherwise, it would seemingly turn off insecure mode. - if (Package && Package.insecure) { - self.allow({ - insert: function() { - return true; - }, - update: function() { - return true; - }, - remove: function() { - return true; - }, - download: function() { - return true; - }, - fetch: [], - transform: null - }); - } - // If insecure package is NOT in use, then adding the deny function - // does not have any effect on the main app's security paradigm. The - // user will still be required to add at least one allow function of her - // own for each operation for this collection. And the user may still add - // additional deny functions, but does not have to. -}; - -/** - * @method FS.Collection.prototype.allowsFile Does the collection allow the specified file? - * @public - * @returns {boolean} True if the collection allows this file. - * - * Checks based on any filters defined on the collection. If the - * file is not valid according to the filters, this method returns false - * and also calls the filter `onInvalid` method defined for the - * collection, passing it an English error string that explains why it - * failed. - */ -FS.Collection.prototype.allowsFile = function fsColAllowsFile(fileObj) { - var self = this; - - // Get filters - var filter = self.options.filter; - if (!filter) { - return true; - } - var saveAllFileExtensions = (filter.allow.extensions.length === 0); - var saveAllContentTypes = (filter.allow.contentTypes.length === 0); - - // Get info about the file - var filename = fileObj.name(); - var contentType = fileObj.type(); - if (!saveAllContentTypes && !contentType) { - filter.onInvalid && filter.onInvalid(filename + " has an unknown content type"); - return false; - } - var fileSize = fileObj.size(); - if (!fileSize || isNaN(fileSize)) { - filter.onInvalid && filter.onInvalid(filename + " has an unknown file size"); - return false; - } - - // Do extension checks only if we have a filename - if (filename) { - var ext = fileObj.getExtension(); - if (!((saveAllFileExtensions || - FS.Utility.indexOf(filter.allow.extensions, ext) !== -1) && - FS.Utility.indexOf(filter.deny.extensions, ext) === -1)) { - filter.onInvalid && filter.onInvalid(filename + ' has the extension "' + ext + '", which is not allowed'); - return false; - } - } - - // Do content type checks - if (!((saveAllContentTypes || - contentTypeInList(filter.allow.contentTypes, contentType)) && - !contentTypeInList(filter.deny.contentTypes, contentType))) { - filter.onInvalid && filter.onInvalid(filename + ' is of the type "' + contentType + '", which is not allowed'); - return false; - } - - // Do max size check - if (typeof filter.maxSize === "number" && fileSize > filter.maxSize) { - filter.onInvalid && filter.onInvalid(filename + " is too big"); - return false; - } - return true; -}; - -/** - * @method contentTypeInList Is the content type string in the list? - * @private - * @param {String[]} list - Array of content types - * @param {String} contentType - The content type - * @returns {Boolean} - * - * Returns true if the content type is in the list, or if it matches - * one of the special types in the list, e.g., "image/*". - */ -function contentTypeInList(list, contentType) { - var listType, found = false; - for (var i = 0, ln = list.length; i < ln; i++) { - listType = list[i]; - if (listType === contentType) { - found = true; - break; - } - if (listType === "image/*" && contentType.indexOf("image/") === 0) { - found = true; - break; - } - if (listType === "audio/*" && contentType.indexOf("audio/") === 0) { - found = true; - break; - } - if (listType === "video/*" && contentType.indexOf("video/") === 0) { - found = true; - break; - } - } - return found; -} diff --git a/packages/wekan-cfs-collection-filters/internal.api.md b/packages/wekan-cfs-collection-filters/internal.api.md deleted file mode 100644 index adecf64ac..000000000 --- a/packages/wekan-cfs-collection-filters/internal.api.md +++ /dev/null @@ -1,72 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["filters.js"](filters.js) Where: {client|server}__ - -*** - -### *fsCollection*.filters(filters)  Anywhere ### - -*This method __filters__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __filters__ *{Object}* - - File filters for this collection. - - -__Returns__ *{undefined}* - - -> ```FS.Collection.prototype.filters = function fsColFilters(filters) { ...``` [filters.js:7](filters.js#L7) - - -- - -### *fsCollection*.allowsFile()  Anywhere ### - -*This method __allowsFile__ is defined in `prototype` of `FS.Collection`* - -__Returns__ *{boolean}* -True if the collection allows this file. - - -Checks based on any filters defined on the collection. If the -file is not valid according to the filters, this method returns false -and also calls the filter `onInvalid` method defined for the -collection, passing it an English error string that explains why it -failed. - -> ```FS.Collection.prototype.allowsFile = function fsColAllowsFile(fileObj) { ...``` [filters.js:108](filters.js#L108) - - -- - -### contentTypeInList(list, contentType)  undefined ### - -*This method is private* - -__Arguments__ - -* __list__ *{[String[]](#String[])}* - - Array of content types - -* __contentType__ *{String}* - - The content type - - -__Returns__ *{Boolean}* - - -Returns true if the content type is in the list, or if it matches -one of the special types in the list, e.g., "image/*". - -> ```function contentTypeInList(list, contentType) { ...``` [filters.js:169](filters.js#L169) - - diff --git a/packages/wekan-cfs-collection-filters/package.js b/packages/wekan-cfs-collection-filters/package.js deleted file mode 100644 index 5a1c8c385..000000000 --- a/packages/wekan-cfs-collection-filters/package.js +++ /dev/null @@ -1,29 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-cfs-collection-filters.git', - name: 'wekan-cfs-collection-filters', - version: '0.2.4', - summary: 'CollectionFS, adds FS.Collection filters' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use(['wekan-cfs-base-package@0.0.30', 'wekan-cfs-collection@0.5.4']); - - api.addFiles([ - 'filters.js' - ], 'client'); - - api.addFiles([ - 'filters.js' - ], 'server'); -}); - -// Package.on_test(function (api) { -// api.use('collectionfs'); -// api.use('test-helpers', 'server'); -// api.use(['tinytest']); - -// api.addFiles('tests/server-tests.js', 'server'); -// api.addFiles('tests/client-tests.js', 'client'); -// }); diff --git a/packages/wekan-cfs-collection-filters/tests/client-tests.js b/packages/wekan-cfs-collection-filters/tests/client-tests.js deleted file mode 100644 index 0ccc90047..000000000 --- a/packages/wekan-cfs-collection-filters/tests/client-tests.js +++ /dev/null @@ -1,27 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-collection-filters - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-collection-filters/tests/server-tests.js b/packages/wekan-cfs-collection-filters/tests/server-tests.js deleted file mode 100644 index bfaaf6ef9..000000000 --- a/packages/wekan-cfs-collection-filters/tests/server-tests.js +++ /dev/null @@ -1,27 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-collection-filters - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-collection/.travis.yml b/packages/wekan-cfs-collection/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-collection/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-collection/CHANGELOG.md b/packages/wekan-cfs-collection/CHANGELOG.md deleted file mode 100644 index cfe39a6a0..000000000 --- a/packages/wekan-cfs-collection/CHANGELOG.md +++ /dev/null @@ -1,727 +0,0 @@ -# Changelog - -## vCurrent -## [v0.5.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.3) -#### 20/12/14 by Morten Henriksen -- add changelog - -- Bump to version 0.5.3 - -## [v0.5.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.2) -#### 17/12/14 by Morten Henriksen -- Bump to version 0.5.2 - -## [v0.5.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.1) -#### 17/12/14 by Morten Henriksen -- mbr update, remove versions.json - -- Bump to version 0.5.1 - -## [v0.5.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.0) -#### 17/12/14 by Morten Henriksen -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- mbr update versions and fix warnings - -- update pkg, dependencies, etc. - -- Fix #483 - -- *Merged pull-request:* "mrt graphicsmagick instructions to meteor 0.9+" [#442](https://github.com/zcfs/Meteor-CollectionFS/issues/442) ([yogiben](https://github.com/yogiben)) - -- mrt graphicsmagick instructions to meteor 0.9+ - -- mention underlying collection - -- *Merged pull-request:* "Added server-side Buffer example to README.md" [#405](https://github.com/zcfs/Meteor-CollectionFS/issues/405) ([abuddenb](https://github.com/abuddenb)) - -- change prop names - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- add "Display an Uploaded Image" example - -- addition to steps - -- correct 0.9.0 steps - -- Merge branch 'devel' of github.com:abuddenb/Meteor-CollectionFS into devel - -- Added server-side Buffer example to README.md - -Patches by GitHub users [@yogiben](https://github.com/yogiben), [@abuddenb](https://github.com/abuddenb). - -## [v0.4.9] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.9) -#### 27/08/14 by Eric Dobbertin -- add 0.9.0 instructions - -- change package name to lowercase - -- Added server-side Buffer example to README.md - -- *Merged pull-request:* "Updated README.md to reflect that FS.File - Objects can't be stored in t..." [#395](https://github.com/zcfs/Meteor-CollectionFS/issues/395) ([DanielDornhardt](https://github.com/DanielDornhardt)) - -- Updated README.md to reflect that FS.File - Objects can't be stored in the Server MongoDB at the moment. - -- document key - -- update the descriptions of collections - -- document beforeWrite - -- add download button example - -- *Merged pull-request:* "Update README.md" [#354](https://github.com/zcfs/Meteor-CollectionFS/issues/354) ([karabijavad](https://github.com/karabijavad)) - -- should say to use cfs-graphicsmagick pkg - -- fix typo - -- *Merged pull-request:* "Added "Storing FS.File references in your objects" chapter to README" [#311](https://github.com/zcfs/Meteor-CollectionFS/issues/311) ([Sanjo](https://github.com/Sanjo)) - -- Added "Storing FS.File references in your objects" chapter to README - -- a few more API updates - -- updates for changed FS.File API - -- additions and clarifications - -- *Merged pull-request:* "Custom Metadata misleading example" [#282](https://github.com/zcfs/Meteor-CollectionFS/issues/282) ([czeslaaw](https://github.com/czeslaaw)) - -- Custom Metadata misleading example - -Patches by GitHub users [@DanielDornhardt](https://github.com/DanielDornhardt), [@karabijavad](https://github.com/karabijavad), [@Sanjo](https://github.com/Sanjo), [@czeslaaw](https://github.com/czeslaaw). - -## [v0.4.8] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.8) -#### 09/04/14 by Eric Dobbertin -- Add cfs-collection-filters pkg by default - -- Use FS.Utility.setFileExtension in example - -## [v0.4.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.7) -#### 05/04/14 by Morten Henriksen -- corrections, and move image examples here so we can deprecate cfs-imagemagick - -## [v0.4.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.6) -#### 02/04/14 by Morten Henriksen -- *Fixed bug:* "Documentation Issues" [#241](https://github.com/zcfs/Meteor-CollectionFS/issues/241) - -- point to cfs-graphicsmagick readme for transform examples - -## [v0.4.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.5) -#### 31/03/14 by Eric Dobbertin -- use latest releases - -- Add yet a note about mrt and collectionFS in the readme - -## [v0.4.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.4) -#### 25/03/14 by Morten Henriksen -- attempt to get everything up to date - -- Add notice about mrt having troubles figuring out deps - -- *Merged pull-request:* "Removed redundant installation instructions." [#212](https://github.com/zcfs/Meteor-CollectionFS/issues/212) ([lleonard188](https://github.com/lleonard188)) - -- up to date - -- read me update - -- add test note - -Patches by GitHub user [@lleonard188](https://github.com/lleonard188). - -## [v0.4.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.3) -#### 23/03/14 by Morten Henriksen -- use collectionFS travis version force update - -## [v0.4.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.2) -#### 22/03/14 by Morten Henriksen -- change deps - -- Add read me about transformWrite - -## [v0.4.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.1) -#### 21/03/14 by Morten Henriksen -- update reference to devel branch - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- don't need to install transfer - -- mark deprecated api docs - -- test strikeout md - -- no need to imply cfs-transfer since it doesn't do anything at the moment - -- Remove ejson-file imply - -## [v0.4.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.0) -#### 06/03/14 by Eric Dobbertin -- add section for documenting example code for common tasks, and add some of the examples; @raix feel free to add more - -- add http upload package to smart.json - -- Merge origin/devel into devel - -- need to imply the http upload package because it's the default now - -- update HTTP access point override docs - -- update docs to use `devel` branch - -- list component packages in smart.json - -- Merge origin/devel into devel-merge - -- add the ejson-file and correct doc - -- refactor everything into packages - -## [devel-merge-old] (https://github.com/zcfs/Meteor-CollectionFS/tree/devel-merge-old) -#### 12/02/14 by Eric Dobbertin -- update to latest FileSaver.js - -- one of many refactores - -- add optimization section - -- add section explaining client vs server insert - -- prevent autopublish for the SA collections - -- remove arg that isn't used or passed - -- changes to support client SA, plus clean/reorg SA code to have less duplication - -- merge the concepts of "store" and "copy", update docs, switch to FS.Store namespace - -- use wait:true to avoid Meteor issue - -- extend allow when insecure package is installed - -- document and improve code flow a bit - -- faster to use onResultReceived callback - -- use onload instead of onloadend because we want only successful loads - -- remove some console logging - -- fix issue where stuff wasn't uploading because we weren't calling getFileRecord() in the access point methods - -- make allowed file extension checks not be case sensitive - -- remove DDP "/del" access point since it's not used or necessary - -- Remove collection-hooks dependency; use deny instead. Also some cleanup and code docs - -- replace `mmmagic` dependency with a `mime` dependency; hopefully fixes issues we've seen with meteor deploy - -- refactor to expose saveCopy to API; then change fileworker observes to be per-copy, calling saveCopy and allowing better control of which copies to create at which times - -- use observes for all store saving and temp store deleting; add/adjust some api doc comments (didn't regenerate yet) - -- improve fileIsAllowed check order and messages - -- Add check for the Accounts package - -- *Fixed bug:* "no userId passed to download allow validator" [#120](https://github.com/zcfs/Meteor-CollectionFS/issues/120) - -- always append access token to url when a user is logged in; makes usage simpler to do opt-out rather than opt-in - -- Don't queue ddp method calls - -- Merge changes - -- Optimize buffer handling - -- Switch to MicroQueue - -- improve memory management, attempt client side resume implementation, other minor fixes - -- fix several issues, make downloading work, improve a few bits of code - -- do the isImage test correctly; add some API docs - -- isEmpty will be true for null or undefined - -- rewrite getExtension so it works for unmounted files, too - -- add strong reactive-list dependency for powerqueue - -- minor fixes and code improvements; track uploading files by both collection and ID since one queue handles all collections - -- Base the upload queue on PowerQueue sub queues - -- Add sa note - -- limit use of db - -- Refactor and documentation - -- use mmmagic 0.3.5 - -- *Fixed bug:* "Option to set Cache-Control and Max-Age" [#117](https://github.com/zcfs/Meteor-CollectionFS/issues/117) - -- fix stuff that's broken - -## [v0.3.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.7) -#### 08/01/14 by Morten Henriksen -- *Fixed bug:* "How to store files on the server side?" [#29](https://github.com/zcfs/Meteor-CollectionFS/issues/29) - -- rework ejson and remove fsFile.reload - -- explain complete upload process in ADVANCED docs - -- Adds join to smart.json (its a weak dependency #119) - -- link to api docs for acceptDropsOn - -- typo/formatting fixes - -- docs + insert callback returns `FS.File` instead of `id` - -- Add docs and `FS.File.fetch` - -- Add support for `Join` - -- end with line - -- smaller headlines in docs - -- init api docs - -- Refactor and documentation - -- FS.Collection.insert should return the `FS.File` object - -- remove some comments and such - -- document custom connections - -- add livedata ref to access DDP obj - -- use separate ddp connection with option to pass in custom - -- public folder and gm/im - -- fix null options - -- *Fixed bug:* "no userId passed to download allow validator" [#120](https://github.com/zcfs/Meteor-CollectionFS/issues/120) - -- make useHTTP true by default - -- skip auth checks if Package.insecure - -- remove `callback` arg from fsFile.get since it's not used or necessary; fix partial gets such that they actually use getBytes, greatly speeding up downloads of large files - -- reorg code and speed up downloads - -- split TransferQueue into DownloadTransferQueue and UploadTransferQueue - -- improvements to make use of new PowerQueue features - -- fix issue with previous commit - -- add accessPoints option - -- Pull out temporary chunk code into a separate tempStore.js file, within a TempStore object. This makes it easier to maintain. Also updated the file worker code to correctly find temporary chunks that can be removed and delete those files. - -- add security section - -- Internally, change all "master" stuff to be the same as "copies". External API is still the same, but master options are copied to a special copy named "_master" so that all the other code can be cleaner. This may be a step toward being able to blur or eliminate the master/copy distinction, although there are still some benefits to having a master. - -- Add instructions for installing for testing - -- refactor code to be a bit cleaner - -- add functions for getting an FS.File or setting FS.File data from a URL on the server - -- clean up and improve some transfer code - -- update console log message to be more correct - -- ensure that fsFile.bytesUploaded is always set correctly - -- fix some issues with recent commits - -- *Merged pull-request:* "Updates the filter example area so that it works" [#109](https://github.com/zcfs/Meteor-CollectionFS/issues/109) ([cramhead](https://github.com/cramhead)) - -- add .npm to gitignore - -- Remove .npm folder - -- Clean clone just a bit - -- Refactor fsCollection and argParser - -- Comment on filter options - -- Add download url - -- refactor access point - -- add put/get/del security based on allow/deny functions - -- Updates the filter example area so that it works - -- update for API change - -- more client-side speed improvements and allow passing File/Blob to FS.File constructor again - -- fix data mixup - -- fix upload slowness and blocking - -- change API to adjust issue with data loading callbacks - -- revise FS.File API where data handling is concerned; fix some issues with callback handling in client-side methods; upshot should be faster, smoother uploads and downloads - -- change names and put everything in exported FS namespace - -- fix get/download of copies - -- *Fixed bug:* "Files after certain size aren't saved properly. " [#104](https://github.com/zcfs/Meteor-CollectionFS/issues/104) - -- add fileobject metadata and acceptDropsOn - -- add some methods to load FO data from URL - -- Correct allow/deny examples - -- call put callback correctly - -- add correct temporary installation instructions - -- use correct filename when saving download - -- filtering fixes - -- removed some unused stuff - -- adjust some comments - -- switch api.remove to api.del for consistency with the other methods - -- add hasCopy method - -- new api; tons of changes - -- use generic queue for server file handling - -- update progress in the correct place - -- minor changes to comments - -- fix gridfs get method - -- incorporate #82 - -- make filtering work (added collection-hooks dependency for core package) - -- change UploadsCollection to CollectionFS; change former CollectionFS to GridFS and don't export it (used only by the gridfs storage adaptor); clean up some other areas and update readmes - -- *Fixed bug:* "retrieveBlob failure" [#93](https://github.com/zcfs/Meteor-CollectionFS/issues/93) - -- implement http methods URLs - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS.git into devel - -- significant revisions to move downloading support to the UploadsCollection and make collectionFS/gridFS a pure storage adaptor - -- Merge branch 'pr/94' into devel - -- split and revise readmes - -- rename packages and organize package.js - -- error handling improvements - -- better failure handling for removeCopy - -- handlebars helper to display blob image in CFS package - -- remove all encoding info - -- refactor to fix multiple-file simultaneous uploads - -- don't use _id in filesystem destination since it's not set anyway - -- remove FileObject.file and instead save file as Blob (.blob) when FileObject.fromFile is called - -- revise API a bit - -- stop using strings and encoding and pass everything as Uint8Array (fixes downloading corruption) - -- only attempt to delete file if it exists - -- remove unused file - -- complete refactoring; temporary for testing/tweaking and then will split into multiple packages - -- *Merged pull-request:* "Implemented max parallel transfers" [#62](https://github.com/zcfs/Meteor-CollectionFS/issues/62) ([floo51](https://github.com/floo51)) - -Patches by GitHub users [@cramhead](https://github.com/cramhead), [@floo51](https://github.com/floo51). - -## [v0.3.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.6) -#### 10/10/13 by Morten Henriksen -- Edit ideas about storage adapters and filehandlers - -- Add MIT License - -- Add paypal and weak deps - -- Added the org. filemanager demo/example - -## [v0.3.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.5) -#### 20/09/13 by Morten Henriksen -## [v0.3.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.4) -#### 20/09/13 by Morten Henriksen -- Extract the examples from collectionFS - -- Added examples from @mxab - -## [v0.3.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.3) -#### 18/09/13 by Morten Henriksen -- added travis badge - -- Added travis badge - -- Added basic environment - -- Added metadata getter to docs - -## [v0.3.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.2) -#### 17/09/13 by Morten Henriksen -## [v0.3.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.1) -#### 16/09/13 by Morten Henriksen -- Added some details about http.publishing of collections - -- added check in filehandlers - -- Updated som docs - -- js hint added scope - -- jshint clean up - -- *Fixed bug:* "Exception from setTimeout callback: { stack: [Getter] }" [#64](https://github.com/zcfs/Meteor-CollectionFS/issues/64) - -- Merge branch 'devel' - -- Bump version to preview of 0.3.0 - -- Implemented max parallel transfers - -- Revert "began refractoring" - -- Revert "Run jshint through files" - -- Revert "Preparing file object methods for better api" - -- Revert "added fileobject files to package" - -- added fileobject files to package - -- Preparing file object methods for better api - -- Run jshint through files - -- *Merged pull-request:* "Improvements and Fixes to built-in helpers, storeFiles, and acceptDropsOn" [#51](https://github.com/zcfs/Meteor-CollectionFS/issues/51) ([aldeed](https://github.com/aldeed)) - -- Add generic events system, switch to "enums" for invalid event types, and change "fileFilter" to "filter" throughout. Update README to reflect these changes. - -- Update readme to reflect storeFiles and acceptDropsOn changes, plus add documentation for all of the new built-in handlebars helpers - -- commit some files that should be committed - -- -Improve and fix built-in handlebars helpers -Prefix all built-in helpers with "cfs" -Update new example app to reflect helper changes, and improve and fix it a bit, too - -- Merge remote-tracking branch 'upstream/master' - -- update documentation of storeFiles and acceptDropsOn - -- Added credit to @eprochasson - -- *Merged pull-request:* "Should fix issue #45" [#50](https://github.com/zcfs/Meteor-CollectionFS/issues/50) ([eprochasson](https://github.com/eprochasson)) - -- *Fixed bug:* "file handlers not showing up in local demo" [#45](https://github.com/zcfs/Meteor-CollectionFS/issues/45) - -- *Merged pull-request:* "Update README.md" [#49](https://github.com/zcfs/Meteor-CollectionFS/issues/49) ([eprochasson](https://github.com/eprochasson)) - -- Added meteor style guide for jshint - -- fix package file - -- fixes and improvements to storeFiles() and acceptDropsOn() - -- Use a different saveAs shim - -- Merge branch 'master' of https://github.com/aldeed/Meteor-CollectionFS - -- Fixes and changes to support cfs changes - -- -"cfs" prefix, new helpers, improvements and fixes -include saveAs shim in the package so that download button helper can reliably call it - -- Add dependencies and files - -- Document storeFiles() and acceptDropsOn() - -- *Merged pull-request:* "Built-ins, fixes, etc." [#48](https://github.com/zcfs/Meteor-CollectionFS/issues/48) ([aldeed](https://github.com/aldeed)) - -- Add the new files to the package manifest - -- Add underscore as dependency. It seems that Meteor may soon remove underscore from the core. - -- Minor changes to support fileHanders() and fileFilter() function changes - -- Copy in numeral.js for use by the built-in handlebar helper that displays file size in human readable format. This means the helper supports any of the format strings supported by numeral.js for file sizes. - -- -Add fileFilter() function to specify allowed and disallowed files per collectionFS, based on extensions and/or content types -Add fileIsAllowed() function to easily check whether a particular file is allowed based on the rules set up by fileFilter() -Change all of the passthrough functions (find, findOne, update, remove, allow, deny) to pass through all function arguments more simply and more safely. This allows, for example, using find() instead of find({}). -Change fileHandlers() to extend the object whenever called, which means you can safely call it more than once -Add several utility functions for use in either client or server code - -- -Add storeFiles API -Check that files are allowed by fileFilter before saving -Add acceptDropsOn API -Use .depend() instead of Deps throughout -Pull out _getProgress calc to use in two places -Add isUploading API -Improve isDownloading code - -- New file to hold built-in handlebars helpers, including several initial helpers - -- New file manager example app showing how to use new features, built-in handlebars helpers, etc. - -- *Merged pull-request:* "Minor doc correction" [#47](https://github.com/zcfs/Meteor-CollectionFS/issues/47) ([aldeed](https://github.com/aldeed)) - -- *Merged pull-request:* "Documentation Improvement" [#46](https://github.com/zcfs/Meteor-CollectionFS/issues/46) ([aldeed](https://github.com/aldeed)) - -- Extensively revised README - -Patches by GitHub users [@aldeed](https://github.com/aldeed), [@eprochasson](https://github.com/eprochasson). - -## [v0.2.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.3) -#### 04/05/13 by Morten Henriksen -- *Fixed bug:* "Binary File Transfers Corrupted? Truncated?" [#41](https://github.com/zcfs/Meteor-CollectionFS/issues/41) - -## [v0.2.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.2) -#### 03/05/13 by Morten Henriksen -- updated scope for serverConsole - -- *Fixed bug:* "Error when using fresh meteor install" [#40](https://github.com/zcfs/Meteor-CollectionFS/issues/40) - -- more text edits - -- Minor text edits - -- Add credit to README - -- *Merged pull-request:* "Option for file encoding" [#36](https://github.com/zcfs/Meteor-CollectionFS/issues/36) ([nhibner](https://github.com/nhibner)) - -- Typo fix. - -- Updated documentation (added encoding to the fileRecord structure). - -- File encoding is stored in the fileRecord. - -- Allow the user to specify an encoding for the buffer when storing on the server. - -- *Merged pull-request:* "Fix backwards incompatibility" [#33](https://github.com/zcfs/Meteor-CollectionFS/issues/33) ([mitar](https://github.com/mitar)) - -- Fix backwards incompatibility. - -Patches by GitHub users [@nhibner](https://github.com/nhibner), [@mitar](https://github.com/mitar). - -## [v0.2.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.1) -#### 08/04/13 by Morten Henriksen -- Minor fixes, added dragndrop, minor refractoring - -- Only work on completed files - -## [v0.2.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.0) -#### 06/04/13 by Morten Henriksen -- Bump to 0.2.0 - Nice - -- Big speed and refractoring - -## [v0.1.9] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.9) -#### 31/03/13 by Morten Henriksen -- Added some more doc, deprecated autosubscribe to autopublish instead - -## [v0.1.8] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.8) -#### 31/03/13 by Morten Henriksen -- Added maxFilehandlers to the doc - -## [devel-#27-fixed] (https://github.com/zcfs/Meteor-CollectionFS/tree/devel-#27-fixed) -#### 31/03/13 by Morten Henriksen -- Added documentation by @petrocket - -- Got filehandlers up and running in bundles - -- Make a seperate thread + connection foreach collectionFS - -## [v0.1.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.7) -#### 14/03/13 by Morten Henriksen -## [v0.1.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.6) -#### 13/01/13 by Morten Henriksen -- Converted .length to string to cope with Meteor use of underscore - -## [devel-server-cache] (https://github.com/zcfs/Meteor-CollectionFS/tree/devel-server-cache) -#### 11/01/13 by Morten Henriksen -## [v0.1.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.5) -#### 11/01/13 by Morten Henriksen -- On going tests - db updates gone, requires refresh to commit changes to db - guess some que not working - -- removed setTimeout when spawn == 1 - -## [v0.1.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.4) -#### 08/01/13 by Morten Henriksen -## [v0.1.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.3) -#### 08/01/13 by Morten Henriksen -## [v0.1.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.2) -#### 08/01/13 by Morten Henriksen -## [v0.1.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.1) -#### 08/01/13 by Morten Henriksen -- Big one, added fileHandler to create cashed versions of the file - -- added made with Meteor in fileHandler example - -- corrected param bug in find and findOne - -- minor fix and update - -- Corrected install guide to use Meteorite - -## [v0.1.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.0) -#### 07/01/13 by Morten Henriksen -## [v0.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1) -#### 07/01/13 by Morten Henriksen -- updated file strukture and example - -- Restructure to package system - -- Refractoring filenames and edit package.js - -- Package.js added - -- Added smart.json for Atmosphere packages - Not tested! - -- Readme styling corrected - -- Added comments to the upload, storeFile - -- StoreFile should return fileId or null - -- Added notes about security - -- Added only owner can resume, makes sense for now - -- Added how to make a download... - -- Changed project title git - -- And some more corrections - -- More readme text - -- Added some short reference - -- some more md - -- Initial commit - diff --git a/packages/wekan-cfs-collection/LICENSE.md b/packages/wekan-cfs-collection/LICENSE.md deleted file mode 100644 index 1a3820821..000000000 --- a/packages/wekan-cfs-collection/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-collection/README.md b/packages/wekan-cfs-collection/README.md deleted file mode 100644 index 8699de9a4..000000000 --- a/packages/wekan-cfs-collection/README.md +++ /dev/null @@ -1,8 +0,0 @@ -wekan-cfs-collection -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. \ No newline at end of file diff --git a/packages/wekan-cfs-collection/api.common.js b/packages/wekan-cfs-collection/api.common.js deleted file mode 100644 index 42e4f1714..000000000 --- a/packages/wekan-cfs-collection/api.common.js +++ /dev/null @@ -1,260 +0,0 @@ -/** @method FS.Collection.prototype.insert Insert `File` or `FS.File` or remote URL into collection - * @public - * @param {File|Blob|Buffer|ArrayBuffer|Uint8Array|String} fileRef File, FS.File, or other data to insert - * @param {function} [callback] Callback `function(error, fileObj)` - * @returns {FS.File|undefined} The `file object` - * [Meteor docs](http://docs.meteor.com/#insert) - */ -FS.Collection.prototype.insert = function(fileRef, callback) { - var self = this; - - if (Meteor.isClient && !callback) { - callback = FS.Utility.defaultCallback; - } - - // XXX: - // We should out factor beginStorage to FS.File.beginStorage - // the client side storage adapters should be the one providing - // the upload either via http/ddp or direct upload - // Could be cool to have a streaming api on the client side - // having a createReadStream etc. on the client too... - function beginStorage(fileObj) { - - // If on client, begin uploading the data - if (Meteor.isClient) { - self.options.uploader && self.options.uploader(fileObj); - } - - // If on the server, save the binary to a single chunk temp file, - // so that it is available when FileWorker calls saveCopies. - // This will also trigger file handling from collection observes. - else if (Meteor.isServer) { - fileObj.createReadStream().pipe(FS.TempStore.createWriteStream(fileObj)); - } - } - - // XXX: would be great if this function could be simplyfied - if even possible? - function checkAndInsert(fileObj) { - // Check filters. This is called in deny functions, too, but we call here to catch - // server inserts and to catch client inserts early, allowing us to call `onInvalid` on - // the client and save a trip to the server. - if (!self.allowsFile(fileObj)) { - return FS.Utility.handleError(callback, 'FS.Collection insert: file does not pass collection filters'); - } - - // Set collection name - fileObj.collectionName = self.name; - - // Insert the file into db - // We call cloneFileRecord as an easy way of extracting the properties - // that need saving. - if (callback) { - fileObj._id = self.files.insert(FS.Utility.cloneFileRecord(fileObj), function(err, id) { - if (err) { - if (fileObj._id) { - delete fileObj._id; - } - } else { - // Set _id, just to be safe, since this could be before or after the insert method returns - fileObj._id = id; - // Pass to uploader or stream data to the temp store - beginStorage(fileObj); - } - callback(err, err ? void 0 : fileObj); - }); - } else { - fileObj._id = self.files.insert(FS.Utility.cloneFileRecord(fileObj)); - // Pass to uploader or stream data to the temp store - beginStorage(fileObj); - } - return fileObj; - } - - // Parse, adjust fileRef - if (fileRef instanceof FS.File) { - return checkAndInsert(fileRef); - } else { - // For convenience, allow File, Blob, Buffer, data URI, filepath, URL, etc. to be passed as first arg, - // and we will attach that to a new fileobj for them - var fileObj = new FS.File(fileRef); - if (callback) { - fileObj.attachData(fileRef, function attachDataCallback(error) { - if (error) { - callback(error); - } else { - checkAndInsert(fileObj); - } - }); - } else { - // We ensure there's a callback on the client, so if there isn't one at this point, - // we must be on the server expecting synchronous behavior. - fileObj.attachData(fileRef); - checkAndInsert(fileObj); - } - return fileObj; - } -}; - -/** @method FS.Collection.prototype.update Update the file record - * @public - * @param {FS.File|object} selector - * @param {object} modifier - * @param {object} [options] - * @param {function} [callback] - * [Meteor docs](http://docs.meteor.com/#update) - */ -FS.Collection.prototype.update = function(selector, modifier, options, callback) { - var self = this; - if (selector instanceof FS.File) { - // Make sure the file belongs to this FS.Collection - if (selector.collectionName === self.files._name) { - return selector.update(modifier, options, callback); - } else { - // Tried to save a file in the wrong FS.Collection - throw new Error('FS.Collection cannot update file belongs to: "' + selector.collectionName + '" not: "' + self.files._name + '"'); - } - } - - return self.files.update(selector, modifier, options, callback); -}; - -/** @method FS.Collection.prototype.remove Remove the file from the collection - * @public - * @param {FS.File|object} selector - * @param {Function} [callback] - * [Meteor docs](http://docs.meteor.com/#remove) - */ -FS.Collection.prototype.remove = function(selector, callback) { - var self = this; - if (selector instanceof FS.File) { - - // Make sure the file belongs to this FS.Collection - if (selector.collectionName === self.files._name) { - return selector.remove(callback); - } else { - // Tried to remove a file from the wrong FS.Collection - throw new Error('FS.Collection cannot remove file belongs to: "' + selector.collectionName + '" not: "' + self.files._name + '"'); - } - } - - //doesn't work correctly on the client without a callback - callback = callback || FS.Utility.defaultCallback; - return self.files.remove(selector, callback); -}; - -/** @method FS.Collection.prototype.findOne - * @public - * @param {[selector](http://docs.meteor.com/#selectors)} selector - * [Meteor docs](http://docs.meteor.com/#findone) - * Example: - ```js - var images = new FS.Collection( ... ); - // Get the file object - var fo = images.findOne({ _id: 'NpnskCt6ippN6CgD8' }); - ``` - */ -// Call findOne on files collection -FS.Collection.prototype.findOne = function(selector) { - var self = this; - return self.files.findOne.apply(self.files, arguments); -}; - -/** @method FS.Collection.prototype.find - * @public - * @param {[selector](http://docs.meteor.com/#selectors)} selector - * [Meteor docs](http://docs.meteor.com/#find) - * Example: - ```js - var images = new FS.Collection( ... ); - // Get the all file objects - var files = images.find({ _id: 'NpnskCt6ippN6CgD8' }).fetch(); - ``` - */ -FS.Collection.prototype.find = function(selector) { - var self = this; - return self.files.find.apply(self.files, arguments); -}; - -/** @method FS.Collection.prototype.allow - * @public - * @param {object} options - * @param {function} options.download Function that checks if the file contents may be downloaded - * @param {function} options.insert - * @param {function} options.update - * @param {function} options.remove Functions that look at a proposed modification to the database and return true if it should be allowed - * @param {[string]} [options.fetch] Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - * [Meteor docs](http://docs.meteor.com/#allow) - * Example: - ```js - var images = new FS.Collection( ... ); - // Get the all file objects - var files = images.allow({ - insert: function(userId, doc) { return true; }, - update: function(userId, doc, fields, modifier) { return true; }, - remove: function(userId, doc) { return true; }, - download: function(userId, fileObj) { return true; }, - }); - ``` - */ -FS.Collection.prototype.allow = function(options) { - var self = this; - - // Pull out the custom "download" functions - if (options.download) { - if (!(options.download instanceof Function)) { - throw new Error("allow: Value for `download` must be a function"); - } - self._validators.download.allow.push(options.download); - delete options.download; - } - - return self.files.allow.call(self.files, options); -}; - -/** @method FS.Collection.prototype.deny - * @public - * @param {object} options - * @param {function} options.download Function that checks if the file contents may be downloaded - * @param {function} options.insert - * @param {function} options.update - * @param {function} options.remove Functions that look at a proposed modification to the database and return true if it should be denyed - * @param {[string]} [options.fetch] Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - * [Meteor docs](http://docs.meteor.com/#deny) - * Example: - ```js - var images = new FS.Collection( ... ); - // Get the all file objects - var files = images.deny({ - insert: function(userId, doc) { return true; }, - update: function(userId, doc, fields, modifier) { return true; }, - remove: function(userId, doc) { return true; }, - download: function(userId, fileObj) { return true; }, - }); - ``` - */ -FS.Collection.prototype.deny = function(options) { - var self = this; - - // Pull out the custom "download" functions - if (options.download) { - if (!(options.download instanceof Function)) { - throw new Error("deny: Value for `download` must be a function"); - } - self._validators.download.deny.push(options.download); - delete options.download; - } - - return self.files.deny.call(self.files, options); -}; - -// TODO: Upsert? - -/** - * We provide a default implementation that doesn't do anything. - * Can be changed by user or packages, such as the default cfs-collection-filters pkg. - * @param {FS.File} fileObj File object - * @return {Boolean} Should we allow insertion of this file? - */ -FS.Collection.prototype.allowsFile = function fsColAllowsFile(fileObj) { - return true; -}; diff --git a/packages/wekan-cfs-collection/api.md b/packages/wekan-cfs-collection/api.md deleted file mode 100644 index 01a005090..000000000 --- a/packages/wekan-cfs-collection/api.md +++ /dev/null @@ -1,180 +0,0 @@ -## cfs-collection Public API ## - -CollectionFS, FS.Collection object - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -- - -### *fsCollection*.insert(fileRef, [callback])  Anywhere ### - -*This method __insert__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __fileRef__ *{[FS.File](#FS.File)|[File](#File)}* - - File data reference - -* __callback__ *{function}* (Optional) - - Callback `function(error, fileObj)` - - -__Returns__ *{FS.File}* -The `file object` -[Meteor docs](http://docs.meteor.com/#insert) - -> ```FS.Collection.prototype.insert = function(fileRef, callback) { ...``` [api.common.js:8](api.common.js#L8) - - -- - -### *fsCollection*.update(selector, modifier, [options], [callback])  Anywhere ### - -*This method __update__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[FS.File](#FS.File)|object}* -* __modifier__ *{object}* -* __options__ *{object}* (Optional) -* __callback__ *{function}* (Optional) -[Meteor docs](http://docs.meteor.com/#update) - -> ```FS.Collection.prototype.update = function(selector, modifier, options, callback) { ...``` [api.common.js:71](api.common.js#L71) - - -- - -### *fsCollection*.remove(selector, [callback])  Anywhere ### - -*This method __remove__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[FS.File](#FS.File)|object}* -* __callback__ *{Function}* (Optional) -[Meteor docs](http://docs.meteor.com/#remove) - -> ```FS.Collection.prototype.remove = function(selector, callback) { ...``` [api.common.js:92](api.common.js#L92) - - -- - -### *fsCollection*.findOne(selector)  Anywhere ### - -*This method __findOne__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[selector](http://docs.meteor.com/#selectors)}* -[Meteor docs](http://docs.meteor.com/#findone) -Example: -```js -var images = new FS.Collection( ... ); -// Get the file object -var fo = images.findOne({ _id: 'NpnskCt6ippN6CgD8' }); -``` - -> ```FS.Collection.prototype.findOne = function(selector) { ...``` [api.common.js:122](api.common.js#L122) - - -- - -### *fsCollection*.find(selector)  Anywhere ### - -*This method __find__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[selector](http://docs.meteor.com/#selectors)}* -[Meteor docs](http://docs.meteor.com/#find) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.find({ _id: 'NpnskCt6ippN6CgD8' }).fetch(); -``` - -> ```FS.Collection.prototype.find = function(selector) { ...``` [api.common.js:138](api.common.js#L138) - - -- - -### *fsCollection*.allow(options)  Anywhere ### - -*This method __allow__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __options__ *{object}* - * __download__ *{function}* - - Function that checks if the file contents may be downloaded - - * __insert__ *{function}* - * __update__ *{function}* - * __remove__ *{function}* - - Functions that look at a proposed modification to the database and return true if it should be allowed - - * __fetch__ *{[string]}* (Optional) - - Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - -[Meteor docs](http://docs.meteor.com/#allow) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.allow({ -insert: function(userId, doc) { return true; }, -update: function(userId, doc, fields, modifier) { return true; }, -remove: function(userId, doc) { return true; }, -download: function(userId, fileObj) { return true; }, -}); -``` - -> ```FS.Collection.prototype.allow = function(options) { ...``` [api.common.js:164](api.common.js#L164) - - -- - -### *fsCollection*.deny(options)  Anywhere ### - -*This method __deny__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __options__ *{object}* - * __download__ *{function}* - - Function that checks if the file contents may be downloaded - - * __insert__ *{function}* - * __update__ *{function}* - * __remove__ *{function}* - - Functions that look at a proposed modification to the database and return true if it should be denyed - - * __fetch__ *{[string]}* (Optional) - - Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - -[Meteor docs](http://docs.meteor.com/#deny) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.deny({ -insert: function(userId, doc) { return true; }, -update: function(userId, doc, fields, modifier) { return true; }, -remove: function(userId, doc) { return true; }, -download: function(userId, fileObj) { return true; }, -}); -``` - -> ```FS.Collection.prototype.deny = function(options) { ...``` [api.common.js:200](api.common.js#L200) - - diff --git a/packages/wekan-cfs-collection/common.js b/packages/wekan-cfs-collection/common.js deleted file mode 100644 index 7e9942261..000000000 --- a/packages/wekan-cfs-collection/common.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * - * @constructor - * @param {string} name A name for the collection - * @param {Object} options - * @param {FS.StorageAdapter[]} options.stores An array of stores in which files should be saved. At least one is required. - * @param {Object} [options.filter] Filter definitions - * @param {Number} [options.chunkSize=2MB] Override the chunk size in bytes for uploads - * @param {Function} [options.uploader] A function to pass FS.File instances after inserting, which will begin uploading them. By default, `FS.HTTP.uploadQueue.uploadFile` is used if the `cfs-upload-http` package is present, or `FS.DDP.uploadQueue.uploadFile` is used if the `cfs-upload-ddp` package is present. You can override with your own, or set to `null` to prevent automatic uploading. - * @returns {undefined} - */ -FS.Collection = function(name, options) { - var self = this; - - self.storesLookup = {}; - - self.primaryStore = {}; - - self.options = { - filter: null, //optional - stores: [], //required - chunkSize: null - }; - - // Define a default uploader based on which upload packages are present, - // preferring HTTP. You may override with your own function or - // set to null to skip automatic uploading of data after file insert/update. - if (FS.HTTP && FS.HTTP.uploadQueue) { - self.options.uploader = FS.HTTP.uploadQueue.uploadFile; - } else if (FS.DDP && FS.DDP.uploadQueue) { - self.options.uploader = FS.DDP.uploadQueue.uploadFile; - } - - // Extend and overwrite options - FS.Utility.extend(self.options, options || {}); - - // Set the FS.Collection name - self.name = name; - - // Make sure at least one store has been supplied. - // Usually the stores aren't used on the client, but we need them defined - // so that we can access their names and use the first one as the default. - if (FS.Utility.isEmpty(self.options.stores)) { - throw new Error("You must specify at least one store. Please consult the documentation."); - } - - FS.Utility.each(self.options.stores, function(store, i) { - // Set the primary store - if (i === 0) { - self.primaryStore = store; - } - - // Check for duplicate naming - if (typeof self.storesLookup[store.name] !== 'undefined') { - throw new Error('FS.Collection store names must be uniq, duplicate found: ' + store.name); - } - - // Set the lookup - self.storesLookup[store.name] = store; - - if (Meteor.isServer) { - - // Emit events based on store events - store.on('stored', function (storeName, fileObj) { - // This is weird, but currently there is a bug where each store will emit the - // events for all other stores, too, so we need to make sure that this event - // is truly for this store. - if (storeName !== store.name) - return; - // When a file is successfully stored into the store, we emit a "stored" event on the FS.Collection only if the file belongs to this collection - if (fileObj.collectionName === name) { - var emitted = self.emit('stored', fileObj, store.name); - if (FS.debug && !emitted) { - console.log(fileObj.name({store: store.name}) + ' was successfully saved to the ' + store.name + ' store. You are seeing this informational message because you enabled debugging and you have not defined any listeners for the "stored" event on the ' + name + ' collection.'); - } - } - fileObj.emit('stored', store.name); - }); - - store.on('error', function (storeName, error, fileObj) { - // This is weird, but currently there is a bug where each store will emit the - // events for all other stores, too, so we need to make sure that this event - // is truly for this store. - if (storeName !== store.name) - return; - // When a file has an error while being stored into the temp store, we emit an "error" event on the FS.Collection only if the file belongs to this collection - if (fileObj.collectionName === name) { - error = new Error('Error storing file to the ' + store.name + ' store: ' + error.message); - var emitted = self.emit('error', error, fileObj, store.name); - if (FS.debug && !emitted) { - console.log(error.message); - } - } - fileObj.emit('error', store.name); - }); - - } - }); - - var _filesOptions = { - transform: function(doc) { - // This should keep the filerecord in the file object updated in reactive - // context - var result = new FS.File(doc, true); - result.collectionName = name; - return result; - } - }; - - if(self.options.idGeneration) _filesOptions.idGeneration = self.options.idGeneration; - - // Enable specifying an alternate driver, to change where the filerecord is stored - // Drivers can be created with MongoInternals.RemoteCollectionDriver() - if(self.options._driver){ - _filesOptions._driver = self.options._driver; - } - - // Create the 'cfs.' ++ ".filerecord" and use fsFile - var collectionName = 'cfs.' + name + '.filerecord'; - self.files = new Mongo.Collection(collectionName, _filesOptions); - - // For storing custom allow/deny functions - self._validators = { - download: {allow: [], deny: []} - }; - - // Set up filters - // XXX Should we deprecate the filter option now that this is done with a separate pkg, or just keep it? - if (self.filters) { - self.filters(self.options.filter); - } - - // Save the collection reference (we want it without the 'cfs.' prefix and '.filerecord' suffix) - FS._collections[name] = this; - - // Set up observers - Meteor.isServer && FS.FileWorker && FS.FileWorker.observe(this); - - // Emit "removed" event on collection - self.files.find().observe({ - removed: function(fileObj) { - self.emit('removed', fileObj); - } - }); - - // Emit events based on TempStore events - if (FS.TempStore) { - FS.TempStore.on('stored', function (fileObj, result) { - // When a file is successfully stored into the temp store, we emit an "uploaded" event on the FS.Collection only if the file belongs to this collection - if (fileObj.collectionName === name) { - var emitted = self.emit('uploaded', fileObj); - if (FS.debug && !emitted) { - console.log(fileObj.name() + ' was successfully uploaded. You are seeing this informational message because you enabled debugging and you have not defined any listeners for the "uploaded" event on the ' + name + ' collection.'); - } - } - }); - - FS.TempStore.on('error', function (error, fileObj) { - // When a file has an error while being stored into the temp store, we emit an "error" event on the FS.Collection only if the file belongs to this collection - if (fileObj.collectionName === name) { - self.emit('error', new Error('Error storing uploaded file to TempStore: ' + error.message), fileObj); - } - }); - } else if (Meteor.isServer) { - throw new Error("FS.Collection constructor: FS.TempStore must be defined before constructing any FS.Collections.") - } - -}; - -// An FS.Collection can emit events -FS.Collection.prototype = new EventEmitter(); diff --git a/packages/wekan-cfs-collection/internal.api.md b/packages/wekan-cfs-collection/internal.api.md deleted file mode 100644 index 6a9708fac..000000000 --- a/packages/wekan-cfs-collection/internal.api.md +++ /dev/null @@ -1,390 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["common.js"](common.js) Where: {client|server}__ - -*** - -############################################################################# - -COLLECTION FS - -############################################################################# -- - -### new *fs*.Collection(name, options)  Anywhere ### - -*This method __Collection__ is defined in `FS`* - -__Arguments__ - -* __name__ *{string}* - - A name for the collection - -* __options__ *{Object}* - * __stores__ *{[FS.StorageAdapter[]](#FS.StorageAdapter[])}* - - An array of stores in which files should be saved. At least one is required. - - * __filter__ *{Object}* (Optional) - - Filter definitions - - * __chunkSize__ *{Number}* (Optional, Default = 131072) - - Override the chunk size in bytes for uploads and downloads - - -__Returns__ *{undefined}* - - - -> ```FS.Collection = function(name, options) { ...``` [common.js:17](common.js#L17) - - -*** - -__File: ["api.common.js"](api.common.js) Where: {client|server}__ - -*** - -### *fsCollection*.insert(fileRef, [callback])  Anywhere ### - -*This method __insert__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __fileRef__ *{[FS.File](#FS.File)|[File](#File)}* - - File data reference - -* __callback__ *{function}* (Optional) - - Callback `function(error, fileObj)` - - -__Returns__ *{FS.File}* -The `file object` -[Meteor docs](http://docs.meteor.com/#insert) - -> ```FS.Collection.prototype.insert = function(fileRef, callback) { ...``` [api.common.js:8](api.common.js#L8) - - -- - -### *fsCollection*.update(selector, modifier, [options], [callback])  Anywhere ### - -*This method __update__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[FS.File](#FS.File)|object}* -* __modifier__ *{object}* -* __options__ *{object}* (Optional) -* __callback__ *{function}* (Optional) -[Meteor docs](http://docs.meteor.com/#update) - -> ```FS.Collection.prototype.update = function(selector, modifier, options, callback) { ...``` [api.common.js:71](api.common.js#L71) - - -- - -### *fsCollection*.remove(selector, [callback])  Anywhere ### - -*This method __remove__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[FS.File](#FS.File)|object}* -* __callback__ *{Function}* (Optional) -[Meteor docs](http://docs.meteor.com/#remove) - -> ```FS.Collection.prototype.remove = function(selector, callback) { ...``` [api.common.js:92](api.common.js#L92) - - -- - -### *fsCollection*.findOne(selector)  Anywhere ### - -*This method __findOne__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[selector](http://docs.meteor.com/#selectors)}* -[Meteor docs](http://docs.meteor.com/#findone) -Example: -```js -var images = new FS.Collection( ... ); -// Get the file object -var fo = images.findOne({ _id: 'NpnskCt6ippN6CgD8' }); -``` - -> ```FS.Collection.prototype.findOne = function(selector) { ...``` [api.common.js:122](api.common.js#L122) - - -- - -### *fsCollection*.find(selector)  Anywhere ### - -*This method __find__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __selector__ *{[selector](http://docs.meteor.com/#selectors)}* -[Meteor docs](http://docs.meteor.com/#find) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.find({ _id: 'NpnskCt6ippN6CgD8' }).fetch(); -``` - -> ```FS.Collection.prototype.find = function(selector) { ...``` [api.common.js:138](api.common.js#L138) - - -- - -### *fsCollection*.allow(options)  Anywhere ### - -*This method __allow__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __options__ *{object}* - * __download__ *{function}* - - Function that checks if the file contents may be downloaded - - * __insert__ *{function}* - * __update__ *{function}* - * __remove__ *{function}* - - Functions that look at a proposed modification to the database and return true if it should be allowed - - * __fetch__ *{[string]}* (Optional) - - Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - -[Meteor docs](http://docs.meteor.com/#allow) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.allow({ -insert: function(userId, doc) { return true; }, -update: function(userId, doc, fields, modifier) { return true; }, -remove: function(userId, doc) { return true; }, -download: function(userId, fileObj) { return true; }, -}); -``` - -> ```FS.Collection.prototype.allow = function(options) { ...``` [api.common.js:164](api.common.js#L164) - - -- - -### *fsCollection*.deny(options)  Anywhere ### - -*This method __deny__ is defined in `prototype` of `FS.Collection`* - -__Arguments__ - -* __options__ *{object}* - * __download__ *{function}* - - Function that checks if the file contents may be downloaded - - * __insert__ *{function}* - * __update__ *{function}* - * __remove__ *{function}* - - Functions that look at a proposed modification to the database and return true if it should be denyed - - * __fetch__ *{[string]}* (Optional) - - Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your update and remove functions - -[Meteor docs](http://docs.meteor.com/#deny) -Example: -```js -var images = new FS.Collection( ... ); -// Get the all file objects -var files = images.deny({ -insert: function(userId, doc) { return true; }, -update: function(userId, doc, fields, modifier) { return true; }, -remove: function(userId, doc) { return true; }, -download: function(userId, fileObj) { return true; }, -}); -``` - -> ```FS.Collection.prototype.deny = function(options) { ...``` [api.common.js:200](api.common.js#L200) - - -*** - -__File: ["api.client.js"](api.client.js) Where: {client}__ - -*** - -### _eventCallback(templateName, selector, dataContext, evt, temp, fsFile)  Client ### - -*This method is private* - -__Arguments__ - -* __templateName__ *{string}* - - Name of template to apply events on - -* __selector__ *{string}* - - The element selector eg. "#uploadField" - -* __dataContext__ *{object}* - - The event datacontext - -* __evt__ *{object}* - - The event object { error, file } - -* __temp__ *{object}* - - The template instance - -* __fsFile__ *{[FS.File](#FS.File)}* - - File that triggered the event - - -> ```var _eventCallback = function fsEventCallback(templateName, selector, dataContext, evt, temp, fsFile) { ...``` [api.client.js:10](api.client.js#L10) - - -- - -### _eachFile(files, metadata, callback)  Client ### - -*This method is private* - -__Arguments__ - -* __files__ *{array}* - - List of files to iterate over - -* __metadata__ *{object}* - - Data to attach to the files - -* __callback__ *{function}* - - Function to pass the prepared `FS.File` object - - -> ```var _eachFile = function(files, metadata, callback) { ...``` [api.client.js:36](api.client.js#L36) - - -- - -### *fsCollection*.acceptDropsOn(templateName, selector, [metadata])  Client ### - -*This method __acceptDropsOn__ is defined in `FS.Collection`* - -__Arguments__ - -* __templateName__ *{string}* - - Name of template to apply events on - -* __selector__ *{string}* - - The element selector eg. "#uploadField" - -* __metadata__ *{object|function}* (Optional) - - Data/getter to attach to the file objects - - -Using this method adds an `uploaded` and `uploadFailed` event to the -template events. The event object contains `{ error, file }` - -Example: -```css -.dropzone { -border: 2px dashed silver; -height: 5em; -padding-top: 3em; --webkit-border-radius: 8px; --moz-border-radius: 8px; --ms-border-radius: 8px; --o-border-radius: 8px; -border-radius: 8px; -} -``` -```html - -``` -```js -Template.hello.events({ -'uploaded #dropzone': function(event, temp) { -console.log('Event Uploaded: ' + event.file._id); -} -}); -images.acceptDropsOn('hello', '#dropzone'); -``` - -> ```FS.Collection.prototype.acceptDropsOn = function(templateName, selector, metadata) { ...``` [api.client.js:99](api.client.js#L99) - - -- - -### *fsCollection*.acceptUploadFrom(templateName, selector, [metadata])  Client ### - -*This method __acceptUploadFrom__ is defined in `FS.Collection`* - -__Arguments__ - -* __templateName__ *{string}* - - Name of template to apply events on - -* __selector__ *{string}* - - The element selector eg. "#uploadField" - -* __metadata__ *{object|function}* (Optional) - - Data/getter to attach to the file objects - - -Using this method adds an `uploaded` and `uploadFailed` event to the -template events. The event object contains `{ error, file }` - -Example: -```html - -``` -```js -Template.hello.events({ -'uploaded #files': function(event, temp) { -console.log('Event Uploaded: ' + event.file._id); -} -}); -images.acceptUploadFrom('hello', '#files'); -``` - -> ```FS.Collection.prototype.acceptUploadFrom = function(templateName, selector, metadata) { ...``` [api.client.js:156](api.client.js#L156) - - diff --git a/packages/wekan-cfs-collection/package.js b/packages/wekan-cfs-collection/package.js deleted file mode 100644 index 1af88d564..000000000 --- a/packages/wekan-cfs-collection/package.js +++ /dev/null @@ -1,43 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-collection', - version: '0.5.5', - summary: 'CollectionFS, FS.Collection object', - git: 'https://github.com/zcfs/Meteor-cfs-collection.git' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use([ - // CFS - 'wekan-cfs-base-package@0.0.30', - 'wekan-cfs-tempstore@0.1.4', - // Core - 'deps', - 'check', - 'livedata', - 'mongo-livedata', - // Other - 'raix:eventemitter@0.1.1' - ]); - - // Weak dependencies for uploaders - api.use(['wekan-cfs-upload-http@0.0.20', 'wekan-cfs-upload-ddp@0.0.17'], { weak: true }); - - api.addFiles([ - 'common.js', - 'api.common.js' - ], 'client'); - - api.addFiles([ - 'common.js', - 'api.common.js' - ], 'server'); -}); - -Package.onTest(function (api) { - api.use(['wekan-cfs-standard-packages', 'wekan-cfs-gridfs', 'tinytest', 'underscore', 'test-helpers']); - - api.addFiles('tests/server-tests.js', 'server'); - api.addFiles('tests/client-tests.js', 'client'); -}); diff --git a/packages/wekan-cfs-collection/tests/client-tests.js b/packages/wekan-cfs-collection/tests/client-tests.js deleted file mode 100644 index bf29338c7..000000000 --- a/packages/wekan-cfs-collection/tests/client-tests.js +++ /dev/null @@ -1,33 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-collection - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -/* - * TODO FS.Collection Client Tests - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-collection/tests/server-tests.js b/packages/wekan-cfs-collection/tests/server-tests.js deleted file mode 100644 index 3f6297022..000000000 --- a/packages/wekan-cfs-collection/tests/server-tests.js +++ /dev/null @@ -1,96 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -var fileCollection = new FS.Collection('files', { - stores: [ - new FS.Store.GridFS('files') - ] -}); - -Tinytest.add('cfs-collection - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -Tinytest.add('cfs-collection - insert URL - sync - one', function (test) { - // XXX should switch to a local URL we host - - // One - try { - fileCollection.insert("http://cdn.morguefile.com/imageData/public/files/b/bboomerindenial/preview/fldr_2009_04_01/file3301238617907.jpg"); - test.isTrue(true); - } catch (err) { - test.isFalse(!!err, "URL insert failed"); - } - -}); - -Tinytest.add('cfs-collection - insert URL - sync - loop', function (test) { - // XXX should switch to a local URL we host - - try { - for (var i = 0, len = 10; i < len; i++) { - fileCollection.insert("http://cdn.morguefile.com/imageData/public/files/b/bboomerindenial/preview/fldr_2009_04_01/file3301238617907.jpg"); - } - test.isTrue(true); - } catch (err) { - test.isFalse(!!err, "URL insert failed"); - } -}); - -Tinytest.addAsync('cfs-collection - insert URL - async - one', function (test, next) { - // XXX should switch to a local URL we host - - // One - try { - fileCollection.insert("http://cdn.morguefile.com/imageData/public/files/b/bboomerindenial/preview/fldr_2009_04_01/file3301238617907.jpg", function (error, result) { - test.isNull(error); - test.instanceOf(result, FS.File); - next(); - }); - } catch (err) { - test.isFalse(!!err, "URL insert failed"); - next(); - } -}); - -Tinytest.addAsync('cfs-collection - insert URL - async - loop', function (test, next) { - // XXX should switch to a local URL we host - - try { - var done = 0; - for (var i = 0, len = 10; i < len; i++) { - fileCollection.insert("http://cdn.morguefile.com/imageData/public/files/b/bboomerindenial/preview/fldr_2009_04_01/file3301238617907.jpg", function (error, result) { - test.isNull(error); - test.instanceOf(result, FS.File); - done++; - if (done === 10) { - next(); - } - }); - } - } catch (err) { - test.isFalse(!!err, "URL insert failed"); - next(); - } -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-data-man/.travis.yml b/packages/wekan-cfs-data-man/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-data-man/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-data-man/LICENSE.md b/packages/wekan-cfs-data-man/LICENSE.md deleted file mode 100644 index f0f70cafa..000000000 --- a/packages/wekan-cfs-data-man/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com, and [@aldeed](https://github.com/aldeed), aka Eric Dobbertin - -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. diff --git a/packages/wekan-cfs-data-man/README.md b/packages/wekan-cfs-data-man/README.md deleted file mode 100644 index a124f46e3..000000000 --- a/packages/wekan-cfs-data-man/README.md +++ /dev/null @@ -1,8 +0,0 @@ -wekan-cfs-data-man [![Build Status](https://travis-ci.org/CollectionFS/Meteor-data-man.svg?branch=master)](https://travis-ci.org/CollectionFS/Meteor-data-man) -========================= - -Who can handle your arbitrary data? The DataMan can. - -This is a package used by CollectionFS to attach data to file objects. Could be used for other things, though. - -[Public API](api.md) diff --git a/packages/wekan-cfs-data-man/api.md b/packages/wekan-cfs-data-man/api.md deleted file mode 100644 index 1e29ebe07..000000000 --- a/packages/wekan-cfs-data-man/api.md +++ /dev/null @@ -1,309 +0,0 @@ -## data-man Public API ## - -A data manager, allowing you to attach various types of data and get it back in various other types - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -- - -### new DataMan(data, [type])  Client ### - - -__Arguments__ - -* __data__ *{[File](#File)|[Blob](#Blob)|ArrayBuffer|Uint8Array|String}* - - The data that you want to manipulate. - -* __type__ *{String}* (Optional) - - The data content (MIME) type, if known. Required if the first argument is an ArrayBuffer, Uint8Array, or URL - - - -> ```DataMan = function DataMan(data, type) { ...``` [client/data-man-api.js:8](client/data-man-api.js#L8) - - -- - -### *dataman*.getBlob(callback)  Client ### - -*This method __getBlob__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{Function}* - - callback(error, blob) - - -__Returns__ *{undefined}* - - -Passes a Blob representing this data to a callback. - -> ```DataMan.prototype.getBlob = function dataManGetBlob(callback) { ...``` [client/data-man-api.js:52](client/data-man-api.js#L52) - - -- - -### *dataman*.getBinary([start], [end], callback)  Client ### - -*This method __getBinary__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __start__ *{Number}* (Optional) - - First byte position to read. - -* __end__ *{Number}* (Optional) - - Last byte position to read. - -* __callback__ *{Function}* - - callback(error, binaryData) - - -__Returns__ *{undefined}* - - -Passes a Uint8Array representing this data to a callback. - -> ```DataMan.prototype.getBinary = function dataManGetBinary(start, end, callback) { ...``` [client/data-man-api.js:84](client/data-man-api.js#L84) - - -- - -### *dataman*.saveAs([filename])  Client ### - -*This method __saveAs__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __filename__ *{String}* (Optional) - -__Returns__ *{undefined}* - -Tells the browser to save the data like a normal downloaded file, -using the provided filename. - - -> ```DataMan.prototype.saveAs = function dataManSaveAs(filename) { ...``` [client/data-man-api.js:146](client/data-man-api.js#L146) - - -- - -### *dataman*.getDataUri(callback)  Client ### - -*This method __getDataUri__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, dataUri) - - - -> ```DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { ...``` [client/data-man-api.js:166](client/data-man-api.js#L166) - - -- - -### *dataman*.type()  Client ### - -*This method __type__ is defined in `prototype` of `DataMan`* - - -Returns the type of the data. - -> ```DataMan.prototype.type = function dataManType() { ...``` [client/data-man-api.js:227](client/data-man-api.js#L227) - - -- - -### new DataMan(data, [type])  Server ### - - -__Arguments__ - -* __data__ *{Buffer|ArrayBuffer|Uint8Array|String}* - - The data that you want to manipulate. - -* __type__ *{String}* (Optional) - - The data content (MIME) type, if known. Required if the first argument is a Buffer, ArrayBuffer, Uint8Array, or URL - - - -> ```DataMan = function DataMan(data, type) { ...``` [server/data-man-api.js:10](server/data-man-api.js#L10) - - -- - -### *dataman*.getBuffer([callback])  Server ### - -*This method __getBuffer__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, buffer) - - -__Returns__ *{Buffer|undefined}* - - -Returns a Buffer representing this data, or passes the Buffer to a callback. - -> ```DataMan.prototype.getBuffer = function dataManGetBuffer(callback) { ...``` [server/data-man-api.js:54](server/data-man-api.js#L54) - - -- - -### *dataman*.saveToFile()  Server ### - -*This method __saveToFile__ is defined in `prototype` of `DataMan`* - -__Returns__ *{undefined}* - - -Saves this data to a filepath on the local filesystem. - -> ```DataMan.prototype.saveToFile = function dataManSaveToFile(filePath) { ...``` [server/data-man-api.js:66](server/data-man-api.js#L66) - - -- - -### *dataman*.getDataUri([callback])  Server ### - -*This method __getDataUri__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, dataUri) - - - -If no callback, returns the data URI. - -> ```DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { ...``` [server/data-man-api.js:84](server/data-man-api.js#L84) - - -- - -### *dataman*.createReadStream()  Server ### - -*This method __createReadStream__ is defined in `prototype` of `DataMan`* - - -Returns a read stream for the data. - -> ```DataMan.prototype.createReadStream = function dataManCreateReadStream() { ...``` [server/data-man-api.js:95](server/data-man-api.js#L95) - - -- - -### *dataman*.size([callback])  Server ### - -*This method __size__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, size) - - - -If no callback, returns the size in bytes of the data. - -> ```DataMan.prototype.size = function dataManSize(callback) { ...``` [server/data-man-api.js:106](server/data-man-api.js#L106) - - -- - -### *dataman*.type()  Server ### - -*This method __type__ is defined in `prototype` of `DataMan`* - - -Returns the type of the data. - -> ```DataMan.prototype.type = function dataManType() { ...``` [server/data-man-api.js:117](server/data-man-api.js#L117) - - -- - -### new *dataman*.Buffer(buffer, type)  Server ### - -*This method __Buffer__ is defined in `DataMan`* - -__Arguments__ - -* __buffer__ *{Buffer}* -* __type__ *{String}* - - The data content (MIME) type. - - - -> ```DataMan.Buffer = function DataManBuffer(buffer, type) { ...``` [server/data-man-buffer.js:10](server/data-man-buffer.js#L10) - - -- - -### new *dataman*.DataURI(dataUri)  Server ### - -*This method __DataURI__ is defined in `DataMan`* - -__Arguments__ - -* __dataUri__ *{String}* - - -> ```DataMan.DataURI = function DataManDataURI(dataUri) { ...``` [server/data-man-datauri.js:7](server/data-man-datauri.js#L7) - - -- - -### new *dataman*.FilePath(filepath, [type])  Server ### - -*This method __FilePath__ is defined in `DataMan`* - -__Arguments__ - -* __filepath__ *{String}* -* __type__ *{String}* (Optional) - - The data content (MIME) type. Will lookup from file if not passed. - - - -> ```DataMan.FilePath = function DataManFilePath(filepath, type) { ...``` [server/data-man-filepath.js:11](server/data-man-filepath.js#L11) - - -- - -### new *dataman*.URL(url, type)  Server ### - -*This method __URL__ is defined in `DataMan`* - -__Arguments__ - -* __url__ *{String}* -* __type__ *{String}* - - The data content (MIME) type. - - - -> ```DataMan.URL = function DataManURL(url, type) { ...``` [server/data-man-url.js:10](server/data-man-url.js#L10) - - diff --git a/packages/wekan-cfs-data-man/client/Blob.js b/packages/wekan-cfs-data-man/client/Blob.js deleted file mode 100644 index 7e5e42de7..000000000 --- a/packages/wekan-cfs-data-man/client/Blob.js +++ /dev/null @@ -1,166 +0,0 @@ -/* Blob.js - * A Blob implementation. - * 2013-12-27 - * - * By Eli Grey, http://eligrey.com - * By Devin Samarin, https://github.com/eboyjr - * License: X11/MIT - * See LICENSE.md - */ - -/*global self, unescape */ -/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, - plusplus: true */ - -/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ - -if (!(typeof Blob === "function" || typeof Blob === "object") || typeof URL === "undefined") -if ((typeof Blob === "function" || typeof Blob === "object") && typeof webkitURL !== "undefined") self.URL = webkitURL; -else var Blob = (function (view) { - "use strict"; - - var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || view.MSBlobBuilder || (function(view) { - var - get_class = function(object) { - return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; - } - , FakeBlobBuilder = function BlobBuilder() { - this.data = []; - } - , FakeBlob = function Blob(data, type, encoding) { - this.data = data; - this.size = data.length; - this.type = type; - this.encoding = encoding; - } - , FBB_proto = FakeBlobBuilder.prototype - , FB_proto = FakeBlob.prototype - , FileReaderSync = view.FileReaderSync - , FileException = function(type) { - this.code = this[this.name = type]; - } - , file_ex_codes = ( - "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " - + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" - ).split(" ") - , file_ex_code = file_ex_codes.length - , real_URL = view.URL || view.webkitURL || view - , real_create_object_URL = real_URL.createObjectURL - , real_revoke_object_URL = real_URL.revokeObjectURL - , URL = real_URL - , btoa = view.btoa - , atob = view.atob - - , ArrayBuffer = view.ArrayBuffer - , Uint8Array = view.Uint8Array - ; - FakeBlob.fake = FB_proto.fake = true; - while (file_ex_code--) { - FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; - } - if (!real_URL.createObjectURL) { - URL = view.URL = {}; - } - URL.createObjectURL = function(blob) { - var - type = blob.type - , data_URI_header - ; - if (type === null) { - type = "application/octet-stream"; - } - if (blob instanceof FakeBlob) { - data_URI_header = "data:" + type; - if (blob.encoding === "base64") { - return data_URI_header + ";base64," + blob.data; - } else if (blob.encoding === "URI") { - return data_URI_header + "," + decodeURIComponent(blob.data); - } if (btoa) { - return data_URI_header + ";base64," + btoa(blob.data); - } else { - return data_URI_header + "," + encodeURIComponent(blob.data); - } - } else if (real_create_object_URL) { - return real_create_object_URL.call(real_URL, blob); - } - }; - URL.revokeObjectURL = function(object_URL) { - if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { - real_revoke_object_URL.call(real_URL, object_URL); - } - }; - FBB_proto.append = function(data/*, endings*/) { - var bb = this.data; - // decode data to a binary string - if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { - var - str = "" - , buf = new Uint8Array(data) - , i = 0 - , buf_len = buf.length - ; - for (; i < buf_len; i++) { - str += String.fromCharCode(buf[i]); - } - bb.push(str); - } else if (get_class(data) === "Blob" || get_class(data) === "File") { - if (FileReaderSync) { - var fr = new FileReaderSync; - bb.push(fr.readAsBinaryString(data)); - } else { - // async FileReader won't work as BlobBuilder is sync - throw new FileException("NOT_READABLE_ERR"); - } - } else if (data instanceof FakeBlob) { - if (data.encoding === "base64" && atob) { - bb.push(atob(data.data)); - } else if (data.encoding === "URI") { - bb.push(decodeURIComponent(data.data)); - } else if (data.encoding === "raw") { - bb.push(data.data); - } - } else { - if (typeof data !== "string") { - data += ""; // convert unsupported types to strings - } - // decode UTF-16 to binary string - bb.push(unescape(encodeURIComponent(data))); - } - }; - FBB_proto.getBlob = function(type) { - if (!arguments.length) { - type = null; - } - return new FakeBlob(this.data.join(""), type, "raw"); - }; - FBB_proto.toString = function() { - return "[object BlobBuilder]"; - }; - FB_proto.slice = function(start, end, type) { - var args = arguments.length; - if (args < 3) { - type = null; - } - return new FakeBlob( - this.data.slice(start, args > 1 ? end : this.data.length) - , type - , this.encoding - ); - }; - FB_proto.toString = function() { - return "[object Blob]"; - }; - return FakeBlobBuilder; - }(view)); - - return function Blob(blobParts, options) { - var type = options ? (options.type || "") : ""; - var builder = new BlobBuilder(); - if (blobParts) { - for (var i = 0, len = blobParts.length; i < len; i++) { - builder.append(blobParts[i]); - } - } - return builder.getBlob(type); - }; -}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); diff --git a/packages/wekan-cfs-data-man/client/data-man-api.js b/packages/wekan-cfs-data-man/client/data-man-api.js deleted file mode 100644 index 709fba654..000000000 --- a/packages/wekan-cfs-data-man/client/data-man-api.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @method DataMan - * @public - * @constructor - * @param {File|Blob|ArrayBuffer|Uint8Array|String} data The data that you want to manipulate. - * @param {String} [type] The data content (MIME) type, if known. Required if the first argument is an ArrayBuffer, Uint8Array, or URL - */ -DataMan = function DataMan(data, type) { - var self = this; - - if (!data) { - throw new Error("DataMan constructor requires a data argument"); - } - - // The end result of all this is that we will have one of the following set: - // - self.blob - // - self.url - // Unless we already have in-memory data, we don't load anything into memory - // and instead rely on obtaining a read stream when the time comes. - if (typeof File !== "undefined" && data instanceof File) { - self.blob = data; // File inherits from Blob so this is OK - self._type = data.type; - } else if (typeof Blob !== "undefined" && data instanceof Blob) { - self.blob = data; - self._type = data.type; - } else if (typeof ArrayBuffer !== "undefined" && data instanceof ArrayBuffer || EJSON.isBinary(data)) { - if (typeof Blob === "undefined") { - throw new Error("Browser must support Blobs to handle an ArrayBuffer or Uint8Array"); - } - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed an ArrayBuffer or Uint8Array"); - } - self.blob = new Blob([data], {type: type}); - self._type = type; - } else if (typeof data === "string") { - if (data.slice(0, 5) === "data:") { - self._type = data.slice(5, data.indexOf(';')); - self.blob = dataURItoBlob(data, self._type); - } else if (data.slice(0, 5) === "http:" || data.slice(0, 6) === "https:") { - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed a URL"); - } - self.url = data; - self._type = type; - } else { - throw new Error("DataMan constructor received unrecognized data string"); - } - } else { - throw new Error("DataMan constructor received data that it doesn't support"); - } -}; - -/** - * @method DataMan.prototype.getBlob - * @public - * @param {Function} [callback] - callback(error, blob) - * @returns {undefined|Blob} - * - * Passes a Blob representing this data to a callback or returns - * the Blob if no callback is provided. A callback is required - * if getting a Blob for a URL. - */ -DataMan.prototype.getBlob = function dataManGetBlob(callback) { - var self = this; - - if (callback) { - if (self.blob) { - callback(null, self.blob); - } else if (self.url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', self.url, true); - xhr.responseType = "blob"; - xhr.onload = function(data) { - self.blob = xhr.response; - callback(null, self.blob); - }; - xhr.onerror = function(err) { - callback(err); - }; - xhr.send(); - } - } else { - if (self.url) - throw new Error('DataMan.getBlob requires a callback when managing a URL'); - return self.blob; - } -}; - -/** - * @method DataMan.prototype.getBinary - * @public - * @param {Number} [start] - First byte position to read. - * @param {Number} [end] - Last byte position to read. - * @param {Function} callback - callback(error, binaryData) - * @returns {undefined} - * - * Passes a Uint8Array representing this data to a callback. - */ -DataMan.prototype.getBinary = function dataManGetBinary(start, end, callback) { - var self = this; - - if (typeof start === "function") { - callback = start; - } - callback = callback || defaultCallback; - - function read(blob) { - if (typeof FileReader === "undefined") { - callback(new Error("Browser does not support FileReader")); - return; - } - - var reader = new FileReader(); - reader.onload = function(evt) { - callback(null, new Uint8Array(evt.target.result)); - }; - reader.onerror = function(err) { - callback(err); - }; - reader.readAsArrayBuffer(blob); - } - - self.getBlob(function (error, blob) { - if (error) { - callback(error); - } else { - if (typeof start === "number" && typeof end === "number") { - var size = blob.size; - // Return the requested chunk of binary data - if (start >= size) { - callback(new Error("DataMan.getBinary: start position beyond end of data (" + size + ")")); - return; - } - end = Math.min(size, end); - - var slice = blob.slice || blob.webkitSlice || blob.mozSlice; - if (typeof slice === 'undefined') { - callback(new Error('Browser does not support File.slice')); - return; - } - - read(slice.call(blob, start, end, self._type)); - } else { - // Return the entire binary data - read(blob); - } - } - }); - -}; - -/** @method DataMan.prototype.saveAs - * @public - * @param {String} [filename] - * @return {undefined} - * - * Tells the browser to save the data like a normal downloaded file, - * using the provided filename. - * - */ -DataMan.prototype.saveAs = function dataManSaveAs(filename) { - var self = this; - - if (typeof window === "undefined") - throw new Error("window must be defined to use saveLocal"); - - if (!window.saveAs) { - console.warn('DataMan.saveAs: window.saveAs not supported by this browser - add cfs-filesaver package'); - return; - } - - self.getBlob(function (error, blob) { - if (error) { - throw error; - } else { - window.saveAs(blob, filename); - } - }); -}; - -/** - * @method DataMan.prototype.getDataUri - * @public - * @param {function} callback callback(err, dataUri) - */ -DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { - // XXX: We could consider using: URL.createObjectURL(blob); - // This will create a reference to the blob data instead of a clone - // This is part of the File API - as the rest - Not sure how to generally - // support from IE10, FF26, Chrome 31, safari 7, opera 19, ios 6, android 4 - - var self = this; - - if (typeof callback !== 'function') - throw new Error("getDataUri requires callback function"); - - if (typeof FileReader === "undefined") { - callback(new Error("Browser does not support FileReader")); - return; - } - - var fileReader = new FileReader(); - fileReader.onload = function(event) { - var dataUri = event.target.result; - callback(null, dataUri); - }; - fileReader.onerror = function(err) { - callback(err); - }; - - self.getBlob(function (error, blob) { - if (error) { - callback(error); - } else { - fileReader.readAsDataURL(blob); - } - }); -}; - -/** - * @method DataMan.prototype.size - * @public - * @param {function} [callback] callback(err, size) - * - * Passes the size of the data to the callback, if provided, - * or returns it. A callback is required to get the size of a URL on the client. - */ -DataMan.prototype.size = function dataManSize(callback) { - var self = this; - - if (callback) { - if (typeof self._size === "number") { - callback(null, self._size); - } else { - self.getBlob(function (error, blob) { - if (error) { - callback(error); - } else { - self._size = blob.size; - callback(null, self._size); - } - }); - } - } else { - if (self.url) { - throw new Error("On the client, DataMan.size requires a callback when getting size for a URL on the client"); - } else if (typeof self._size === "number") { - return self._size; - } else { - var blob = self.getBlob(); - self._size = blob.size; - return self._size; - } - } -}; - -/** - * @method DataMan.prototype.type - * @public - * - * Returns the type of the data. - */ -DataMan.prototype.type = function dataManType() { - return this._type; -}; - -/** - * @method dataURItoBlob - * @private - * @param {String} dataURI The data URI - * @param {String} dataTYPE The content type - * @returns {Blob} A new Blob instance - * - * Converts a data URI to a Blob. - */ -function dataURItoBlob(dataURI, dataTYPE) { - var str = atob(dataURI.split(',')[1]), array = []; - for(var i = 0; i < str.length; i++) array.push(str.charCodeAt(i)); - return new Blob([new Uint8Array(array)], {type: dataTYPE}); -} - -/** - * @method defaultCallback - * @private - * @param {Error} [err] - * @returns {undefined} - * - * Can be used as a default callback for client methods that need a callback. - * Simply throws the provided error if there is one. - */ -function defaultCallback(err) { - if (err) { - // Show gentle error if Meteor error - if (err instanceof Meteor.Error) { - console.error(err.message); - } else { - // Normal error, just throw error - throw err; - } - - } -} diff --git a/packages/wekan-cfs-data-man/internal.api.md b/packages/wekan-cfs-data-man/internal.api.md deleted file mode 100644 index dd86af961..000000000 --- a/packages/wekan-cfs-data-man/internal.api.md +++ /dev/null @@ -1,674 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["client/Blob.js"](client/Blob.js) Where: {client}__ - -*** - -### if {any}  Client ### - -``` -Blob.js -A Blob implementation. -2013-06-20 -By Eli Grey, http: -By Devin Samarin, https: -License: X11/MIT -See LICENSE.md -``` - - -> ```if ((typeof Blob !== ``` [client/Blob.js:17](client/Blob.js#L17) - - -- - -### if {any}  Client ### - -``` -global unescape jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, -plusplus: true -``` - -> ```if ((typeof Blob !== ``` [client/Blob.js:17](client/Blob.js#L17) - - -*** - -__File: ["client/data-man-api.js"](client/data-man-api.js) Where: {client}__ - -*** - -### new DataMan(data, [type])  Client ### - - -__Arguments__ - -* __data__ *{[File](#File)|[Blob](#Blob)|ArrayBuffer|Uint8Array|String}* - - The data that you want to manipulate. - -* __type__ *{String}* (Optional) - - The data content (MIME) type, if known. Required if the first argument is an ArrayBuffer, Uint8Array, or URL - - - -> ```DataMan = function DataMan(data, type) { ...``` [client/data-man-api.js:8](client/data-man-api.js#L8) - - -- - -### *dataman*.getBlob(callback)  Client ### - -*This method __getBlob__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{Function}* - - callback(error, blob) - - -__Returns__ *{undefined}* - - -Passes a Blob representing this data to a callback. - -> ```DataMan.prototype.getBlob = function dataManGetBlob(callback) { ...``` [client/data-man-api.js:52](client/data-man-api.js#L52) - - -- - -### *dataman*.getBinary([start], [end], callback)  Client ### - -*This method __getBinary__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __start__ *{Number}* (Optional) - - First byte position to read. - -* __end__ *{Number}* (Optional) - - Last byte position to read. - -* __callback__ *{Function}* - - callback(error, binaryData) - - -__Returns__ *{undefined}* - - -Passes a Uint8Array representing this data to a callback. - -> ```DataMan.prototype.getBinary = function dataManGetBinary(start, end, callback) { ...``` [client/data-man-api.js:84](client/data-man-api.js#L84) - - -- - -### *dataman*.saveAs([filename])  Client ### - -*This method __saveAs__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __filename__ *{String}* (Optional) - -__Returns__ *{undefined}* - -Tells the browser to save the data like a normal downloaded file, -using the provided filename. - - -> ```DataMan.prototype.saveAs = function dataManSaveAs(filename) { ...``` [client/data-man-api.js:146](client/data-man-api.js#L146) - - -- - -### *dataman*.getDataUri(callback)  Client ### - -*This method __getDataUri__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, dataUri) - - - -> ```DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { ...``` [client/data-man-api.js:166](client/data-man-api.js#L166) - - -- - -### *dataman*.type()  Client ### - -*This method __type__ is defined in `prototype` of `DataMan`* - - -Returns the type of the data. - -> ```DataMan.prototype.type = function dataManType() { ...``` [client/data-man-api.js:227](client/data-man-api.js#L227) - - -- - -### dataURItoBlob(dataURI, dataTYPE)  undefined ### - -*This method is private* - -__Arguments__ - -* __dataURI__ *{String}* - - The data URI - -* __dataTYPE__ *{String}* - - The content type - - -__Returns__ *{Blob}* -A new Blob instance - - -Converts a data URI to a Blob. - -> ```function dataURItoBlob(dataURI, dataTYPE) { ...``` [client/data-man-api.js:240](client/data-man-api.js#L240) - - -- - -### defaultCallback([err])  undefined ### - -*This method is private* - -__Arguments__ - -* __err__ *{[Error](#Error)}* (Optional) - -__Returns__ *{undefined}* - - -Can be used as a default callback for client methods that need a callback. -Simply throws the provided error if there is one. - -> ```function defaultCallback(err) { ...``` [client/data-man-api.js:255](client/data-man-api.js#L255) - - -*** - -__File: ["server/data-man-api.js"](server/data-man-api.js) Where: {server}__ - -*** - -### new DataMan(data, [type])  Server ### - - -__Arguments__ - -* __data__ *{Buffer|ArrayBuffer|Uint8Array|String}* - - The data that you want to manipulate. - -* __type__ *{String}* (Optional) - - The data content (MIME) type, if known. Required if the first argument is a Buffer, ArrayBuffer, Uint8Array, or URL - - - -> ```DataMan = function DataMan(data, type) { ...``` [server/data-man-api.js:10](server/data-man-api.js#L10) - - -- - -### *dataman*.getBuffer([callback])  Server ### - -*This method __getBuffer__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, buffer) - - -__Returns__ *{Buffer|undefined}* - - -Returns a Buffer representing this data, or passes the Buffer to a callback. - -> ```DataMan.prototype.getBuffer = function dataManGetBuffer(callback) { ...``` [server/data-man-api.js:54](server/data-man-api.js#L54) - - -- - -### *dataman*.saveToFile()  Server ### - -*This method __saveToFile__ is defined in `prototype` of `DataMan`* - -__Returns__ *{undefined}* - - -Saves this data to a filepath on the local filesystem. - -> ```DataMan.prototype.saveToFile = function dataManSaveToFile(filePath) { ...``` [server/data-man-api.js:66](server/data-man-api.js#L66) - - -- - -### *dataman*.getDataUri([callback])  Server ### - -*This method __getDataUri__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, dataUri) - - - -If no callback, returns the data URI. - -> ```DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { ...``` [server/data-man-api.js:84](server/data-man-api.js#L84) - - -- - -### *dataman*.createReadStream()  Server ### - -*This method __createReadStream__ is defined in `prototype` of `DataMan`* - - -Returns a read stream for the data. - -> ```DataMan.prototype.createReadStream = function dataManCreateReadStream() { ...``` [server/data-man-api.js:95](server/data-man-api.js#L95) - - -- - -### *dataman*.size([callback])  Server ### - -*This method __size__ is defined in `prototype` of `DataMan`* - -__Arguments__ - -* __callback__ *{function}* (Optional) - - callback(err, size) - - - -If no callback, returns the size in bytes of the data. - -> ```DataMan.prototype.size = function dataManSize(callback) { ...``` [server/data-man-api.js:106](server/data-man-api.js#L106) - - -- - -### *dataman*.type()  Server ### - -*This method __type__ is defined in `prototype` of `DataMan`* - - -Returns the type of the data. - -> ```DataMan.prototype.type = function dataManType() { ...``` [server/data-man-api.js:117](server/data-man-api.js#L117) - - -*** - -__File: ["server/data-man-buffer.js"](server/data-man-buffer.js) Where: {server}__ - -*** - -### new *dataman*.Buffer(buffer, type)  Server ### - -*This method __Buffer__ is defined in `DataMan`* - -__Arguments__ - -* __buffer__ *{Buffer}* -* __type__ *{String}* - - The data content (MIME) type. - - - -> ```DataMan.Buffer = function DataManBuffer(buffer, type) { ...``` [server/data-man-buffer.js:10](server/data-man-buffer.js#L10) - - -- - -### *datamanBuffer*.getBuffer(callback)  Server ### - -*This method is private* -*This method __getBuffer__ is defined in `prototype` of `DataMan.Buffer`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, buffer) - - -__Returns__ *{Buffer|undefined}* - - -Passes a Buffer representing the data to a callback. - -> ```DataMan.Buffer.prototype.getBuffer = function dataManBufferGetBuffer(callback) { ...``` [server/data-man-buffer.js:24](server/data-man-buffer.js#L24) - - -- - -### *datamanBuffer*.getDataUri(callback)  Server ### - -*This method is private* -*This method __getDataUri__ is defined in `prototype` of `DataMan.Buffer`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, dataUri) - - - -Passes a data URI representing the data in the buffer to a callback. - -> ```DataMan.Buffer.prototype.getDataUri = function dataManBufferGetDataUri(callback) { ...``` [server/data-man-buffer.js:35](server/data-man-buffer.js#L35) - - -- - -### *datamanBuffer*.createReadStream()  Server ### - -*This method is private* -*This method __createReadStream__ is defined in `prototype` of `DataMan.Buffer`* - - -Returns a read stream for the data. - -> ```DataMan.Buffer.prototype.createReadStream = function dataManBufferCreateReadStream() { ...``` [server/data-man-buffer.js:51](server/data-man-buffer.js#L51) - - -- - -### *datamanBuffer*.size(callback)  Server ### - -*This method is private* -*This method __size__ is defined in `prototype` of `DataMan.Buffer`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, size) - - - -Passes the size in bytes of the data in the buffer to a callback. - -> ```DataMan.Buffer.prototype.size = function dataManBufferSize(callback) { ...``` [server/data-man-buffer.js:62](server/data-man-buffer.js#L62) - - -- - -### *datamanBuffer*.type()  Server ### - -*This method is private* -*This method __type__ is defined in `prototype` of `DataMan.Buffer`* - - -Returns the type of the data. - -> ```DataMan.Buffer.prototype.type = function dataManBufferType() { ...``` [server/data-man-buffer.js:80](server/data-man-buffer.js#L80) - - -*** - -__File: ["server/data-man-datauri.js"](server/data-man-datauri.js) Where: {server}__ - -*** - -### new *dataman*.DataURI(dataUri)  Server ### - -*This method __DataURI__ is defined in `DataMan`* - -__Arguments__ - -* __dataUri__ *{String}* - - -> ```DataMan.DataURI = function DataManDataURI(dataUri) { ...``` [server/data-man-datauri.js:7](server/data-man-datauri.js#L7) - - -*** - -__File: ["server/data-man-filepath.js"](server/data-man-filepath.js) Where: {server}__ - -*** - -### new *dataman*.FilePath(filepath, [type])  Server ### - -*This method __FilePath__ is defined in `DataMan`* - -__Arguments__ - -* __filepath__ *{String}* -* __type__ *{String}* (Optional) - - The data content (MIME) type. Will lookup from file if not passed. - - - -> ```DataMan.FilePath = function DataManFilePath(filepath, type) { ...``` [server/data-man-filepath.js:11](server/data-man-filepath.js#L11) - - -- - -### *datamanFilepath*.getBuffer(callback)  Server ### - -*This method is private* -*This method __getBuffer__ is defined in `prototype` of `DataMan.FilePath`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, buffer) - - -__Returns__ *{Buffer|undefined}* - - -Passes a Buffer representing the data to a callback. - -> ```DataMan.FilePath.prototype.getBuffer = function dataManFilePathGetBuffer(callback) { ...``` [server/data-man-filepath.js:25](server/data-man-filepath.js#L25) - - -- - -### *datamanFilepath*.getDataUri(callback)  Server ### - -*This method is private* -*This method __getDataUri__ is defined in `prototype` of `DataMan.FilePath`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, dataUri) - - - -Passes a data URI representing the data to a callback. - -> ```DataMan.FilePath.prototype.getDataUri = function dataManFilePathGetDataUri(callback) { ...``` [server/data-man-filepath.js:43](server/data-man-filepath.js#L43) - - -- - -### *datamanFilepath*.createReadStream()  Server ### - -*This method is private* -*This method __createReadStream__ is defined in `prototype` of `DataMan.FilePath`* - - -Returns a read stream for the data. - -> ```DataMan.FilePath.prototype.createReadStream = function dataManFilePathCreateReadStream() { ...``` [server/data-man-filepath.js:67](server/data-man-filepath.js#L67) - - -- - -### *datamanFilepath*.size(callback)  Server ### - -*This method is private* -*This method __size__ is defined in `prototype` of `DataMan.FilePath`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, size) - - - -Passes the size in bytes of the data to a callback. - -> ```DataMan.FilePath.prototype.size = function dataManFilePathSize(callback) { ...``` [server/data-man-filepath.js:79](server/data-man-filepath.js#L79) - - -- - -### *datamanFilepath*.type()  Server ### - -*This method is private* -*This method __type__ is defined in `prototype` of `DataMan.FilePath`* - - -Returns the type of the data. - -> ```DataMan.FilePath.prototype.type = function dataManFilePathType() { ...``` [server/data-man-filepath.js:104](server/data-man-filepath.js#L104) - - -*** - -__File: ["server/data-man-url.js"](server/data-man-url.js) Where: {server}__ - -*** - -### new *dataman*.URL(url, type)  Server ### - -*This method __URL__ is defined in `DataMan`* - -__Arguments__ - -* __url__ *{String}* -* __type__ *{String}* - - The data content (MIME) type. - - - -> ```DataMan.URL = function DataManURL(url, type) { ...``` [server/data-man-url.js:10](server/data-man-url.js#L10) - - -- - -### *datamanUrl*.getBuffer(callback)  Server ### - -*This method is private* -*This method __getBuffer__ is defined in `prototype` of `DataMan.URL`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, buffer) - - -__Returns__ *{Buffer|undefined}* - - -Passes a Buffer representing the data at the URL to a callback. - -> ```DataMan.URL.prototype.getBuffer = function dataManUrlGetBuffer(callback) { ...``` [server/data-man-url.js:24](server/data-man-url.js#L24) - - -- - -### *datamanUrl*.getDataUri(callback)  Server ### - -*This method is private* -*This method __getDataUri__ is defined in `prototype` of `DataMan.URL`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, dataUri) - - - -Passes a data URI representing the data at the URL to a callback. - -> ```DataMan.URL.prototype.getDataUri = function dataManUrlGetDataUri(callback) { ...``` [server/data-man-url.js:57](server/data-man-url.js#L57) - - -- - -### *datamanUrl*.createReadStream()  Server ### - -*This method is private* -*This method __createReadStream__ is defined in `prototype` of `DataMan.URL`* - - -Returns a read stream for the data. - -> ```DataMan.URL.prototype.createReadStream = function dataManUrlCreateReadStream() { ...``` [server/data-man-url.js:85](server/data-man-url.js#L85) - - -- - -### *datamanUrl*.size(callback)  Server ### - -*This method is private* -*This method __size__ is defined in `prototype` of `DataMan.URL`* - -__Arguments__ - -* __callback__ *{function}* - - callback(err, size) - - - -Returns the size in bytes of the data at the URL. - -> ```DataMan.URL.prototype.size = function dataManUrlSize(callback) { ...``` [server/data-man-url.js:97](server/data-man-url.js#L97) - - -- - -### *datamanUrl*.type()  Server ### - -*This method is private* -*This method __type__ is defined in `prototype` of `DataMan.URL`* - - -Returns the type of the data. - -> ```DataMan.URL.prototype.type = function dataManUrlType() { ...``` [server/data-man-url.js:121](server/data-man-url.js#L121) - - diff --git a/packages/wekan-cfs-data-man/package.js b/packages/wekan-cfs-data-man/package.js deleted file mode 100644 index f0c9062fc..000000000 --- a/packages/wekan-cfs-data-man/package.js +++ /dev/null @@ -1,48 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-data-man', - version: '0.0.6', - summary: 'A data manager, allowing you to attach various types of data and get it back in various other types', - git: 'https://github.com/zcfs/Meteor-data-man.git' -}); - -Npm.depends({ - mime: "1.2.11", - 'buffer-stream-reader': "0.1.1", - //request: "2.44.0", - // We use a specific commit from a fork of "request" package for now; we need fix for - // https://github.com/mikeal/request/issues/887 (https://github.com/zcfs/Meteor-CollectionFS/issues/347) - request: "https://github.com/wekan/request", - temp: "0.7.0" // for tests only -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use(['ejson']); - - api.use(['wekan-cfs-filesaver@0.0.6'], {weak: true}); - - api.export('DataMan'); - - api.addFiles([ - 'client/Blob.js', //polyfill for browsers without Blob constructor; currently necessary for phantomjs support, too - 'client/data-man-api.js' - ], 'client'); - - api.addFiles([ - 'server/data-man-api.js', - 'server/data-man-buffer.js', - 'server/data-man-datauri.js', - 'server/data-man-filepath.js', - 'server/data-man-url.js', - 'server/data-man-readstream.js' - ], 'server'); - -}); - -Package.onTest(function (api) { - api.use(['wekan-cfs-data-man', 'http', 'tinytest', 'test-helpers', 'wekan-cfs-http-methods@0.0.29']); - - api.addFiles(['tests/common.js', 'tests/client-tests.js'], 'client'); - api.addFiles(['tests/common.js', 'tests/server-tests.js'], 'server'); -}); diff --git a/packages/wekan-cfs-data-man/server/data-man-api.js b/packages/wekan-cfs-data-man/server/data-man-api.js deleted file mode 100644 index 58bd2bdf0..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-api.js +++ /dev/null @@ -1,176 +0,0 @@ -/* global DataMan:true, Buffer */ - -var fs = Npm.require("fs"); -var Readable = Npm.require('stream').Readable; - -/** - * @method DataMan - * @public - * @constructor - * @param {Buffer|ArrayBuffer|Uint8Array|String} data The data that you want to manipulate. - * @param {String} [type] The data content (MIME) type, if known. Required if the first argument is a Buffer, ArrayBuffer, Uint8Array, or URL - * @param {Object} [options] Currently used only to pass options for the GET request when `data` is a URL. - */ -DataMan = function DataMan(data, type, options) { - var self = this, buffer; - - if (!data) { - throw new Error("DataMan constructor requires a data argument"); - } - - // The end result of all this is that we will have this.source set to a correct - // data type handler. We are simply detecting what the data arg is. - // - // Unless we already have in-memory data, we don't load anything into memory - // and instead rely on obtaining a read stream when the time comes. - if (typeof Buffer !== "undefined" && data instanceof Buffer) { - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed a Buffer"); - } - self.source = new DataMan.Buffer(data, type); - } else if (typeof ArrayBuffer !== "undefined" && data instanceof ArrayBuffer) { - if (typeof Buffer === "undefined") { - throw new Error("Buffer support required to handle an ArrayBuffer"); - } - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed an ArrayBuffer"); - } - buffer = new Buffer(new Uint8Array(data)); - self.source = new DataMan.Buffer(buffer, type); - } else if (EJSON.isBinary(data)) { - if (typeof Buffer === "undefined") { - throw new Error("Buffer support required to handle an ArrayBuffer"); - } - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed a Uint8Array"); - } - buffer = new Buffer(data); - self.source = new DataMan.Buffer(buffer, type); - } else if (typeof Readable !== "undefined" && data instanceof Readable) { - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed a stream.Readable"); - } - self.source = new DataMan.ReadStream(data, type); - } else if (typeof data === "string") { - if (data.slice(0, 5) === "data:") { - self.source = new DataMan.DataURI(data); - } else if (data.slice(0, 5) === "http:" || data.slice(0, 6) === "https:") { - if (!type) { - throw new Error("DataMan constructor requires a type argument when passed a URL"); - } - self.source = new DataMan.URL(data, type, options); - } else { - // assume it's a filepath - self.source = new DataMan.FilePath(data, type); - } - } else { - throw new Error("DataMan constructor received data that it doesn't support"); - } -}; - -/** - * @method DataMan.prototype.getBuffer - * @public - * @param {function} [callback] callback(err, buffer) - * @returns {Buffer|undefined} - * - * Returns a Buffer representing this data, or passes the Buffer to a callback. - */ -DataMan.prototype.getBuffer = function dataManGetBuffer(callback) { - var self = this; - return callback ? self.source.getBuffer(callback) : Meteor.wrapAsync(bind(self.source.getBuffer, self.source))(); -}; - -function _saveToFile(readStream, filePath, callback) { - var writeStream = fs.createWriteStream(filePath); - writeStream.on('close', Meteor.bindEnvironment(function () { - callback(); - }, function (error) { callback(error); })); - writeStream.on('error', Meteor.bindEnvironment(function (error) { - callback(error); - }, function (error) { callback(error); })); - readStream.pipe(writeStream); -} - -/** - * @method DataMan.prototype.saveToFile - * @public - * @param {String} filePath - * @param {Function} callback - * @returns {undefined} - * - * Saves this data to a filepath on the local filesystem. - */ -DataMan.prototype.saveToFile = function dataManSaveToFile(filePath, callback) { - var readStream = this.createReadStream(); - return callback ? _saveToFile(readStream, filePath, callback) : Meteor.wrapAsync(_saveToFile)(readStream, filePath); -}; - -/** - * @method DataMan.prototype.getDataUri - * @public - * @param {function} [callback] callback(err, dataUri) - * - * If no callback, returns the data URI. - */ -DataMan.prototype.getDataUri = function dataManGetDataUri(callback) { - var self = this; - return callback ? self.source.getDataUri(callback) : Meteor.wrapAsync(bind(self.source.getDataUri, self.source))(); -}; - -/** - * @method DataMan.prototype.createReadStream - * @public - * - * Returns a read stream for the data. - */ -DataMan.prototype.createReadStream = function dataManCreateReadStream() { - return this.source.createReadStream(); -}; - -/** - * @method DataMan.prototype.size - * @public - * @param {function} [callback] callback(err, size) - * - * If no callback, returns the size in bytes of the data. - */ -DataMan.prototype.size = function dataManSize(callback) { - var self = this; - return callback ? self.source.size(callback) : Meteor.wrapAsync(bind(self.source.size, self.source))(); -}; - -/** - * @method DataMan.prototype.type - * @public - * - * Returns the type of the data. - */ -DataMan.prototype.type = function dataManType() { - return this.source.type(); -}; - -/* - * "bind" shim; from underscorejs, but we avoid a dependency - */ -var slice = Array.prototype.slice; -var nativeBind = Function.prototype.bind; -var ctor = function(){}; -function isFunction(obj) { - return Object.prototype.toString.call(obj) == '[object Function]'; -} -function bind(func, context) { - var args, bound; - if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - ctor.prototype = null; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; -} diff --git a/packages/wekan-cfs-data-man/server/data-man-buffer.js b/packages/wekan-cfs-data-man/server/data-man-buffer.js deleted file mode 100644 index 2b4c47f25..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-buffer.js +++ /dev/null @@ -1,82 +0,0 @@ -var bufferStreamReader = Npm.require('buffer-stream-reader'); - -/** - * @method DataMan.Buffer - * @public - * @constructor - * @param {Buffer} buffer - * @param {String} type The data content (MIME) type. - */ -DataMan.Buffer = function DataManBuffer(buffer, type) { - var self = this; - self.buffer = buffer; - self._type = type; -}; - -/** - * @method DataMan.Buffer.prototype.getBuffer - * @private - * @param {function} callback callback(err, buffer) - * @returns {Buffer|undefined} - * - * Passes a Buffer representing the data to a callback. - */ -DataMan.Buffer.prototype.getBuffer = function dataManBufferGetBuffer(callback) { - callback(null, this.buffer); -}; - -/** - * @method DataMan.Buffer.prototype.getDataUri - * @private - * @param {function} callback callback(err, dataUri) - * - * Passes a data URI representing the data in the buffer to a callback. - */ -DataMan.Buffer.prototype.getDataUri = function dataManBufferGetDataUri(callback) { - var self = this; - if (!self._type) { - callback(new Error("DataMan.getDataUri couldn't get a contentType")); - } else { - var dataUri = "data:" + self._type + ";base64," + self.buffer.toString("base64"); - callback(null, dataUri); - } -}; - -/** - * @method DataMan.Buffer.prototype.createReadStream - * @private - * - * Returns a read stream for the data. - */ -DataMan.Buffer.prototype.createReadStream = function dataManBufferCreateReadStream() { - return new bufferStreamReader(this.buffer); -}; - -/** - * @method DataMan.Buffer.prototype.size - * @param {function} callback callback(err, size) - * @private - * - * Passes the size in bytes of the data in the buffer to a callback. - */ -DataMan.Buffer.prototype.size = function dataManBufferSize(callback) { - var self = this; - - if (typeof self._size === "number") { - callback(null, self._size); - return; - } - - self._size = self.buffer.length; - callback(null, self._size); -}; - -/** - * @method DataMan.Buffer.prototype.type - * @private - * - * Returns the type of the data. - */ -DataMan.Buffer.prototype.type = function dataManBufferType() { - return this._type; -}; diff --git a/packages/wekan-cfs-data-man/server/data-man-datauri.js b/packages/wekan-cfs-data-man/server/data-man-datauri.js deleted file mode 100644 index 59e241efb..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-datauri.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @method DataMan.DataURI - * @public - * @constructor - * @param {String} dataUri - */ -DataMan.DataURI = function DataManDataURI(dataUri) { - var self = this; - var pieces = dataUri.match(/^data:(.*);base64,(.*)$/); - var buffer = new Buffer(pieces[2], 'base64'); - return new DataMan.Buffer(buffer, pieces[1]); -}; - -DataMan.DataURI.prototype = DataMan.Buffer.prototype; diff --git a/packages/wekan-cfs-data-man/server/data-man-filepath.js b/packages/wekan-cfs-data-man/server/data-man-filepath.js deleted file mode 100644 index 2f3131708..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-filepath.js +++ /dev/null @@ -1,108 +0,0 @@ -var mime = Npm.require('mime'); -var fs = Npm.require("fs"); - -/** - * @method DataMan.FilePath - * @public - * @constructor - * @param {String} filepath - * @param {String} [type] The data content (MIME) type. Will lookup from file if not passed. - */ -DataMan.FilePath = function DataManFilePath(filepath, type) { - var self = this; - self.filepath = filepath; - self._type = type || mime.lookup(filepath); -}; - -/** - * @method DataMan.FilePath.prototype.getBuffer - * @private - * @param {function} callback callback(err, buffer) - * @returns {Buffer|undefined} - * - * Passes a Buffer representing the data to a callback. - */ -DataMan.FilePath.prototype.getBuffer = function dataManFilePathGetBuffer(callback) { - var self = this; - - // Call node readFile - fs.readFile(self.filepath, Meteor.bindEnvironment(function(err, buffer) { - callback(err, buffer); - }, function(err) { - callback(err); - })); -}; - -/** - * @method DataMan.FilePath.prototype.getDataUri - * @private - * @param {function} callback callback(err, dataUri) - * - * Passes a data URI representing the data to a callback. - */ -DataMan.FilePath.prototype.getDataUri = function dataManFilePathGetDataUri(callback) { - var self = this; - - self.getBuffer(function (error, buffer) { - if (error) { - callback(error); - } else { - if (!self._type) { - callback(new Error("DataMan.getDataUri couldn't get a contentType")); - } else { - var dataUri = "data:" + self._type + ";base64," + buffer.toString("base64"); - buffer = null; - callback(null, dataUri); - } - } - }); -}; - -/** - * @method DataMan.FilePath.prototype.createReadStream - * @private - * - * Returns a read stream for the data. - */ -DataMan.FilePath.prototype.createReadStream = function dataManFilePathCreateReadStream() { - // Stream from filesystem - return fs.createReadStream(this.filepath); -}; - -/** - * @method DataMan.FilePath.prototype.size - * @param {function} callback callback(err, size) - * @private - * - * Passes the size in bytes of the data to a callback. - */ -DataMan.FilePath.prototype.size = function dataManFilePathSize(callback) { - var self = this; - - if (typeof self._size === "number") { - callback(null, self._size); - return; - } - - // We can get the size without buffering - fs.stat(self.filepath, Meteor.bindEnvironment(function (error, stats) { - if (stats && typeof stats.size === "number") { - self._size = stats.size; - callback(null, self._size); - } else { - callback(error); - } - }, function (error) { - callback(error); - })); -}; - -/** - * @method DataMan.FilePath.prototype.type - * @private - * - * Returns the type of the data. - */ -DataMan.FilePath.prototype.type = function dataManFilePathType() { - return this._type; -}; diff --git a/packages/wekan-cfs-data-man/server/data-man-readstream.js b/packages/wekan-cfs-data-man/server/data-man-readstream.js deleted file mode 100644 index fbfb20391..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-readstream.js +++ /dev/null @@ -1,80 +0,0 @@ -/* global DataMan */ - -var PassThrough = Npm.require('stream').PassThrough; - -/** - * @method DataMan.ReadStream - * @public - * @constructor - * @param {ReadStream} stream - * @param {String} type The data content (MIME) type. - */ -DataMan.ReadStream = function DataManBuffer(stream, type) { - var self = this; - - // Create a bufferable / paused new stream... - var pt = new PassThrough(); - - // Pipe provided read stream into pass-through stream - stream.pipe(pt); - - // Set pass-through stream reference - self.stream = pt; - - // Set type as provided - self._type = type; -}; - -/** - * @method DataMan.ReadStream.prototype.getBuffer - * @private - * @param {function} callback callback(err, buffer) - * @returns {undefined} - * - * Passes a Buffer representing the data to a callback. - */ -DataMan.ReadStream.prototype.getBuffer = function dataManReadStreamGetBuffer(/*callback*/) { - // TODO implement as passthrough stream? -}; - -/** - * @method DataMan.ReadStream.prototype.getDataUri - * @private - * @param {function} callback callback(err, dataUri) - * - * Passes a data URI representing the data in the stream to a callback. - */ -DataMan.ReadStream.prototype.getDataUri = function dataManReadStreamGetDataUri(/*callback*/) { - // TODO implement as passthrough stream? -}; - -/** - * @method DataMan.ReadStream.prototype.createReadStream - * @private - * - * Returns a read stream for the data. - */ -DataMan.ReadStream.prototype.createReadStream = function dataManReadStreamCreateReadStream() { - return this.stream; -}; - -/** - * @method DataMan.ReadStream.prototype.size - * @param {function} callback callback(err, size) - * @private - * - * Passes the size in bytes of the data in the stream to a callback. - */ -DataMan.ReadStream.prototype.size = function dataManReadStreamSize(callback) { - callback(0); // will determine from stream later -}; - -/** - * @method DataMan.ReadStream.prototype.type - * @private - * - * Returns the type of the data. - */ -DataMan.ReadStream.prototype.type = function dataManReadStreamType() { - return this._type; -}; diff --git a/packages/wekan-cfs-data-man/server/data-man-url.js b/packages/wekan-cfs-data-man/server/data-man-url.js deleted file mode 100644 index 08e61f46f..000000000 --- a/packages/wekan-cfs-data-man/server/data-man-url.js +++ /dev/null @@ -1,133 +0,0 @@ -var request = Npm.require("request"); - -/** - * @method DataMan.URL - * @public - * @constructor - * @param {String} url - * @param {String} type The data content (MIME) type. - */ -DataMan.URL = function DataManURL(url, type, options) { - var self = this; - options = options || {}; - - self.url = url; - self._type = type; - - // This is some code borrowed from the http package. Hopefully - // we can eventually use HTTP pkg directly instead of 'request' - // once it supports streams and buffers and such. (`request` takes - // and `auth` option, too, but not of the same form as `HTTP`.) - if (options.auth) { - if (options.auth.indexOf(':') < 0) - throw new Error('auth option should be of the form "username:password"'); - options.headers = options.headers || {}; - options.headers['Authorization'] = "Basic "+ - (new Buffer(options.auth, "ascii")).toString("base64"); - delete options.auth; - } - - self.urlOpts = options; -}; - -/** - * @method DataMan.URL.prototype.getBuffer - * @private - * @param {function} callback callback(err, buffer) - * @returns {Buffer|undefined} - * - * Passes a Buffer representing the data at the URL to a callback. - */ -DataMan.URL.prototype.getBuffer = function dataManUrlGetBuffer(callback) { - var self = this; - - request(_.extend({ - url: self.url, - method: "GET", - encoding: null, - jar: false - }, self.urlOpts), Meteor.bindEnvironment(function(err, res, body) { - if (err) { - callback(err); - } else { - self._type = res.headers['content-type']; - callback(null, body); - } - }, function(err) { - callback(err); - })); -}; - -/** - * @method DataMan.URL.prototype.getDataUri - * @private - * @param {function} callback callback(err, dataUri) - * - * Passes a data URI representing the data at the URL to a callback. - */ -DataMan.URL.prototype.getDataUri = function dataManUrlGetDataUri(callback) { - var self = this; - - self.getBuffer(function (error, buffer) { - if (error) { - callback(error); - } else { - if (!self._type) { - callback(new Error("DataMan.getDataUri couldn't get a contentType")); - } else { - var dataUri = "data:" + self._type + ";base64," + buffer.toString("base64"); - callback(null, dataUri); - } - } - }); -}; - -/** - * @method DataMan.URL.prototype.createReadStream - * @private - * - * Returns a read stream for the data. - */ -DataMan.URL.prototype.createReadStream = function dataManUrlCreateReadStream() { - var self = this; - // Stream from URL - return request(_.extend({ - url: self.url, - method: "GET" - }, self.urlOpts)); -}; - -/** - * @method DataMan.URL.prototype.size - * @param {function} callback callback(err, size) - * @private - * - * Returns the size in bytes of the data at the URL. - */ -DataMan.URL.prototype.size = function dataManUrlSize(callback) { - var self = this; - - if (typeof self._size === "number") { - callback(null, self._size); - return; - } - - self.getBuffer(function (error, buffer) { - if (error) { - callback(error); - } else { - self._size = buffer.length; - callback(null, self._size); - } - }); -}; - -/** - * @method DataMan.URL.prototype.type - * @private - * - * Returns the type of the data. - */ -DataMan.URL.prototype.type = function dataManUrlType() { - return this._type; -}; diff --git a/packages/wekan-cfs-data-man/tests/client-tests.js b/packages/wekan-cfs-data-man/tests/client-tests.js deleted file mode 100644 index 60e64d3ba..000000000 --- a/packages/wekan-cfs-data-man/tests/client-tests.js +++ /dev/null @@ -1,296 +0,0 @@ -var blobData; -var arrayBufferData; -var binaryData; -var dataUriData; -var urlData; - -// Init with Blob -Tinytest.addAsync('cfs-data - client - Init with Blob', function(test, onComplete) { - var blob = new Blob(['Hello World'], {type : 'text/plain'}); - blobData = new DataMan(blob); - test.instanceOf(blobData.blob, Blob); - test.equal(blobData.type(), "text/plain"); - onComplete(); -}); - -// Init with ArrayBuffer -Tinytest.addAsync('cfs-data - client - Init with ArrayBuffer', function(test, onComplete) { - arrayBufferData = new DataMan(str2ab('Hello World'), "text/plain"); - // Should be converted upon init to a Blob - test.instanceOf(arrayBufferData.blob, Blob); - test.equal(arrayBufferData.type(), "text/plain"); - onComplete(); -}); - -// Init with Binary -Tinytest.addAsync('cfs-data - client - Init with Binary', function(test, onComplete) { - binaryData = new DataMan(new Uint8Array(str2ab('Hello World')), "text/plain"); - // Should be converted upon init to a Blob - test.instanceOf(arrayBufferData.blob, Blob); - test.equal(binaryData.type(), "text/plain"); - onComplete(); -}); - -// Init with data URI string -Tinytest.addAsync('cfs-data - client - Init with data URI string', function(test, onComplete) { - var dataUri = 'data:text/plain;base64,SGVsbG8gV29ybGQ='; //'Hello World' - dataUriData = new DataMan(dataUri); - // Should be converted upon init to a Blob - test.instanceOf(dataUriData.blob, Blob); - test.equal(dataUriData.type(), "text/plain"); //should be extracted from data URI - onComplete(); -}); - -// Init with URL string -Tinytest.addAsync('cfs-data - client - Init with URL string', function(test, onComplete) { - urlData = new DataMan(Meteor.absoluteUrl('test'), "text/plain"); //'Hello World' - // URLs are not converted to Blobs upon init - test.equal(urlData.url, Meteor.absoluteUrl('test')); - test.equal(urlData.type(), "text/plain"); - onComplete(); -}); - -// getBlob -Tinytest.addAsync('cfs-data - client - getBlob', function(test, onComplete) { - var total = 10, done = 0; - function continueIfDone() { - done++; - if (total === done) { - onComplete(); - } - } - - function testBlob(error, blob, testType) { - test.isFalse(!!error, testType + ' got error: ' + (error && error.message)); - test.instanceOf(blob, Blob, testType + ' got no blob'); - - if (blob instanceof Blob) { - var reader = new FileReader(); - reader.addEventListener("load", function(event) { - test.equal(reader.result, 'Hello World', testType + ' got back blob with incorrect data'); - continueIfDone(); - }, false); - reader.addEventListener("error", function(err) { - test.equal(reader.error, null, testType + ' error reading blob as text'); - continueIfDone(); - }, false); - reader.readAsText(blob, 'utf-8'); - } else { - continueIfDone(); - } - } - - // from Blob - blobData.getBlob(function (error, blob) { - testBlob(error, blob, 'getBlob from Blob'); - }); - - // from Blob (no callback) - testBlob(false, blobData.getBlob(), 'getBlob from Blob'); - - // from ArrayBuffer - arrayBufferData.getBlob(function (error, blob) { - testBlob(error, blob, 'getBlob from ArrayBuffer'); - }); - - // from ArrayBuffer (no callback) - testBlob(false, arrayBufferData.getBlob(), 'getBlob from ArrayBuffer'); - - // from binary - binaryData.getBlob(function (error, blob) { - testBlob(error, blob, 'getBlob from binary'); - }); - - // from binary (no callback) - testBlob(false, binaryData.getBlob(), 'getBlob from binary'); - - // from data URI - dataUriData.getBlob(function (error, blob) { - testBlob(error, blob, 'getBlob from data URI'); - }); - - // from data URI (no callback) - testBlob(false, dataUriData.getBlob(), 'getBlob from data URI'); - - // from URL - urlData.getBlob(function (error, blob) { - testBlob(error, blob, 'getBlob from URL'); - }); - - // from URL (no callback) - test.throws(function () { - // callback is required for URLs on the client - urlData.getBlob(); - }); - continueIfDone(); - -}); - -// getBinary -Tinytest.addAsync('cfs-data - client - getBinary', function(test, onComplete) { - var total = 5, done = 0; - function continueIfDone() { - done++; - if (total === done) { - onComplete(); - } - } - - function testBinary(error, binary, testType) { - test.isFalse(!!error, testType + ' got error: ' + (error && error.message)); - test.isTrue(EJSON.isBinary(binary), testType + ' got no binary'); - - if (EJSON.isBinary(binary)) { - test.equal(bin2str(binary), 'Hello World', testType + ' got back binary with incorrect data'); - continueIfDone(); - } else { - continueIfDone(); - } - } - - // from Blob - blobData.getBinary(function (error, binary) { - testBinary(error, binary, 'getBinary from Blob'); - }); - - // from ArrayBuffer - arrayBufferData.getBinary(function (error, binary) { - testBinary(error, binary, 'getBinary from ArrayBuffer'); - }); - - // from binary - binaryData.getBinary(function (error, binary) { - testBinary(error, binary, 'getBinary from binary'); - }); - - // from data URI - dataUriData.getBinary(function (error, binary) { - testBinary(error, binary, 'getBinary from data URI'); - }); - - // from URL - urlData.getBinary(function (error, binary) { - testBinary(error, binary, 'getBinary from URL'); - }); -}); - -// getDataUri -Tinytest.addAsync('cfs-data - client - getDataUri', function(test, onComplete) { - var total = 5, done = 0; - function testURI(error, uri, testType) { - test.isFalse(!!error, testType + ' got error: ' + (error && error.message)); - test.equal(typeof uri, "string", testType + ' got no URI string'); - test.equal(uri, 'data:text/plain;base64,SGVsbG8gV29ybGQ=', testType + ' got invalid URI'); - - done++; - if (total === done) { - onComplete(); - } - } - - // from Blob - blobData.getDataUri(function (error, uri) { - testURI(error, uri, 'getDataUri from Blob'); - }); - - // from ArrayBuffer - arrayBufferData.getDataUri(function (error, uri) { - testURI(error, uri, 'getDataUri from ArrayBuffer'); - }); - - // from binary - binaryData.getDataUri(function (error, uri) { - testURI(error, uri, 'getDataUri from binary'); - }); - - // from data URI - dataUriData.getDataUri(function (error, uri) { - testURI(error, uri, 'getDataUri from data URI'); - }); - - // from URL - urlData.getDataUri(function (error, uri) { - testURI(error, uri, 'getDataUri from URL'); - }); -}); - -// size -Tinytest.addAsync('cfs-data - client - size', function(test, onComplete) { - var total = 10, done = 0; - function continueIfDone() { - done++; - if (total === done) { - onComplete(); - } - } - - function testSize(error, size, testType) { - test.isFalse(!!error, testType + ' got error: ' + (error && error.message)); - test.equal(size, 11, testType + ' got wrong size'); - continueIfDone(); - } - - // from Blob - blobData.size(function (error, size) { - testSize(error, size, 'size from Blob'); - }); - - // from Blob (no callback) - testSize(false, blobData.size(), 'size from Blob'); - - // from ArrayBuffer - arrayBufferData.size(function (error, size) { - testSize(error, size, 'size from ArrayBuffer'); - }); - - // from ArrayBuffer (no callback) - testSize(false, arrayBufferData.size(), 'size from ArrayBuffer'); - - // from binary - binaryData.size(function (error, size) { - testSize(error, size, 'size from binary'); - }); - - // from binary (no callback) - testSize(false, binaryData.size(), 'size from binary'); - - // from data URI - dataUriData.size(function (error, size) { - testSize(error, size, 'size from data URI'); - }); - - // from data URI (no callback) - testSize(false, dataUriData.size(), 'size from data URI'); - - // from URL - urlData.size(function (error, size) { - testSize(error, size, 'size from URL'); - }); - - // from URL (no callback) - test.throws(function () { - // callback is required for URLs on the client - urlData.size(); - }); - continueIfDone(); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-data-man/tests/common.js b/packages/wekan-cfs-data-man/tests/common.js deleted file mode 100644 index 34eeabc34..000000000 --- a/packages/wekan-cfs-data-man/tests/common.js +++ /dev/null @@ -1,38 +0,0 @@ -// ab2str = function ab2str(buf) { -// return String.fromCharCode(new Uint8Array(buf)); -// } - -bin2str = function bin2str(bufView) { - var length = bufView.length; - var result = ''; - for (var i = 0; i length) { - addition = length - i; - } - try { - // this fails on phantomjs due to old webkit bug; hence the try/catch - result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition)); - } catch (e) { - var dataArray = []; - for (var j = i; j < i+addition; j++) { - dataArray.push(bufView[j]); - } - result += String.fromCharCode.apply(null, dataArray); - } - } - return result; -}; - -ab2str = function ab2str(buffer) { - return bin2str(new Uint8Array(buffer)); -}; - -str2ab = function str2ab(str) { - var buf = new ArrayBuffer(str.length); - var bufView = new Uint8Array(buf); - for (var i=0, strLen=str.length; inew *fs*.File([ref])  Anywhere ### - -*This method __File__ is defined in `FS`* - -__Arguments__ - -* __ref__ *{object|[FS.File](#FS.File)|[data to attach](#data to attach)}* (Optional) - - Another FS.File instance, a filerecord, or some data to pass to attachData - - - -> ```FS.File = function(ref, createdByTransform) { ...``` [fsFile-common.js:8](fsFile-common.js#L8) - - -- - -### *fsFile*.attachData(data, [options], [callback])  Anywhere ### - -*This method __attachData__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __data__ *{[File](#File)|[Blob](#Blob)|Buffer|ArrayBuffer|Uint8Array|String}* - - The data that you want to attach to the file. - -* __options__ *{Object}* (Optional) - - Options - - * __type__ *{String}* (Optional) - - The data content (MIME) type, if known. - - * __headers__ *{String}* (Optional) - - When attaching a URL, headers to be used for the GET request (currently server only) - - * __auth__ *{String}* (Optional) - - When attaching a URL, "username:password" to be used for the GET request (currently server only) - -* __callback__ *{Function}* (Optional) - - Callback function, callback(error). On the client, a callback is required if data is a URL. - - -__Returns__ *{FS.File}* -This FS.File instance. - - - -> ```FS.File.prototype.attachData = function fsFileAttachData(data, options, callback) { ...``` [fsFile-common.js:36](fsFile-common.js#L36) - - -- - -### *fsFile*.uploadProgress()  Anywhere ### - -*This method __uploadProgress__ is defined in `prototype` of `FS.File`* - -__Returns__ *{number}* -The server confirmed upload progress - - -> ```FS.File.prototype.uploadProgress = function() { ...``` [fsFile-common.js:154](fsFile-common.js#L154) - - -- - -### *fsFile*.controlledByDeps()  Anywhere ### - -*This method __controlledByDeps__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns true if this FS.File is reactive - - -> Note: Returns true if this FS.File object was created by a FS.Collection -> and we are in a reactive computations. What does this mean? Well it should -> mean that our fileRecord is fully updated by Meteor and we are mounted on -> a collection - -> ```FS.File.prototype.controlledByDeps = function() { ...``` [fsFile-common.js:179](fsFile-common.js#L179) - - -- - -### *fsFile*.getCollection()  Anywhere ### - -*This method __getCollection__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns attached collection or undefined if not mounted - - -> ```FS.File.prototype.getCollection = function() { ...``` [fsFile-common.js:189](fsFile-common.js#L189) - - -- - -### *fsFile*.isMounted()  Anywhere ### - -*This method __isMounted__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns attached collection or undefined if not mounted - - -> ```FS.File.prototype.isMounted = FS.File.prototype.getCollection;``` [fsFile-common.js:217](fsFile-common.js#L217) - - -- - -### *fsFile*.getFileRecord()  Anywhere ### - -*This method __getFileRecord__ is defined in `prototype` of `FS.File`* - -__Returns__ *{object}* -The filerecord - - -> ```FS.File.prototype.getFileRecord = function() { ...``` [fsFile-common.js:224](fsFile-common.js#L224) - - -- - -### *fsFile*.update(modifier, [options], [callback])  Anywhere ### - -*This method __update__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __modifier__ *{[modifier](#modifier)}* -* __options__ *{object}* (Optional) -* __callback__ *{function}* (Optional) - - -Updates the fileRecord. - -> ```FS.File.prototype.update = function(modifier, options, callback) { ...``` [fsFile-common.js:255](fsFile-common.js#L255) - - -- - -### *fsFile*.remove([callback])  Anywhere ### - -*This method __remove__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __callback__ *{Function}* (Optional) - -__Returns__ *{number}* -Count - - -Remove the current file from its FS.Collection - -> ```FS.File.prototype.remove = function(callback) { ...``` [fsFile-common.js:323](fsFile-common.js#L323) - - -- - -### *fsFile*.getExtension([options])  Anywhere ### - -> __Warning!__ -> This method "FS.File.prototype.getExtension" has deprecated from the API -> Use the `extension` getter/setter method instead. - -*This method __getExtension__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{Object}* (Optional) - * __store__ *{String}* (Optional) - - Store name. Default is the original extension. - - -__Returns__ *{string}* -The extension eg.: `jpg` or if not found then an empty string '' - - -> ```FS.File.prototype.getExtension = function(options) { ...``` [fsFile-common.js:364](fsFile-common.js#L364) - - -- - -### *fsFile*.isImage([options])  Anywhere ### - -*This method __isImage__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has an image -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isImage = function(options) { ...``` [fsFile-common.js:393](fsFile-common.js#L393) - - -- - -### *fsFile*.isVideo([options])  Anywhere ### - -*This method __isVideo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has a video -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isVideo = function(options) { ...``` [fsFile-common.js:408](fsFile-common.js#L408) - - -- - -### *fsFile*.isAudio([options])  Anywhere ### - -*This method __isAudio__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has an audio -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isAudio = function(options) { ...``` [fsFile-common.js:423](fsFile-common.js#L423) - - -- - -### *fsFile*.formattedSize({Object}, {String}, {String})  Anywhere ### - -*This method __formattedSize__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __{Object}__ *{any}* - - options - -* __{String}__ *{any}* - - [options.store=none,display original file size] Which file do you want to get the size of? - -* __{String}__ *{any}* - - [options.formatString='0.00 b'] The `numeral` format string to use. - - -__Returns__ *{String}* -The file size formatted as a human readable string and reactively updated. - - -You must add the `numeral` package to your app before you can use this method. -If info is not found or a size can't be determined, it will show 0. - -> ```FS.File.prototype.formattedSize = function fsFileFormattedSize(options) { ...``` [fsFile-common.js:438](fsFile-common.js#L438) - - -- - -### *fsFile*.isUploaded()  Anywhere ### - -*This method __isUploaded__ is defined in `prototype` of `FS.File`* - -__Returns__ *{boolean}* -True if the number of uploaded bytes is equal to the file size. - - -> ```FS.File.prototype.isUploaded = function() { ...``` [fsFile-common.js:456](fsFile-common.js#L456) - - -- - -### *fsFile*.hasStored(storeName, [optimistic])  Anywhere ### - -*This method __hasStored__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{string}* - - Name of the store - -* __optimistic__ *{boolean}* (Optional, Default = false) - - In case that the file record is not found, read below - - -__Returns__ *{boolean}* -Is a version of this file stored in the given store? - - -> Note: If the file is not published to the client or simply not found: -this method cannot know for sure if it exists or not. The `optimistic` -param is the boolean value to return. Are we `optimistic` that the copy -could exist. This is the case in `FS.File.url` we are optimistic that the -copy supplied by the user exists. - -> ```FS.File.prototype.hasStored = function(storeName, optimistic) { ...``` [fsFile-common.js:478](fsFile-common.js#L478) - - -- - -### *fsFile*.getCopyInfo(storeName)  Anywhere ### - -> __Warning!__ -> This method "FS.File.prototype.getCopyInfo" has deprecated from the API -> Use individual methods with `store` option instead. - -*This method __getCopyInfo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{string}* - - Name of the store for which to get copy info. - - -__Returns__ *{Object}* -The file details, e.g., name, size, key, etc., specific to the copy saved in this store. - - -> ```FS.File.prototype.getCopyInfo = function(storeName) { ...``` [fsFile-common.js:504](fsFile-common.js#L504) - - -- - -### *fsFile*.name([value], [options])  Anywhere ### - -*This method __name__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String|null}* (Optional) - - If setting the name, specify the new name as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the name of the version of the file that was saved in this store. Default is the original file name. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file name. - - -> ```FS.File.prototype.name = function(value, options) { ...``` [fsFile-common.js:568](fsFile-common.js#L568) - - -- - -### *fsFile*.extension([value], [options])  Anywhere ### - -*This method __extension__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String|null}* (Optional) - - If setting the extension, specify the new extension (without period) as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the extension of the version of the file that was saved in this store. Default is the original file extension. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file extension or an empty string if there isn't one. - - -> ```FS.File.prototype.extension = function(value, options) { ...``` [fsFile-common.js:593](fsFile-common.js#L593) - - -- - -### *fsFile*.size([value], [options])  Anywhere ### - -*This method __size__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{Number}* (Optional) - - If setting the size, specify the new size in bytes as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the size of the version of the file that was saved in this store. Default is the original file size. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{Number|undefined}* -If setting, returns `undefined`. If getting, returns the file size. - - -> ```FS.File.prototype.size = function(value, options) { ...``` [fsFile-common.js:618](fsFile-common.js#L618) - - -- - -### *fsFile*.type([value], [options])  Anywhere ### - -*This method __type__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String}* (Optional) - - If setting the type, specify the new type as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the type of the version of the file that was saved in this store. Default is the original file type. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file type. - - -> ```FS.File.prototype.type = function(value, options) { ...``` [fsFile-common.js:643](fsFile-common.js#L643) - - -- - -### *fsFile*.updatedAt([value], [options])  Anywhere ### - -*This method __updatedAt__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String}* (Optional) - - If setting updatedAt, specify the new date as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the last updated date for the version of the file that was saved in this store. Default is the original last updated date. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file's last updated date. - - -> ```FS.File.prototype.updatedAt = function(value, options) { ...``` [fsFile-common.js:668](fsFile-common.js#L668) - - -- - -### *fsFile*.createReadStream([storeName])  Server ### - -*This method __createReadStream__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* (Optional) - -__Returns__ *{stream.Readable}* -Readable NodeJS stream - - -Returns a readable stream. Where the stream reads from depends on the FS.File instance and whether you pass a store name. - -If you pass a `storeName`, a readable stream for the file data saved in that store is returned. -If you don't pass a `storeName` and data is attached to the FS.File instance (on `data` property, which must be a DataMan instance), then a readable stream for the attached data is returned. -If you don't pass a `storeName` and there is no data attached to the FS.File instance, a readable stream for the file data currently in the temporary store (`FS.TempStore`) is returned. - - -> ```FS.File.prototype.createReadStream = function(storeName) { ...``` [fsFile-server.js:62](fsFile-server.js#L62) - - -- - -### *fsFile*.createWriteStream([storeName])  Server ### - -*This method __createWriteStream__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* (Optional) - -__Returns__ *{stream.Writeable}* -Writeable NodeJS stream - - -Returns a writeable stream. Where the stream writes to depends on whether you pass in a store name. - -If you pass a `storeName`, a writeable stream for (over)writing the file data in that store is returned. -If you don't pass a `storeName`, a writeable stream for writing to the temp store for this file is returned. - - -> ```FS.File.prototype.createWriteStream = function(storeName) { ...``` [fsFile-server.js:100](fsFile-server.js#L100) - - -- - -### *fsFile*.copy()  Server ### - -*This method __copy__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.File}* -The new FS.File instance - - -> ```FS.File.prototype.copy = function() { ...``` [fsFile-server.js:126](fsFile-server.js#L126) - - diff --git a/packages/wekan-cfs-file/fsFile-common.js b/packages/wekan-cfs-file/fsFile-common.js deleted file mode 100644 index 01bbffbe4..000000000 --- a/packages/wekan-cfs-file/fsFile-common.js +++ /dev/null @@ -1,765 +0,0 @@ -/** - * @method FS.File - * @namespace FS.File - * @public - * @constructor - * @param {object|FS.File|data to attach} [ref] Another FS.File instance, a filerecord, or some data to pass to attachData - */ -FS.File = function(ref, createdByTransform) { - var self = this; - - self.createdByTransform = !!createdByTransform; - - if (ref instanceof FS.File || isBasicObject(ref)) { - // Extend self with filerecord related data - FS.Utility.extend(self, FS.Utility.cloneFileRecord(ref, {full: true})); - } else if (ref) { - self.attachData(ref); - } -}; - -// An FS.File can emit events -FS.File.prototype = new EventEmitter(); - -/** - * @method FS.File.prototype.attachData - * @public - * @param {File|Blob|Buffer|ArrayBuffer|Uint8Array|String} data The data that you want to attach to the file. - * @param {Object} [options] Options - * @param {String} [options.type] The data content (MIME) type, if known. - * @param {String} [options.headers] When attaching a URL, headers to be used for the GET request (currently server only) - * @param {String} [options.auth] When attaching a URL, "username:password" to be used for the GET request (currently server only) - * @param {Function} [callback] Callback function, callback(error). On the client, a callback is required if data is a URL. - * @returns {FS.File} This FS.File instance. - * - */ -FS.File.prototype.attachData = function fsFileAttachData(data, options, callback) { - var self = this; - - if (!callback && typeof options === "function") { - callback = options; - options = {}; - } - options = options || {}; - - if (!data) { - throw new Error('FS.File.attachData requires a data argument with some data'); - } - - var urlOpts; - - // Set any other properties we can determine from the source data - // File - if (typeof File !== "undefined" && data instanceof File) { - self.name(data.name); - self.updatedAt(data.lastModifiedDate); - self.size(data.size); - setData(data.type); - } - // Blob - else if (typeof Blob !== "undefined" && data instanceof Blob) { - self.name(data.name); - self.updatedAt(new Date()); - self.size(data.size); - setData(data.type); - } - // URL: we need to do a HEAD request to get the type because type - // is required for filtering to work. - else if (typeof data === "string" && (data.slice(0, 5) === "http:" || data.slice(0, 6) === "https:")) { - urlOpts = FS.Utility.extend({}, options); - if (urlOpts.type) { - delete urlOpts.type; - } - - if (!callback) { - if (Meteor.isClient) { - throw new Error('FS.File.attachData requires a callback when attaching a URL on the client'); - } - var result = Meteor.call('_cfs_getUrlInfo', data, urlOpts); - FS.Utility.extend(self, {original: result}); - setData(result.type); - } else { - Meteor.call('_cfs_getUrlInfo', data, urlOpts, function (error, result) { - FS.debug && console.log("URL HEAD RESULT:", result); - if (error) { - callback(error); - } else { - var type = result.type || options.type; - if (! type) { - throw new Error('FS.File.attachData got a URL for which it could not determine the MIME type and none was provided using options.type'); - } - FS.Utility.extend(self, {original: result}); - setData(type); - } - }); - } - } - // Everything else - else { - setData(options.type); - } - - // Set the data - function setData(type) { - self.data = new DataMan(data, type, urlOpts); - - // Update the type to match what the data is - self.type(self.data.type()); - - // Update the size to match what the data is. - // It's always safe to call self.data.size() without supplying a callback - // because it requires a callback only for URLs on the client, and we - // already added size for URLs when we got the result from '_cfs_getUrlInfo' method. - if (!self.size()) { - if (callback) { - self.data.size(function (error, size) { - if (error) { - callback && callback(error); - } else { - self.size(size); - setName(); - } - }); - } else { - self.size(self.data.size()); - setName(); - } - } else { - setName(); - } - } - - function setName() { - // See if we can extract a file name from URL or filepath - if (!self.name() && typeof data === "string") { - // name from URL - if (data.slice(0, 5) === "http:" || data.slice(0, 6) === "https:") { - if (FS.Utility.getFileExtension(data).length) { - // for a URL we assume the end is a filename only if it has an extension - self.name(FS.Utility.getFileName(data)); - } - } - // name from filepath - else if (data.slice(0, 5) !== "data:") { - self.name(FS.Utility.getFileName(data)); - } - } - - callback && callback(); - } - - return self; //allow chaining -}; - -/** - * @method FS.File.prototype.uploadProgress - * @public - * @returns {number} The server confirmed upload progress - */ -FS.File.prototype.uploadProgress = function() { - var self = this; - // Make sure our file record is updated - self.getFileRecord(); - - // If fully uploaded, return 100 - if (self.uploadedAt) { - return 100; - } - // Otherwise return the confirmed progress or 0 - else { - return Math.round((self.chunkCount || 0) / (self.chunkSum || 1) * 100); - } -}; - -/** - * @method FS.File.prototype.controlledByDeps - * @public - * @returns {FS.Collection} Returns true if this FS.File is reactive - * - * > Note: Returns true if this FS.File object was created by a FS.Collection - * > and we are in a reactive computations. What does this mean? Well it should - * > mean that our fileRecord is fully updated by Meteor and we are mounted on - * > a collection - */ -FS.File.prototype.controlledByDeps = function() { - var self = this; - return self.createdByTransform && Deps.active; -}; - -/** - * @method FS.File.prototype.getCollection - * @public - * @returns {FS.Collection} Returns attached collection or undefined if not mounted - */ -FS.File.prototype.getCollection = function() { - // Get the collection reference - var self = this; - - // If we already made the link then do no more - if (self.collection) { - return self.collection; - } - - // If we don't have a collectionName then there's not much to do, the file is - // not mounted yet - if (!self.collectionName) { - // Should not throw an error here - could be common that the file is not - // yet mounted into a collection - return; - } - - // Link the collection to the file - self.collection = FS._collections[self.collectionName]; - - return self.collection; //possibly undefined, but that's desired behavior -}; - -/** - * @method FS.File.prototype.isMounted - * @public - * @returns {FS.Collection} Returns attached collection or undefined if not mounted - */ -FS.File.prototype.isMounted = FS.File.prototype.getCollection; - -/** - * @method FS.File.prototype.getFileRecord Returns the fileRecord - * @public - * @returns {object} The filerecord - */ -FS.File.prototype.getFileRecord = function() { - var self = this; - // Check if this file object fileRecord is kept updated by Meteor, if so - // return self - if (self.controlledByDeps()) { - return self; - } - // Go for manually updating the file record - if (self.isMounted()) { - FS.debug && console.log('GET FILERECORD: ' + self._id); - - // Return the fileRecord or an empty object - var fileRecord = self.collection.files.findOne({_id: self._id}) || {}; - FS.Utility.extend(self, fileRecord); - return fileRecord; - } else { - // We return an empty object, this way users can still do `getRecord().size` - // Without getting an error - return {}; - } -}; - -/** - * @method FS.File.prototype.update - * @public - * @param {modifier} modifier - * @param {object} [options] - * @param {function} [callback] - * - * Updates the fileRecord. - */ -FS.File.prototype.update = function(modifier, options, callback) { - var self = this; - - FS.debug && console.log('UPDATE: ' + JSON.stringify(modifier)); - - // Make sure we have options and callback - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - callback = callback || FS.Utility.defaultCallback; - - if (!self.isMounted()) { - callback(new Error("Cannot update a file that is not associated with a collection")); - return; - } - - // Call collection update - File record - return self.collection.files.update({_id: self._id}, modifier, options, function(err, count) { - // Update the fileRecord if it was changed and on the client - // The server-side methods will pull the fileRecord if needed - if (count > 0 && Meteor.isClient) - self.getFileRecord(); - // Call callback - callback(err, count); - }); -}; - -/** - * @method FS.File.prototype._saveChanges - * @private - * @param {String} [what] "_original" to save original info, or a store name to save info for that store, or saves everything - * - * Updates the fileRecord from values currently set on the FS.File instance. - */ -FS.File.prototype._saveChanges = function(what) { - var self = this; - - if (!self.isMounted()) { - return; - } - - FS.debug && console.log("FS.File._saveChanges:", what || "all"); - - var mod = {$set: {}}; - if (what === "_original") { - mod.$set.original = self.original; - } else if (typeof what === "string") { - var info = self.copies[what]; - if (info) { - mod.$set["copies." + what] = info; - } - } else { - mod.$set.original = self.original; - mod.$set.copies = self.copies; - } - - self.update(mod); -}; - -/** - * @method FS.File.prototype.remove - * @public - * @param {Function} [callback] - * @returns {number} Count - * - * Remove the current file from its FS.Collection - */ -FS.File.prototype.remove = function(callback) { - var self = this; - - FS.debug && console.log('REMOVE: ' + self._id); - - callback = callback || FS.Utility.defaultCallback; - - if (!self.isMounted()) { - callback(new Error("Cannot remove a file that is not associated with a collection")); - return; - } - - return self.collection.files.remove({_id: self._id}, function(err, res) { - if (!err) { - delete self._id; - delete self.collection; - delete self.collectionName; - } - callback(err, res); - }); -}; - -/** - * @method FS.File.prototype.moveTo - * @param {FS.Collection} targetCollection - * @private // Marked private until implemented - * @todo Needs to be implemented - * - * Move the file from current collection to another collection - * - * > Note: Not yet implemented - */ - -/** - * @method FS.File.prototype.getExtension Returns the lowercase file extension - * @public - * @deprecated Use the `extension` getter/setter method instead. - * @param {Object} [options] - * @param {String} [options.store] - Store name. Default is the original extension. - * @returns {string} The extension eg.: `jpg` or if not found then an empty string '' - */ -FS.File.prototype.getExtension = function(options) { - var self = this; - return self.extension(options); -}; - -function checkContentType(fsFile, storeName, startOfType) { - var type; - if (storeName && fsFile.hasStored(storeName)) { - type = fsFile.type({store: storeName}); - } else { - type = fsFile.type(); - } - if (typeof type === "string") { - return type.indexOf(startOfType) === 0; - } - return false; -} - -/** - * @method FS.File.prototype.isImage Is it an image file? - * @public - * @param {object} [options] - * @param {string} [options.store] The store we're interested in - * - * Returns true if the copy of this file in the specified store has an image - * content type. If the file object is unmounted or doesn't have a copy for - * the specified store, or if you don't specify a store, this method checks - * the content type of the original file. - */ -FS.File.prototype.isImage = function(options) { - return checkContentType(this, (options || {}).store, 'image/'); -}; - -/** - * @method FS.File.prototype.isVideo Is it a video file? - * @public - * @param {object} [options] - * @param {string} [options.store] The store we're interested in - * - * Returns true if the copy of this file in the specified store has a video - * content type. If the file object is unmounted or doesn't have a copy for - * the specified store, or if you don't specify a store, this method checks - * the content type of the original file. - */ -FS.File.prototype.isVideo = function(options) { - return checkContentType(this, (options || {}).store, 'video/'); -}; - -/** - * @method FS.File.prototype.isAudio Is it an audio file? - * @public - * @param {object} [options] - * @param {string} [options.store] The store we're interested in - * - * Returns true if the copy of this file in the specified store has an audio - * content type. If the file object is unmounted or doesn't have a copy for - * the specified store, or if you don't specify a store, this method checks - * the content type of the original file. - */ -FS.File.prototype.isAudio = function(options) { - return checkContentType(this, (options || {}).store, 'audio/'); -}; - -/** - * @method FS.File.prototype.formattedSize - * @public - * @param {Object} options - * @param {String} [options.store=none,display original file size] Which file do you want to get the size of? - * @param {String} [options.formatString='0.00 b'] The `numeral` format string to use. - * @return {String} The file size formatted as a human readable string and reactively updated. - * - * * You must add the `numeral` package to your app before you can use this method. - * * If info is not found or a size can't be determined, it will show 0. - */ -FS.File.prototype.formattedSize = function fsFileFormattedSize(options) { - var self = this; - - if (typeof numeral !== "function") - throw new Error("You must add the numeral package if you call FS.File.formattedSize"); - - options = options || {}; - options = options.hash || options; - - var size = self.size(options) || 0; - return numeral(size).format(options.formatString || '0.00 b'); -}; - -/** - * @method FS.File.prototype.isUploaded Is this file completely uploaded? - * @public - * @returns {boolean} True if the number of uploaded bytes is equal to the file size. - */ -FS.File.prototype.isUploaded = function() { - var self = this; - - // Make sure we use the updated file record - self.getFileRecord(); - - return !!self.uploadedAt; -}; - -/** - * @method FS.File.prototype.hasStored - * @public - * @param {string} storeName Name of the store - * @param {boolean} [optimistic=false] In case that the file record is not found, read below - * @returns {boolean} Is a version of this file stored in the given store? - * - * > Note: If the file is not published to the client or simply not found: - * this method cannot know for sure if it exists or not. The `optimistic` - * param is the boolean value to return. Are we `optimistic` that the copy - * could exist. This is the case in `FS.File.url` we are optimistic that the - * copy supplied by the user exists. - */ -FS.File.prototype.hasStored = function(storeName, optimistic) { - var self = this; - // Make sure we use the updated file record - self.getFileRecord(); - // If we havent the published data then - if (FS.Utility.isEmpty(self.copies)) { - return !!optimistic; - } - if (typeof storeName === "string") { - // Return true only if the `key` property is present, which is not set until - // storage is complete. - return !!(self.copies && self.copies[storeName] && self.copies[storeName].key); - } - return false; -}; - -// Backwards compatibility -FS.File.prototype.hasCopy = FS.File.prototype.hasStored; - -/** - * @method FS.File.prototype.getCopyInfo - * @public - * @deprecated Use individual methods with `store` option instead. - * @param {string} storeName Name of the store for which to get copy info. - * @returns {Object} The file details, e.g., name, size, key, etc., specific to the copy saved in this store. - */ -FS.File.prototype.getCopyInfo = function(storeName) { - var self = this; - // Make sure we use the updated file record - self.getFileRecord(); - return (self.copies && self.copies[storeName]) || null; -}; - -/** - * @method FS.File.prototype._getInfo - * @private - * @param {String} [storeName] Name of the store for which to get file info. Omit for original file details. - * @param {Object} [options] - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? - * @returns {Object} The file details, e.g., name, size, key, etc. If not found, returns an empty object. - */ -FS.File.prototype._getInfo = function(storeName, options) { - var self = this; - options = options || {}; - - if (options.updateFileRecordFirst) { - // Make sure we use the updated file record - self.getFileRecord(); - } - - if (storeName) { - return (self.copies && self.copies[storeName]) || {}; - } else { - return self.original || {}; - } -}; - -/** - * @method FS.File.prototype._setInfo - * @private - * @param {String} storeName - Name of the store for which to set file info. Non-string will set original file details. - * @param {String} property - Property to set - * @param {String} value - New value for property - * @param {Boolean} save - Should the new value be saved to the DB, too, or just set in the FS.File properties? - * @returns {undefined} - */ -FS.File.prototype._setInfo = function(storeName, property, value, save) { - var self = this; - if (typeof storeName === "string") { - self.copies = self.copies || {}; - self.copies[storeName] = self.copies[storeName] || {}; - self.copies[storeName][property] = value; - save && self._saveChanges(storeName); - } else { - self.original = self.original || {}; - self.original[property] = value; - save && self._saveChanges("_original"); - } -}; - -/** - * @method FS.File.prototype.name - * @public - * @param {String|null} [value] - If setting the name, specify the new name as the first argument. Otherwise the options argument should be first. - * @param {Object} [options] - * @param {Object} [options.store=none,original] - Get or set the name of the version of the file that was saved in this store. Default is the original file name. - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? Applies to getter usage only. - * @param {Boolean} [options.save=true] Save change to database? Applies to setter usage only. - * @returns {String|undefined} If setting, returns `undefined`. If getting, returns the file name. - */ -FS.File.prototype.name = function(value, options) { - var self = this; - - if (!options && ((typeof value === "object" && value !== null) || typeof value === "undefined")) { - // GET - options = value || {}; - options = options.hash || options; // allow use as UI helper - return self._getInfo(options.store, options).name; - } else { - // SET - options = options || {}; - return self._setInfo(options.store, 'name', value, typeof options.save === "boolean" ? options.save : true); - } -}; - -/** - * @method FS.File.prototype.extension - * @public - * @param {String|null} [value] - If setting the extension, specify the new extension (without period) as the first argument. Otherwise the options argument should be first. - * @param {Object} [options] - * @param {Object} [options.store=none,original] - Get or set the extension of the version of the file that was saved in this store. Default is the original file extension. - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? Applies to getter usage only. - * @param {Boolean} [options.save=true] Save change to database? Applies to setter usage only. - * @returns {String|undefined} If setting, returns `undefined`. If getting, returns the file extension or an empty string if there isn't one. - */ -FS.File.prototype.extension = function(value, options) { - var self = this; - - if (!options && ((typeof value === "object" && value !== null) || typeof value === "undefined")) { - // GET - options = value || {}; - return FS.Utility.getFileExtension(self.name(options) || ''); - } else { - // SET - options = options || {}; - var newName = FS.Utility.setFileExtension(self.name(options) || '', value); - return self._setInfo(options.store, 'name', newName, typeof options.save === "boolean" ? options.save : true); - } -}; - -/** - * @method FS.File.prototype.size - * @public - * @param {Number} [value] - If setting the size, specify the new size in bytes as the first argument. Otherwise the options argument should be first. - * @param {Object} [options] - * @param {Object} [options.store=none,original] - Get or set the size of the version of the file that was saved in this store. Default is the original file size. - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? Applies to getter usage only. - * @param {Boolean} [options.save=true] Save change to database? Applies to setter usage only. - * @returns {Number|undefined} If setting, returns `undefined`. If getting, returns the file size. - */ -FS.File.prototype.size = function(value, options) { - var self = this; - - if (!options && ((typeof value === "object" && value !== null) || typeof value === "undefined")) { - // GET - options = value || {}; - options = options.hash || options; // allow use as UI helper - return self._getInfo(options.store, options).size; - } else { - // SET - options = options || {}; - return self._setInfo(options.store, 'size', value, typeof options.save === "boolean" ? options.save : true); - } -}; - -/** - * @method FS.File.prototype.type - * @public - * @param {String} [value] - If setting the type, specify the new type as the first argument. Otherwise the options argument should be first. - * @param {Object} [options] - * @param {Object} [options.store=none,original] - Get or set the type of the version of the file that was saved in this store. Default is the original file type. - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? Applies to getter usage only. - * @param {Boolean} [options.save=true] Save change to database? Applies to setter usage only. - * @returns {String|undefined} If setting, returns `undefined`. If getting, returns the file type. - */ -FS.File.prototype.type = function(value, options) { - var self = this; - - if (!options && ((typeof value === "object" && value !== null) || typeof value === "undefined")) { - // GET - options = value || {}; - options = options.hash || options; // allow use as UI helper - return self._getInfo(options.store, options).type; - } else { - // SET - options = options || {}; - return self._setInfo(options.store, 'type', value, typeof options.save === "boolean" ? options.save : true); - } -}; - -/** - * @method FS.File.prototype.updatedAt - * @public - * @param {String} [value] - If setting updatedAt, specify the new date as the first argument. Otherwise the options argument should be first. - * @param {Object} [options] - * @param {Object} [options.store=none,original] - Get or set the last updated date for the version of the file that was saved in this store. Default is the original last updated date. - * @param {Boolean} [options.updateFileRecordFirst=false] Update this instance with data from the DB first? Applies to getter usage only. - * @param {Boolean} [options.save=true] Save change to database? Applies to setter usage only. - * @returns {String|undefined} If setting, returns `undefined`. If getting, returns the file's last updated date. - */ -FS.File.prototype.updatedAt = function(value, options) { - var self = this; - - if (!options && ((typeof value === "object" && value !== null && !(value instanceof Date)) || typeof value === "undefined")) { - // GET - options = value || {}; - options = options.hash || options; // allow use as UI helper - return self._getInfo(options.store, options).updatedAt; - } else { - // SET - options = options || {}; - return self._setInfo(options.store, 'updatedAt', value, typeof options.save === "boolean" ? options.save : true); - } -}; - -/** - * @method FS.File.onStoredCallback - * @summary Calls callback when the file is fully stored to the specify storeName - * @public - * @param {String} [storeName] - The name of the file store we want to get called when stored. - * @param {function} [callback] - */ -FS.File.prototype.onStoredCallback = function (storeName, callback) { - // Check file is not already stored - if (this.hasStored(storeName)) { - callback(); - return; - } - if (Meteor.isServer) { - // Listen to file stored events - // TODO Require thinking whether it is better to use observer for case of using multiple application instances, Ask for same image url while upload is being done. - this.on('stored', function (newStoreName) { - // If stored is completed to the specified store call callback - if (storeName === newStoreName) { - // Remove the specified file stored listener - this.removeListener('stored', arguments.callee); - callback(); - } - }.bind(this) - ); - } else { - var fileId = this._id, - collectionName = this.collectionName; - // Wait for file to be fully uploaded - Tracker.autorun(function (c) { - Meteor.call('_cfs_returnWhenStored', collectionName, fileId, storeName, function (error, result) { - if (result && result === true) { - c.stop(); - callback(); - } else { - Meteor.setTimeout(function () { - c.invalidate(); - }, 100); - } - }); - }); - } -}; - -/** - * @method FS.File.onStored - * @summary Function that returns when the file is fully stored to the specify storeName - * @public - * @param {String} storeName - The name of the file store we want to get called when stored. - * - * Function that returns when the file is fully stored to the specify storeName. - * - * For example needed if wanted to save the direct link to a file on s3 when fully uploaded. - */ -FS.File.prototype.onStored = function (arguments) { - var onStoredSync = Meteor.wrapAsync(this.onStoredCallback); - return onStoredSync.call(this, arguments); -}; - -function isBasicObject(obj) { - return (obj === Object(obj) && Object.getPrototypeOf(obj) === Object.prototype); -} - -// getPrototypeOf polyfill -if (typeof Object.getPrototypeOf !== "function") { - if (typeof "".__proto__ === "object") { - Object.getPrototypeOf = function(object) { - return object.__proto__; - }; - } else { - Object.getPrototypeOf = function(object) { - // May break if the constructor has been tampered with - return object.constructor.prototype; - }; - } -} - - diff --git a/packages/wekan-cfs-file/fsFile-server.js b/packages/wekan-cfs-file/fsFile-server.js deleted file mode 100644 index d502d0295..000000000 --- a/packages/wekan-cfs-file/fsFile-server.js +++ /dev/null @@ -1,361 +0,0 @@ -/** - * Notes a details about a storage adapter failure within the file record - * @param {string} storeName - * @param {number} maxTries - * @return {undefined} - * @todo deprecate this - */ -FS.File.prototype.logCopyFailure = function(storeName, maxTries) { - var self = this; - - // hasStored will update from the fileRecord - if (self.hasStored(storeName)) { - throw new Error("logCopyFailure: invalid storeName"); - } - - // Make sure we have a temporary file saved since we will be - // trying the save again. - FS.TempStore.ensureForFile(self); - - var now = new Date(); - var currentCount = (self.failures && self.failures.copies && self.failures.copies[storeName] && typeof self.failures.copies[storeName].count === "number") ? self.failures.copies[storeName].count : 0; - maxTries = maxTries || 5; - - var modifier = {}; - modifier.$set = {}; - modifier.$set['failures.copies.' + storeName + '.lastAttempt'] = now; - if (currentCount === 0) { - modifier.$set['failures.copies.' + storeName + '.firstAttempt'] = now; - } - modifier.$set['failures.copies.' + storeName + '.count'] = currentCount + 1; - modifier.$set['failures.copies.' + storeName + '.doneTrying'] = (currentCount + 1 >= maxTries); - self.update(modifier); -}; - -/** - * Has this store permanently failed? - * @param {String} storeName The name of the store - * @return {boolean} Has this store failed permanently? - * @todo deprecate this - */ -FS.File.prototype.failedPermanently = function(storeName) { - var self = this; - return !!(self.failures && - self.failures.copies && - self.failures.copies[storeName] && - self.failures.copies[storeName].doneTrying); -}; - -/** - * @method FS.File.prototype.createReadStream - * @public - * @param {String} [storeName] - * @returns {stream.Readable} Readable NodeJS stream - * - * Returns a readable stream. Where the stream reads from depends on the FS.File instance and whether you pass a store name. - * - * * If you pass a `storeName`, a readable stream for the file data saved in that store is returned. - * * If you don't pass a `storeName` and data is attached to the FS.File instance (on `data` property, which must be a DataMan instance), then a readable stream for the attached data is returned. - * * If you don't pass a `storeName` and there is no data attached to the FS.File instance, a readable stream for the file data currently in the temporary store (`FS.TempStore`) is returned. - * - */ -FS.File.prototype.createReadStream = function(storeName) { - var self = this; - - // If we dont have a store name but got Buffer data? - if (!storeName && self.data) { - FS.debug && console.log("fileObj.createReadStream creating read stream for attached data"); - // Stream from attached data if present - return self.data.createReadStream(); - } else if (!storeName && FS.TempStore && FS.TempStore.exists(self)) { - FS.debug && console.log("fileObj.createReadStream creating read stream for temp store"); - // Stream from temp store - its a bit slower than regular streams? - return FS.TempStore.createReadStream(self); - } else { - // Stream from the store using storage adapter - if (self.isMounted()) { - var storage = self.collection.storesLookup[storeName] || self.collection.primaryStore; - FS.debug && console.log("fileObj.createReadStream creating read stream for store", storage.name); - // return stream - return storage.adapter.createReadStream(self); - } else { - throw new Meteor.Error('File not mounted'); - } - - } -}; - -/** - * @method FS.File.prototype.createWriteStream - * @public - * @param {String} [storeName] - * @returns {stream.Writeable} Writeable NodeJS stream - * - * Returns a writeable stream. Where the stream writes to depends on whether you pass in a store name. - * - * * If you pass a `storeName`, a writeable stream for (over)writing the file data in that store is returned. - * * If you don't pass a `storeName`, a writeable stream for writing to the temp store for this file is returned. - * - */ -FS.File.prototype.createWriteStream = function(storeName) { - var self = this; - - // We have to have a mounted file in order for this to work - if (self.isMounted()) { - if (!storeName && FS.TempStore && FS.FileWorker) { - // If we have worker installed - we pass the file to FS.TempStore - // We dont need the storeName since all stores will be generated from - // TempStore. - // This should trigger FS.FileWorker at some point? - FS.TempStore.createWriteStream(self); - } else { - // Stream directly to the store using storage adapter - var storage = self.collection.storesLookup[storeName] || self.collection.primaryStore; - return storage.adapter.createWriteStream(self); - } - } else { - throw new Meteor.Error('File not mounted'); - } -}; - -/** - * @method FS.File.prototype.copy Makes a copy of the file and underlying data in all stores. - * @public - * @returns {FS.File} The new FS.File instance - */ -FS.File.prototype.copy = function() { - var self = this; - - if (!self.isMounted()) { - throw new Error("Cannot copy a file that is not associated with a collection"); - } - - // Get the file record - var fileRecord = self.collection.files.findOne({_id: self._id}, {transform: null}) || {}; - - // Remove _id and copy keys from the file record - delete fileRecord._id; - - // Insert directly; we don't have access to "original" in this case - var newId = self.collection.files.insert(fileRecord); - - var newFile = self.collection.findOne(newId); - - // Copy underlying files in the stores - var mod, oldKey; - for (var name in newFile.copies) { - if (newFile.copies.hasOwnProperty(name)) { - oldKey = newFile.copies[name].key; - if (oldKey) { - // We need to ask the adapter for the true oldKey because - // right now gridfs does some extra stuff. - // TODO GridFS should probably set the full key object - // (with _id and filename) into `copies.key` - // so that copies.key can be passed directly to - // createReadStreamForFileKey - var sourceFileStorage = self.collection.storesLookup[name]; - if (!sourceFileStorage) { - throw new Error(name + " is not a valid store name"); - } - oldKey = sourceFileStorage.adapter.fileKey(self); - // delete so that new fileKey will be generated in copyStoreData - delete newFile.copies[name].key; - mod = mod || {}; - mod["copies." + name + ".key"] = copyStoreData(newFile, name, oldKey); - } - } - } - // Update keys in the filerecord - if (mod) { - newFile.update({$set: mod}); - } - - return newFile; -}; - -Meteor.methods({ - // Does a HEAD request to URL to get the type, updatedAt, - // and size prior to actually downloading the data. - // That way we can do filter checks without actually downloading. - '_cfs_getUrlInfo': function (url, options) { - check(url, String); - check(options, Object); - - this.unblock(); - - var response = HTTP.call("HEAD", url, options); - var headers = response.headers; - var result = {}; - - if (headers['content-type']) { - result.type = headers['content-type']; - } - - if (headers['content-length']) { - result.size = +headers['content-length']; - } - - if (headers['last-modified']) { - result.updatedAt = new Date(headers['last-modified']); - } - - return result; - }, - // Helper function that checks whether given fileId from collectionName - // Is fully uploaded to specify storeName. - '_cfs_returnWhenStored' : function (collectionName, fileId, storeName) { - check(collectionName, String); - check(fileId, String); - check(storeName, String); - - var collection = FS._collections[collectionName]; - if (!collection) { - return Meteor.Error('_cfs_returnWhenStored: FSCollection name not exists'); - } - - var file = collection.findOne({_id: fileId}); - if (!file) { - return Meteor.Error('_cfs_returnWhenStored: FSFile not exists'); - } - return file.hasStored(storeName); - } -}); - -// TODO maybe this should be in cfs-storage-adapter -function _copyStoreData(fileObj, storeName, sourceKey, callback) { - if (!fileObj.isMounted()) { - throw new Error("Cannot copy store data for a file that is not associated with a collection"); - } - - var storage = fileObj.collection.storesLookup[storeName]; - if (!storage) { - throw new Error(storeName + " is not a valid store name"); - } - - // We want to prevent beforeWrite and transformWrite from running, so - // we interact directly with the store. - var destinationKey = storage.adapter.fileKey(fileObj); - var readStream = storage.adapter.createReadStreamForFileKey(sourceKey); - var writeStream = storage.adapter.createWriteStreamForFileKey(destinationKey); - - writeStream.once('stored', function(result) { - callback(null, result.fileKey); - }); - - writeStream.once('error', function(error) { - callback(error); - }); - - readStream.pipe(writeStream); -} -var copyStoreData = Meteor.wrapAsync(_copyStoreData); - -/** - * @method FS.File.prototype.copyData Copies the content of a store directly into another store. - * @public - * @param {string} sourceStoreName - * @param {string} targetStoreName - * @param {boolean=} move - */ -FS.File.prototype.copyData = function(sourceStoreName, targetStoreName, move){ - - move = !!move; - /** - * @type {Object.} - */ - var sourceStoreValues = this.copies[sourceStoreName]; - /** - * @type {string} - */ - var copyKey = cloneDataToStore(this, sourceStoreName, targetStoreName, move); - /** - * @type {Object.} - */ - var targetStoreValues = {}; - for (var v in sourceStoreValues) { - if (sourceStoreValues.hasOwnProperty(v)) { - targetStoreValues[v] = sourceStoreValues[v] - } - } - targetStoreValues.key = copyKey; - targetStoreValues.createdAt = new Date(); - targetStoreValues.updatedAt = new Date(); - /** - * - * @type {modifier} - */ - var modifier = {}; - modifier.$set = {}; - modifier.$set["copies."+targetStoreName] = targetStoreValues; - if(move){ - modifier.$unset = {}; - modifier.$unset["copies."+sourceStoreName] = ""; - } - this.update(modifier); -}; -/** - * @method FS.File.prototype.moveData Moves the content of a store directly into another store. - * @public - * @param {string} sourceStoreName - * @param {string} targetStoreName - */ -FS.File.prototype.moveData = function(sourceStoreName, targetStoreName){ - this.copyData(sourceStoreName, targetStoreName, true); -}; -// TODO maybe this should be in cfs-storage-adapter -/** - * - * @param {FS.File} fileObj - * @param {string} sourceStoreName - * @param {string} targetStoreName - * @param {boolean} move - * @param callback - * @private - */ -function _copyDataFromStoreToStore(fileObj, sourceStoreName, targetStoreName, move, callback) { - if (!fileObj.isMounted()) { - throw new Error("Cannot copy store data for a file that is not associated with a collection"); - } - /** - * @type {FS.StorageAdapter} - */ - var sourceStorage = fileObj.collection.storesLookup[sourceStoreName]; - /** - * @type {FS.StorageAdapter} - */ - var targetStorage = fileObj.collection.storesLookup[targetStoreName]; - - if (!sourceStorage) { - throw new Error(sourceStoreName + " is not a valid store name"); - } - if (!targetStorage) { - throw new Error(targetStorage + " is not a valid store name"); - } - - // We want to prevent beforeWrite and transformWrite from running, so - // we interact directly with the store. - var sourceKey = sourceStorage.adapter.fileKey(fileObj); - var targetKey = targetStorage.adapter.fileKey(fileObj); - var readStream = sourceStorage.adapter.createReadStreamForFileKey(sourceKey); - var writeStream = targetStorage.adapter.createWriteStreamForFileKey(targetKey); - - - writeStream.safeOnce('stored', function(result) { - if(move && sourceStorage.adapter.remove(fileObj)===false){ - callback("Copied to store:" + targetStoreName - + " with fileKey: " - + result.fileKey - + ", but could not delete from source store: " - + sourceStoreName); - }else{ - callback(null, result.fileKey); - } - }); - - writeStream.once('error', function(error) { - callback(error); - }); - - readStream.pipe(writeStream); -} -var cloneDataToStore = Meteor.wrapAsync(_copyDataFromStoreToStore); diff --git a/packages/wekan-cfs-file/internal.api.md b/packages/wekan-cfs-file/internal.api.md deleted file mode 100644 index 362c9a622..000000000 --- a/packages/wekan-cfs-file/internal.api.md +++ /dev/null @@ -1,749 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["fsFile-common.js"](fsFile-common.js) Where: {client|server}__ - -*** - -### new *fs*.File([ref])  Anywhere ### - -*This method __File__ is defined in `FS`* - -__Arguments__ - -* __ref__ *{object|[FS.File](#FS.File)|[data to attach](#data to attach)}* (Optional) - - Another FS.File instance, a filerecord, or some data to pass to attachData - - - -> ```FS.File = function(ref, createdByTransform) { ...``` [fsFile-common.js:8](fsFile-common.js#L8) - - -- - -### *fsFile*.attachData(data, [options], [callback])  Anywhere ### - -*This method __attachData__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __data__ *{[File](#File)|[Blob](#Blob)|Buffer|ArrayBuffer|Uint8Array|String}* - - The data that you want to attach to the file. - -* __options__ *{Object}* (Optional) - - Options - - * __type__ *{String}* (Optional) - - The data content (MIME) type, if known. - - * __headers__ *{String}* (Optional) - - When attaching a URL, headers to be used for the GET request (currently server only) - - * __auth__ *{String}* (Optional) - - When attaching a URL, "username:password" to be used for the GET request (currently server only) - -* __callback__ *{Function}* (Optional) - - Callback function, callback(error). On the client, a callback is required if data is a URL. - - -__Returns__ *{FS.File}* -This FS.File instance. - - - -> ```FS.File.prototype.attachData = function fsFileAttachData(data, options, callback) { ...``` [fsFile-common.js:36](fsFile-common.js#L36) - - -- - -### *fsFile*.uploadProgress()  Anywhere ### - -*This method __uploadProgress__ is defined in `prototype` of `FS.File`* - -__Returns__ *{number}* -The server confirmed upload progress - - -> ```FS.File.prototype.uploadProgress = function() { ...``` [fsFile-common.js:154](fsFile-common.js#L154) - - -- - -### *fsFile*.controlledByDeps()  Anywhere ### - -*This method __controlledByDeps__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns true if this FS.File is reactive - - -> Note: Returns true if this FS.File object was created by a FS.Collection -> and we are in a reactive computations. What does this mean? Well it should -> mean that our fileRecord is fully updated by Meteor and we are mounted on -> a collection - -> ```FS.File.prototype.controlledByDeps = function() { ...``` [fsFile-common.js:179](fsFile-common.js#L179) - - -- - -### *fsFile*.getCollection()  Anywhere ### - -*This method __getCollection__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns attached collection or undefined if not mounted - - -> ```FS.File.prototype.getCollection = function() { ...``` [fsFile-common.js:189](fsFile-common.js#L189) - - -- - -### *fsFile*.isMounted()  Anywhere ### - -*This method __isMounted__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.Collection}* -Returns attached collection or undefined if not mounted - - -> ```FS.File.prototype.isMounted = FS.File.prototype.getCollection;``` [fsFile-common.js:217](fsFile-common.js#L217) - - -- - -### *fsFile*.getFileRecord()  Anywhere ### - -*This method __getFileRecord__ is defined in `prototype` of `FS.File`* - -__Returns__ *{object}* -The filerecord - - -> ```FS.File.prototype.getFileRecord = function() { ...``` [fsFile-common.js:224](fsFile-common.js#L224) - - -- - -### *fsFile*.update(modifier, [options], [callback])  Anywhere ### - -*This method __update__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __modifier__ *{[modifier](#modifier)}* -* __options__ *{object}* (Optional) -* __callback__ *{function}* (Optional) - - -Updates the fileRecord. - -> ```FS.File.prototype.update = function(modifier, options, callback) { ...``` [fsFile-common.js:255](fsFile-common.js#L255) - - -- - -### *fsFile*._saveChanges([what])  Anywhere ### - -*This method is private* -*This method ___saveChanges__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __what__ *{String}* (Optional) - - "_original" to save original info, or a store name to save info for that store, or saves everything - - - -Updates the fileRecord from values currently set on the FS.File instance. - -> ```FS.File.prototype._saveChanges = function(what) { ...``` [fsFile-common.js:290](fsFile-common.js#L290) - - -- - -### *fsFile*.remove([callback])  Anywhere ### - -*This method __remove__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __callback__ *{Function}* (Optional) - -__Returns__ *{number}* -Count - - -Remove the current file from its FS.Collection - -> ```FS.File.prototype.remove = function(callback) { ...``` [fsFile-common.js:323](fsFile-common.js#L323) - - -- - -### *fsFile*.moveTo(targetCollection)  Anywhere ### - -*This method is private* -*This method __moveTo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __targetCollection__ *{[FS.Collection](#FS.Collection)}* - -__TODO__ -``` -* Needs to be implemented -``` - - -Move the file from current collection to another collection - -> Note: Not yet implemented - -> ```FS.File.prototype.getExtension = function(options) { ...``` [fsFile-common.js:364](fsFile-common.js#L364) - - -- - -### *fsFile*.getExtension([options])  Anywhere ### - -> __Warning!__ -> This method "FS.File.prototype.getExtension" has deprecated from the API -> Use the `extension` getter/setter method instead. - -*This method __getExtension__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{Object}* (Optional) - * __store__ *{String}* (Optional) - - Store name. Default is the original extension. - - -__Returns__ *{string}* -The extension eg.: `jpg` or if not found then an empty string '' - - -> ```FS.File.prototype.getExtension = function(options) { ...``` [fsFile-common.js:364](fsFile-common.js#L364) - - -- - -### *fsFile*.isImage([options])  Anywhere ### - -*This method __isImage__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has an image -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isImage = function(options) { ...``` [fsFile-common.js:393](fsFile-common.js#L393) - - -- - -### *fsFile*.isVideo([options])  Anywhere ### - -*This method __isVideo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has a video -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isVideo = function(options) { ...``` [fsFile-common.js:408](fsFile-common.js#L408) - - -- - -### *fsFile*.isAudio([options])  Anywhere ### - -*This method __isAudio__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __options__ *{object}* (Optional) - * __store__ *{string}* (Optional) - - The store we're interested in - - - -Returns true if the copy of this file in the specified store has an audio -content type. If the file object is unmounted or doesn't have a copy for -the specified store, or if you don't specify a store, this method checks -the content type of the original file. - -> ```FS.File.prototype.isAudio = function(options) { ...``` [fsFile-common.js:423](fsFile-common.js#L423) - - -- - -### *fsFile*.formattedSize({Object}, {String}, {String})  Anywhere ### - -*This method __formattedSize__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __{Object}__ *{any}* - - options - -* __{String}__ *{any}* - - [options.store=none,display original file size] Which file do you want to get the size of? - -* __{String}__ *{any}* - - [options.formatString='0.00 b'] The `numeral` format string to use. - - -__Returns__ *{String}* -The file size formatted as a human readable string and reactively updated. - - -You must add the `numeral` package to your app before you can use this method. -If info is not found or a size can't be determined, it will show 0. - -> ```FS.File.prototype.formattedSize = function fsFileFormattedSize(options) { ...``` [fsFile-common.js:438](fsFile-common.js#L438) - - -- - -### *fsFile*.isUploaded()  Anywhere ### - -*This method __isUploaded__ is defined in `prototype` of `FS.File`* - -__Returns__ *{boolean}* -True if the number of uploaded bytes is equal to the file size. - - -> ```FS.File.prototype.isUploaded = function() { ...``` [fsFile-common.js:456](fsFile-common.js#L456) - - -- - -### *fsFile*.hasStored(storeName, [optimistic])  Anywhere ### - -*This method __hasStored__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{string}* - - Name of the store - -* __optimistic__ *{boolean}* (Optional, Default = false) - - In case that the file record is not found, read below - - -__Returns__ *{boolean}* -Is a version of this file stored in the given store? - - -> Note: If the file is not published to the client or simply not found: -this method cannot know for sure if it exists or not. The `optimistic` -param is the boolean value to return. Are we `optimistic` that the copy -could exist. This is the case in `FS.File.url` we are optimistic that the -copy supplied by the user exists. - -> ```FS.File.prototype.hasStored = function(storeName, optimistic) { ...``` [fsFile-common.js:478](fsFile-common.js#L478) - - -- - -### *fsFile*.getCopyInfo(storeName)  Anywhere ### - -> __Warning!__ -> This method "FS.File.prototype.getCopyInfo" has deprecated from the API -> Use individual methods with `store` option instead. - -*This method __getCopyInfo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{string}* - - Name of the store for which to get copy info. - - -__Returns__ *{Object}* -The file details, e.g., name, size, key, etc., specific to the copy saved in this store. - - -> ```FS.File.prototype.getCopyInfo = function(storeName) { ...``` [fsFile-common.js:504](fsFile-common.js#L504) - - -- - -### *fsFile*._getInfo([storeName], [options])  Anywhere ### - -*This method is private* -*This method ___getInfo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* (Optional) - - Name of the store for which to get file info. Omit for original file details. - -* __options__ *{Object}* (Optional) - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? - - -__Returns__ *{Object}* -The file details, e.g., name, size, key, etc. If not found, returns an empty object. - - -> ```FS.File.prototype._getInfo = function(storeName, options) { ...``` [fsFile-common.js:519](fsFile-common.js#L519) - - -- - -### *fsFile*._setInfo(storeName, property, value, save)  Anywhere ### - -*This method is private* -*This method ___setInfo__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* - - Name of the store for which to set file info. Non-string will set original file details. - -* __property__ *{String}* - - Property to set - -* __value__ *{String}* - - New value for property - -* __save__ *{Boolean}* - - Should the new value be saved to the DB, too, or just set in the FS.File properties? - - -__Returns__ *{undefined}* - - -> ```FS.File.prototype._setInfo = function(storeName, property, value, save) { ...``` [fsFile-common.js:544](fsFile-common.js#L544) - - -- - -### *fsFile*.name([value], [options])  Anywhere ### - -*This method __name__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String|null}* (Optional) - - If setting the name, specify the new name as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the name of the version of the file that was saved in this store. Default is the original file name. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file name. - - -> ```FS.File.prototype.name = function(value, options) { ...``` [fsFile-common.js:568](fsFile-common.js#L568) - - -- - -### *fsFile*.extension([value], [options])  Anywhere ### - -*This method __extension__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String|null}* (Optional) - - If setting the extension, specify the new extension (without period) as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the extension of the version of the file that was saved in this store. Default is the original file extension. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file extension or an empty string if there isn't one. - - -> ```FS.File.prototype.extension = function(value, options) { ...``` [fsFile-common.js:593](fsFile-common.js#L593) - - -- - -### *fsFile*.size([value], [options])  Anywhere ### - -*This method __size__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{Number}* (Optional) - - If setting the size, specify the new size in bytes as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the size of the version of the file that was saved in this store. Default is the original file size. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{Number|undefined}* -If setting, returns `undefined`. If getting, returns the file size. - - -> ```FS.File.prototype.size = function(value, options) { ...``` [fsFile-common.js:618](fsFile-common.js#L618) - - -- - -### *fsFile*.type([value], [options])  Anywhere ### - -*This method __type__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String}* (Optional) - - If setting the type, specify the new type as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the type of the version of the file that was saved in this store. Default is the original file type. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file type. - - -> ```FS.File.prototype.type = function(value, options) { ...``` [fsFile-common.js:643](fsFile-common.js#L643) - - -- - -### *fsFile*.updatedAt([value], [options])  Anywhere ### - -*This method __updatedAt__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __value__ *{String}* (Optional) - - If setting updatedAt, specify the new date as the first argument. Otherwise the options argument should be first. - -* __options__ *{Object}* (Optional) - * __store__ *{Object}* (Optional, Default = none,original) - - Get or set the last updated date for the version of the file that was saved in this store. Default is the original last updated date. - - * __updateFileRecordFirst__ *{Boolean}* (Optional, Default = false) - - Update this instance with data from the DB first? Applies to getter usage only. - - * __save__ *{Boolean}* (Optional, Default = true) - - Save change to database? Applies to setter usage only. - - -__Returns__ *{String|undefined}* -If setting, returns `undefined`. If getting, returns the file's last updated date. - - -> ```FS.File.prototype.updatedAt = function(value, options) { ...``` [fsFile-common.js:668](fsFile-common.js#L668) - - -*** - -__File: ["fsFile-server.js"](fsFile-server.js) Where: {server}__ - -*** - -### *fsFile*.logCopyFailure(storeName, maxTries)  Server ### - -``` -Notes a details about a storage adapter failure within the file record -``` -*This method __logCopyFailure__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{string}* -* __maxTries__ *{number}* - -__Returns__ *{undefined}* - -__TODO__ -``` -* deprecate this -``` - - -> ```FS.File.prototype.logCopyFailure = function(storeName, maxTries) { ...``` [fsFile-server.js:8](fsFile-server.js#L8) - - -- - -### *fsFile*.failedPermanently(storeName)  Server ### - -``` -Has this store permanently failed? -``` -*This method __failedPermanently__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* - - The name of the store - - -__Returns__ *{boolean}* -Has this store failed permanently? - -__TODO__ -``` -* deprecate this -``` - - -> ```FS.File.prototype.failedPermanently = function(storeName) { ...``` [fsFile-server.js:41](fsFile-server.js#L41) - - -- - -### *fsFile*.createReadStream([storeName])  Server ### - -*This method __createReadStream__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* (Optional) - -__Returns__ *{stream.Readable}* -Readable NodeJS stream - - -Returns a readable stream. Where the stream reads from depends on the FS.File instance and whether you pass a store name. - -If you pass a `storeName`, a readable stream for the file data saved in that store is returned. -If you don't pass a `storeName` and data is attached to the FS.File instance (on `data` property, which must be a DataMan instance), then a readable stream for the attached data is returned. -If you don't pass a `storeName` and there is no data attached to the FS.File instance, a readable stream for the file data currently in the temporary store (`FS.TempStore`) is returned. - - -> ```FS.File.prototype.createReadStream = function(storeName) { ...``` [fsFile-server.js:62](fsFile-server.js#L62) - - -- - -### *fsFile*.createWriteStream([storeName])  Server ### - -*This method __createWriteStream__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __storeName__ *{String}* (Optional) - -__Returns__ *{stream.Writeable}* -Writeable NodeJS stream - - -Returns a writeable stream. Where the stream writes to depends on whether you pass in a store name. - -If you pass a `storeName`, a writeable stream for (over)writing the file data in that store is returned. -If you don't pass a `storeName`, a writeable stream for writing to the temp store for this file is returned. - - -> ```FS.File.prototype.createWriteStream = function(storeName) { ...``` [fsFile-server.js:100](fsFile-server.js#L100) - - -- - -### *fsFile*.copy()  Server ### - -*This method __copy__ is defined in `prototype` of `FS.File`* - -__Returns__ *{FS.File}* -The new FS.File instance - - -> ```FS.File.prototype.copy = function() { ...``` [fsFile-server.js:126](fsFile-server.js#L126) - - diff --git a/packages/wekan-cfs-file/package.js b/packages/wekan-cfs-file/package.js deleted file mode 100644 index d14cc069f..000000000 --- a/packages/wekan-cfs-file/package.js +++ /dev/null @@ -1,55 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-cfs-file.git', - name: 'wekan-cfs-file', - version: '0.1.17', - summary: 'CollectionFS, FS.File object' -}); - -Npm.depends({ - temp: "0.7.0" // for tests only -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - // This imply is needed for tests, and is technically probably correct anyway. - api.imply([ - 'wekan-cfs-base-package@0.0.30' - ]); - - api.use([ - 'wekan-cfs-base-package@0.0.30', - 'wekan-cfs-storage-adapter@0.2.1', - 'tracker', - 'check', - 'ddp', - 'mongo', - 'http', - 'wekan-cfs-data-man@0.0.6', - 'raix:eventemitter@0.1.1' - ]); - - api.addFiles([ - 'fsFile-common.js' - ], 'client'); - - api.addFiles([ - 'fsFile-common.js', - 'fsFile-server.js' - ], 'server'); -}); - -Package.onTest(function (api) { - api.use([ - 'wekan-cfs-standard-packages@0.0.0', - 'wekan-cfs-gridfs@0.0.0', - 'tinytest@1.0.0', - 'http@1.0.0', - 'test-helpers@1.0.0', - 'wekan-cfs-http-methods@0.0.29' - ]); - - api.addFiles([ - 'tests/file-tests.js' - ]); -}); diff --git a/packages/wekan-cfs-file/tests/file-tests.js b/packages/wekan-cfs-file/tests/file-tests.js deleted file mode 100644 index 7ad3310e4..000000000 --- a/packages/wekan-cfs-file/tests/file-tests.js +++ /dev/null @@ -1,436 +0,0 @@ -function bin2str(bufView) { - var length = bufView.length; - var result = ''; - for (var i = 0; i length) { - addition = length - i; - } - try { - // this fails on phantomjs due to old webkit bug; hence the try/catch - result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition)); - } catch (e) { - var dataArray = []; - for (var j = i; j < i+addition; j++) { - dataArray.push(bufView[j]); - } - result += String.fromCharCode.apply(null, dataArray); - } - } - return result; -} - -//function ab2str(buffer) { -// return bin2str(new Uint8Array(buffer)); -//} - -function str2ab(str) { - var buf = new ArrayBuffer(str.length); - var bufView = new Uint8Array(buf); - for (var i=0, strLen=str.length; inew *fsStore*.GridFS(name, options)  Server ### - -*This method __GridFS__ is defined in `FS.Store`* - -__Arguments__ - -* __name__ *{String}* - - The store name - -* __options__ *{Object}* - * __beforeSave__ *{Function}* (Optional) - - Function to run before saving a file from the server. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - - * __maxTries__ *{Number}* (Optional, Default = 5) - - Max times to attempt saving a file - - -__Returns__ *{FS.StorageAdapter}* -An instance of FS.StorageAdapter. - - -Creates a GridFS store instance on the server. Inherits from FS.StorageAdapter -type. - -> ```FS.Store.GridFS = function(name, options) { ...``` [gridfs.server.js:16](gridfs.server.js#L16) - - -- - -### new *fsStore*.GridFS(name, options)  Client ### - -*This method __GridFS__ is defined in `FS.Store`* - -__Arguments__ - -* __name__ *{String}* - - The store name - -* __options__ *{Object}* - * __beforeSave__ *{Function}* (Optional) - - Function to run before saving a file from the client. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - - * __maxTries__ *{Number}* (Optional, Default = 5) - - Max times to attempt saving a file - - -__Returns__ *{undefined}* - - -Creates a GridFS store instance on the client, which is just a shell object -storing some info. - -> ```FS.Store.GridFS = function(name, options) { ...``` [gridfs.client.js:13](gridfs.client.js#L13) - - diff --git a/packages/wekan-cfs-gridfs/gridfs.client.js b/packages/wekan-cfs-gridfs/gridfs.client.js deleted file mode 100644 index 3cb26583b..000000000 --- a/packages/wekan-cfs-gridfs/gridfs.client.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @public - * @constructor - * @param {String} name - The store name - * @param {Object} options - * @param {Function} [options.beforeSave] - Function to run before saving a file from the client. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - * @param {Number} [options.maxTries=5] - Max times to attempt saving a file - * @returns {undefined} - * - * Creates a GridFS store instance on the client, which is just a shell object - * storing some info. - */ -FS.Store.GridFS = function(name, options) { - var self = this; - if (!(self instanceof FS.Store.GridFS)) - throw new Error('FS.Store.GridFS missing keyword "new"'); - - return new FS.StorageAdapter(name, options, { - typeName: 'storage.gridfs' - }); -}; diff --git a/packages/wekan-cfs-gridfs/gridfs.server.js b/packages/wekan-cfs-gridfs/gridfs.server.js deleted file mode 100644 index 90b92e0ca..000000000 --- a/packages/wekan-cfs-gridfs/gridfs.server.js +++ /dev/null @@ -1,176 +0,0 @@ -var path = Npm.require('path'); -var mongodb = Npm.require('mongodb'); -var ObjectID = Npm.require('mongodb').ObjectID; -var Grid = Npm.require('gridfs-stream'); -//var Grid = Npm.require('gridfs-locking-stream'); - -var chunkSize = 1024*1024*2; // 256k is default GridFS chunk size, but performs terribly for largish files - -/** - * @public - * @constructor - * @param {String} name - The store name - * @param {Object} options - * @param {Function} [options.beforeSave] - Function to run before saving a file from the server. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - * @param {Number} [options.maxTries=5] - Max times to attempt saving a file - * @returns {FS.StorageAdapter} An instance of FS.StorageAdapter. - * - * Creates a GridFS store instance on the server. Inherits from FS.StorageAdapter - * type. - */ - -FS.Store.GridFS = function(name, options) { - var self = this; - options = options || {}; - - var gridfsName = name; - var mongoOptions = options.mongoOptions || {}; - - if (!(self instanceof FS.Store.GridFS)) - throw new Error('FS.Store.GridFS missing keyword "new"'); - - if (!options.mongoUrl) { - options.mongoUrl = process.env.MONGO_URL; - // When using a Meteor MongoDB instance, preface name with "cfs_gridfs." - gridfsName = "cfs_gridfs." + name; - } - - if (!options.mongoOptions) { - options.mongoOptions = { db: { native_parser: true }, server: { auto_reconnect: true }}; - } - - if (options.chunkSize) { - chunkSize = options.chunkSize; - } - - return new FS.StorageAdapter(name, options, { - - typeName: 'storage.gridfs', - fileKey: function(fileObj) { - // We should not have to mount the file here - We assume its taken - // care of - Otherwise we create new files instead of overwriting - var key = { - _id: null, - filename: null - }; - - // If we're passed a fileObj, we retrieve the _id and filename from it. - if (fileObj) { - var info = fileObj._getInfo(name, {updateFileRecordFirst: false}); - key._id = info.key || null; - key.filename = info.name || fileObj.name({updateFileRecordFirst: false}) || (fileObj.collectionName + '-' + fileObj._id); - } - - // If key._id is null at this point, createWriteStream will let GridFS generate a new ID - return key; - }, - createReadStream: function(fileKey, options) { - options = options || {}; - - // Init GridFS - var gfs = new Grid(self.db, mongodb); - - // Set the default streamning settings - var settings = { - _id: new ObjectID(fileKey._id), - root: gridfsName - }; - - // Check if this should be a partial read - if (typeof options.start !== 'undefined' && typeof options.end !== 'undefined' ) { - // Add partial info - settings.range = { - startPos: options.start, - endPos: options.end - }; - } - - FS.debug && console.log('GRIDFS', settings); - - return gfs.createReadStream(settings); - - }, - createWriteStream: function(fileKey, options) { - options = options || {}; - - // Init GridFS - var gfs = new Grid(self.db, mongodb); - - var opts = { - filename: fileKey.filename, - mode: 'w', - root: gridfsName, - chunk_size: options.chunk_size || chunkSize, - // We allow aliases, metadata and contentType to be passed in via - // options - aliases: options.aliases || [], - metadata: options.metadata || null, - content_type: options.contentType || 'application/octet-stream' - }; - - if (fileKey._id) { - opts._id = new ObjectID(fileKey._id); - } - - var writeStream = gfs.createWriteStream(opts); - - writeStream.on('close', function(file) { - if (!file) { - // gridfs-stream will emit "close" without passing a file - // if there is an error. We can simply exit here because - // the "error" listener will also be called in this case. - return; - } - - if (FS.debug) console.log('SA GridFS - DONE!'); - - // Emit end and return the fileKey, size, and updated date - writeStream.emit('stored', { - // Set the generated _id so that we know it for future reads and writes. - // We store the _id as a string and only convert to ObjectID right before - // reading, writing, or deleting. If we store the ObjectID itself, - // Meteor (EJSON?) seems to convert it to a LocalCollection.ObjectID, - // which GFS doesn't understand. - fileKey: file._id.toString(), - size: file.length, - storedAt: file.uploadDate || new Date() - }); - }); - - writeStream.on('error', function(error) { - console.log('SA GridFS - ERROR!', error); - }); - - return writeStream; - - }, - remove: function(fileKey, callback) { - // Init GridFS - var gfs = new Grid(self.db, mongodb); - - try { - gfs.remove({ _id: new ObjectID(fileKey._id), root: gridfsName }, callback); - } catch(err) { - callback(err); - } - }, - - // Not implemented - watch: function() { - throw new Error("GridFS storage adapter does not support the sync option"); - }, - - init: function(callback) { - mongodb.MongoClient.connect(options.mongoUrl, mongoOptions, function (err, db) { - if (err) { return callback(err); } - self.db = db; - - // ensure that indexes are added as otherwise CollectionFS fails for Mongo >= 3.0 - var collection = new Mongo.Collection(gridfsName); - collection.rawCollection().ensureIndex({ "files_id": 1, "n": 1}); - - callback(null); - }); - } - }); -}; diff --git a/packages/wekan-cfs-gridfs/internal.api.md b/packages/wekan-cfs-gridfs/internal.api.md deleted file mode 100644 index cb81e7439..000000000 --- a/packages/wekan-cfs-gridfs/internal.api.md +++ /dev/null @@ -1,75 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["gridfs.server.js"](gridfs.server.js) Where: {server}__ - -*** - -### new *fsStore*.GridFS(name, options)  Server ### - -*This method __GridFS__ is defined in `FS.Store`* - -__Arguments__ - -* __name__ *{String}* - - The store name - -* __options__ *{Object}* - * __beforeSave__ *{Function}* (Optional) - - Function to run before saving a file from the server. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - - * __maxTries__ *{Number}* (Optional, Default = 5) - - Max times to attempt saving a file - - -__Returns__ *{FS.StorageAdapter}* -An instance of FS.StorageAdapter. - - -Creates a GridFS store instance on the server. Inherits from FS.StorageAdapter -type. - -> ```FS.Store.GridFS = function(name, options) { ...``` [gridfs.server.js:16](gridfs.server.js#L16) - - -*** - -__File: ["gridfs.client.js"](gridfs.client.js) Where: {client}__ - -*** - -### new *fsStore*.GridFS(name, options)  Client ### - -*This method __GridFS__ is defined in `FS.Store`* - -__Arguments__ - -* __name__ *{String}* - - The store name - -* __options__ *{Object}* - * __beforeSave__ *{Function}* (Optional) - - Function to run before saving a file from the client. The context of the function will be the `FS.File` instance we're saving. The function may alter its properties. - - * __maxTries__ *{Number}* (Optional, Default = 5) - - Max times to attempt saving a file - - -__Returns__ *{undefined}* - - -Creates a GridFS store instance on the client, which is just a shell object -storing some info. - -> ```FS.Store.GridFS = function(name, options) { ...``` [gridfs.client.js:13](gridfs.client.js#L13) - - diff --git a/packages/wekan-cfs-gridfs/package.js b/packages/wekan-cfs-gridfs/package.js deleted file mode 100755 index 6c430f22a..000000000 --- a/packages/wekan-cfs-gridfs/package.js +++ /dev/null @@ -1,24 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-gridfs', - version: '0.0.34', - summary: 'GridFS storage adapter for CollectionFS', - git: 'https://github.com/zcfs/Meteor-cfs-gridfs.git' -}); - -Npm.depends({ - mongodb: '2.2.9', - 'gridfs-stream': '1.1.1' - //'gridfs-locking-stream': '0.0.3' -}); - -Package.onUse(function (api) { - api.use(['wekan-cfs-base-package@0.0.30', 'wekan-cfs-storage-adapter@0.2.3', 'ecmascript@0.1.0']); - api.addFiles('gridfs.server.js', 'server'); - api.addFiles('gridfs.client.js', 'client'); -}); - -Package.onTest(function (api) { - api.use(['wekan-cfs-gridfs', 'test-helpers', 'tinytest'], 'server'); - api.addFiles('tests/server-tests.js', 'server'); - api.addFiles('tests/client-tests.js', 'client'); -}); diff --git a/packages/wekan-cfs-gridfs/tests/client-tests.js b/packages/wekan-cfs-gridfs/tests/client-tests.js deleted file mode 100644 index 222af562f..000000000 --- a/packages/wekan-cfs-gridfs/tests/client-tests.js +++ /dev/null @@ -1,44 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-gridfs - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Client Tests - * - * construct FS.File with no arguments - * construct FS.File passing in File - * construct FS.File passing in Blob - * load blob into FS.File and then call FS.File.toDataUrl - * call FS.File.setDataFromBinary, then FS.File.getBlob(); make sure correct data is returned - * load blob into FS.File and then call FS.File.getBinary() with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * load blob into FS.File and make sure FS.File.saveLocal initiates a download (possibly can't do automatically) - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-gridfs/tests/server-tests.js b/packages/wekan-cfs-gridfs/tests/server-tests.js deleted file mode 100644 index 61a7a3f92..000000000 --- a/packages/wekan-cfs-gridfs/tests/server-tests.js +++ /dev/null @@ -1,49 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-gridfs - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Server Tests - * - * construct FS.File with no arguments - * load data with FS.File.setDataFromBuffer - * load data with FS.File.setDataFromBinary - * load data and then call FS.File.toDataUrl with and without callback - * load buffer into FS.File and then call FS.File.getBinary with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * (call these with and without callback to test sync vs. async) - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * - * - * FS.Collection Server Tests - * - * Make sure options.filter is respected - * - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-http-methods/.editorconfig b/packages/wekan-cfs-http-methods/.editorconfig deleted file mode 100644 index a2cc1c1fe..000000000 --- a/packages/wekan-cfs-http-methods/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# .editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true \ No newline at end of file diff --git a/packages/wekan-cfs-http-methods/.gitignore b/packages/wekan-cfs-http-methods/.gitignore deleted file mode 100644 index 361e39a8f..000000000 --- a/packages/wekan-cfs-http-methods/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.build* -/.versions \ No newline at end of file diff --git a/packages/wekan-cfs-http-methods/.jshintrc b/packages/wekan-cfs-http-methods/.jshintrc deleted file mode 100644 index b288c9edc..000000000 --- a/packages/wekan-cfs-http-methods/.jshintrc +++ /dev/null @@ -1,140 +0,0 @@ -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : false, // false: Identifiers do not need to be in camelCase. We would like to enforce this except for when interacting with our api objects which use snakeCase properties. - "curly" : false, // false: Do not require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 2, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : false, // false: Do not require all functions to be run in ES5 Strict Mode - "trailing" : true, // true: Prohibit trailing whitespaces - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : 250, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : true, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jquery" : false, // jQuery - "mootools" : false, // MooTools - "node" : false, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "rhino" : false, // Rhino - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - //"meteor" : false, // Meteor.js - - // Legacy - "nomen" : false, // true: Prohibit dangling `_` in variables - "onevar" : false, // true: Allow only one `var` statement per function - "passfail" : false, // true: Stop on first error - "white" : false, // true: Check against strict whitespace and indentation rules - - // Custom globals, from http://docs.meteor.com, in the order they appear there - "globals" : { - "Meteor": false, - "DDP": false, - "Mongo": false, - "Session": false, - "Accounts": false, - "Template": false, - "Blaze": false, - "Spacebars": false, - "Match": false, - "check": false, - "Tracker": false, - "ReactiveVar": false, - "ReactiveDict": false, - "EJSON": false, - "HTTP": false, - "Email": false, - "Assets": false, - "Package": false, - "App": false, //mobile-config.js - "cordova": false, - "Cordova": false, - "Buffer": false, - - // Meteor internals - "DDPServer": false, - "global": false, - "Log": false, - "MongoInternals": false, - "process": false, - "Retry": false, - "WebApp": false, - "WebAppInternals": false, - - // globals useful when creating Meteor packages - "Npm": false, - "Tinytest": false, - - // common Meteor packages - "HTTP": true, - "Random": false, - "_": false, // Underscore.js - "$": false, // jQuery - - // This package - "_methodHTTP": true, - "Fiber": true, - "runServerMethod": true - } -} diff --git a/packages/wekan-cfs-http-methods/.travis.yml b/packages/wekan-cfs-http-methods/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-http-methods/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-http-methods/CHANGELOG.md b/packages/wekan-cfs-http-methods/CHANGELOG.md deleted file mode 100644 index 425243944..000000000 --- a/packages/wekan-cfs-http-methods/CHANGELOG.md +++ /dev/null @@ -1,152 +0,0 @@ -# Changelog - -## vCurrent - -## [v0.0.30] -#### 9/9/15 by Eric Dobbertin -- Ensure we do not try to end responses twice - -## [v0.0.29] -#### 29/4/15 by Eric Dobbertin -- Respond properly to 206 Range requests (thanks [cherbst](https://github.com/cherbst)) - -## [v0.0.28] -#### 8/4/15 by Eric Dobbertin -- Fix issue where response would not be sent when using streams - -## [v0.0.26] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.26) -#### 17/12/14 by Morten Henriksen -- mbr update, remove versions.json - -## [v0.0.25] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.25) -#### 17/12/14 by Morten Henriksen -- mbr update versions and fix warnings - -- *Merged pull-request:* "- Added link to documentation about usage of HTTP client-side" [#22](https://github.com/zcfs/Meteor-http-methods/issues/22) ([jkaan](https://github.com/jkaan)) - -- *Merged pull-request:* "Typos." [#23](https://github.com/zcfs/Meteor-http-methods/issues/23) ([bradvogel](https://github.com/bradvogel)) - -- - Added link to documentation about usage of HTTP client-side - -- *Merged pull-request:* "typo in example: this.params instead of this.param" [#21](https://github.com/zcfs/Meteor-http-methods/issues/21) ([lukasvan3l](https://github.com/lukasvan3l)) - -- typo in example: this.params instead of this.param - -- *Merged pull-request:* ""code" is not always there" [#20](https://github.com/zcfs/Meteor-http-methods/issues/20) ([lukasvan3l](https://github.com/lukasvan3l)) - -- code is not always there - -- 0.9.1 support - -Patches by GitHub users [@jkaan](https://github.com/jkaan), [@bradvogel](https://github.com/bradvogel), [@lukasvan3l](https://github.com/lukasvan3l). - -## [v0.0.23] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.23) -#### 25/08/14 by Morten Henriksen -- *Fixed bug:* "Cannot transfer a file stream over 5Mb to the server." [#17](https://github.com/zcfs/Meteor-http-methods/issues/17) - -- *Merged pull-request:* "Add this.requestHeaders to readme" [#12](https://github.com/zcfs/Meteor-http-methods/issues/12) ([matthewsimo](https://github.com/matthewsimo)) - -- Add this.requestHeaders to readme - -Patches by GitHub user [@matthewsimo](https://github.com/matthewsimo). - -## [v0.0.22] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.22) -#### 25/03/14 by Morten Henriksen -- *Merged pull-request:* "Typo fixes" [#11](https://github.com/zcfs/Meteor-http-methods/issues/11) ([dandv](https://github.com/dandv)) - -- *Merged pull-request:* "Cosmetic fixes" [#10](https://github.com/zcfs/Meteor-http-methods/issues/10) ([dandv](https://github.com/dandv)) - -- Typo fixes - -- Cosmetic fixes - -Patches by GitHub user [@dandv](https://github.com/dandv). - -## [v0.0.21] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.21) -#### 23/03/14 by Morten Henriksen -## [v0.0.20] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.20) -#### 22/03/14 by Morten Henriksen -- add check - -- use collectionFS travis version force update - -## [v0.0.19] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.19) -#### 22/03/14 by Morten Henriksen -- Added ability for throwing http errors - -## [v0.0.18] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.18) -#### 18/03/14 by Morten Henriksen -- support HEAD requests - -- Add better streaming api and fix timeout / chunk size bug - -- refactor + added read stream - -- Add streaming WIP - -- Name tests by package - -- unbreak http-publish tests when run at in one test - -## [v0.0.17] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.17) -#### 22/02/14 by Morten Henriksen -- *Fixed bug:* "Binary use currently breaks json usage of data" [#6](https://github.com/zcfs/Meteor-http-methods/issues/6) - -## [v0.0.16] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.16) -#### 22/02/14 by Morten Henriksen -- Fix test - params from a query string is string now - -- make sure falsy turns into string - -## [v0.0.15] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.15) -#### 21/02/14 by Eric Dobbertin -## [v0.0.14] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.14) -#### 20/02/14 by Eric Dobbertin -- support binary data from the request - -## [v0.0.13] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.13) -#### 17/02/14 by Morten Henriksen -- Merge branch 'master' of https://github.com/zcfs/Meteor-http-methods - -- Bump to version 0.0.12 - -## [v0.0.12] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.12) -#### 17/02/14 by Eric Dobbertin -- Add requestHeaders to method context - -- Better handling of Meteor.Error's - -- url decode values in params - -- Allow user to set headers in custom response - -## [v0.0.11] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.11) -#### 08/12/13 by Morten Henriksen -## [v0.0.10] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.10) -#### 14/11/13 by Morten Henriksen -## [v0.0.9] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.9) -#### 30/09/13 by Morten Henriksen -- Add MIT License - -## [v0.0.8] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.8) -#### 28/09/13 by Morten Henriksen -- Comment feature - format selector as extension in url - -## [v0.0.7] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.7) -#### 18/09/13 by Morten Henriksen -## [v0.0.6, tag: v0.0.5] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.6, tag: v0.0.5) -#### 18/09/13 by Morten Henriksen -- Added more features - -## [v0.0.4] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.4) -#### 13/09/13 by Morten Henriksen -## [v0.0.3] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.3) -#### 12/09/13 by Morten Henriksen -## [v0.0.2] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.2) -#### 12/09/13 by Morten Henriksen -- *Fixed bug:* "allow empty last value in url" [#1](https://github.com/zcfs/Meteor-http-methods/issues/1) - -## [v0.0.1] (https://github.com/zcfs/Meteor-http-methods/tree/v0.0.1) -#### 12/09/13 by Morten Henriksen -- Init commit - diff --git a/packages/wekan-cfs-http-methods/LICENSE.md b/packages/wekan-cfs-http-methods/LICENSE.md deleted file mode 100644 index 2a5c5339e..000000000 --- a/packages/wekan-cfs-http-methods/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-http-methods/README.md b/packages/wekan-cfs-http-methods/README.md deleted file mode 100644 index b253ff48b..000000000 --- a/packages/wekan-cfs-http-methods/README.md +++ /dev/null @@ -1,215 +0,0 @@ -wekan-cfs-http-methods [![Build Status](https://travis-ci.org/CollectionFS/Meteor-http-methods.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-http-methods) -============ - -~~Looking for maintainers - please reach out!~~ -This package is to be archived due to inability to find contributors, thanks to everyone who helped make it possible. - -**If you're looking for an alternative, we highly recommend [Meteor-Files](https://github.com/VeliovGroup/Meteor-Files) by [VeliovGroup](https://github.com/VeliovGroup)** - ---- - -Add server-side methods to the `HTTP` object your app. It's a server-side package only *- no client simulations added.* - -## Usage - -The `HTTP` object gets a `methods` method: - -```js - HTTP.methods({ - 'list': function() { - return 'Default content type is text/html'; - } - }); -``` - -## Methods scope -The methods scope contains different kinds of inputs. We can also get user details if logged in. - - -* `this.userId` - the user whose id and token was used to run this method, if set/found -* `this.method` - `GET`, `POST`, `PUT`, `DELETE` -* `this.query` - query params `?token=1&id=2` -> `{ token: 1, id: 2 }` -* `this.params` - set params `/foo/:name/test/:id` -> `{ name: '', id: '' }` -* `this.userAgent` - get the user agent string set in the request header -* `this.requestHeaders` - request headers object -* `this.setUserId(id)` - option for setting the `this.userId` -* `this.isSimulation` - always false on the server -* `this.unblock` - not implemented -* `this.setContentType('text/html')` - set the content type in header, defaults to `text/html` -* `this.addHeader('Content-Disposition', 'attachment; filename="name.ext"')` -* `this.setStatusCode(200)` - set the status code in the response header -* `createReadStream` - if a request, then get the read stream -* `createWriteStream` - if you want to stream data to the client -* `Error` - when streaming we have to be able to send error and close connection -* `this.request` The original request object - -## Passing data via header - -From the client: -```js - HTTP.post('list', { - data: { foo: 'bar' } - }, function(err, result) { - console.log('Content: ' + result.content + ' === "Hello"'); - }); -``` - -HTTP Server method: -```js - HTTP.methods({ - 'list': function(data) { - if (data.foo === 'bar') { - /* data we pass via the header is parsed by EJSON.parse - If not able, then it returns the raw data instead */ - } - return 'Hello'; - } - }); -``` - -## Parameters -The method name or URL can be used to pass parameters to the method. The parameters are available on the server under `this.params`: - -Client -```js - HTTP.post('/items/12/emails/5', function(err, result) { - console.log('Got back: ' + result.content); - }); -``` - -Server -```js - HTTP.methods({ - '/items/:itemId/emails/:emailId': function() { - // this.params.itemId === '12' - // this.params.emailId === '5' - } - }); -``` - -## Extended usage -The `HTTP.methods` normally takes a function, but it can be set to an object for fine-grained handling. - -Example: -```js - HTTP.methods({ - '/hello': { - get: function(data) {}, - // post: function(data) {}, - // put: function(data) {}, - // delete: function(data) {}, - // options: function() { - // // Example of a simple options function - // this.setStatusCode(200); - // this.addHeader('Accept', 'POST,PUT'); - // // The options for this restpoint - // var options = { - // POST: { - // description: 'Create an issue', - // parameters: { - // title: { - // type: 'string', - // description: 'Issue title' - // } - // } - // } - // }; - // // Print the options in pretty json - // return JSON.stringify(options, null, '\t'); - // }, - // stream: true // flag whether to allow stream handling in the request - } - }); -``` -*In this example the mounted http rest point will only support the `get` method* - -Example: -```js - HTTP.methods({ - '/hello': { - method: function(data) {}, - } - }); -``` -*In this example all methods `get`, `put`, `post`, `delete` will use the same function - This would be equal to setting the function directly on the http mount point* - -## Authentication - -The client needs the `access_token` to login in HTTP methods. *One could create a HTTP login/logout method for allowing pure external access* - -Client -```js - HTTP.post('/hello', { - params: { - token: Accounts && Accounts._storedLoginToken() - } - }, function(err, result) { - console.log('Got back: ' + result.content); - }); -``` - -Server -```js - 'hello': function(data) { - if (this.userId) { - var user = Meteor.users.findOne({ _id: this.userId }); - return 'Hello ' + (user && user.username || user && user.emails[0].address || 'user'); - } else { - this.setStatusCode(401); // Unauthorized - } - } -``` - -## Using custom authentication - -It's possible to make your own function to set the userId - not using the built-in token pattern. -```js - // My auth will return the userId - var myAuth = function() { - // Read the token from '/hello?token=5' - var userToken = self.query.token; - // Check the userToken before adding it to the db query - // Set the this.userId - if (userToken) { - var user = Meteor.users.findOne({ 'services.resume.loginTokens.token': userToken }); - - // Set the userId in the scope - return user && user._id; - } - }; - - HTTP.methods({ - '/hello': { - auth: myAuth, - method: function(data) { - // this.userId is set by myAuth - if (this.userId) { /**/ } else { /**/ } - } - } - }); -``` -*The above resembles the builtin auth handler* - -## Security -When buffering data instead of streaming we set the buffer limit to 5mb - This can be changed on the fly: -```js - // Set the max data length - // 5mb = 5 * 1024 * 1024 = 5242880; - HTTP.methodsMaxDataLength = 5242880; -``` - -## Login and logout (TODO) - -These operations are not currently supported for off Meteor use - there are some security considerations. - -`basic-auth` is broadly supported, but: -* password should not be sent in clear text - hash with base64? -* should be used on https connections -* Its difficult / impossible to logout a user? - -`token` the current `access_token` seems to be a better solution. Better control and options to logout users. But calling the initial `login` method still requires: -* hashing of password -* use https - -## HTTP Client-side usage -If you want to use the HTTP client-side functionality and find yourself having a hard time viewing all available options; these can be found on https://docs.meteor.com/#/full/http. diff --git a/packages/wekan-cfs-http-methods/http.methods.client.api.js b/packages/wekan-cfs-http-methods/http.methods.client.api.js deleted file mode 100644 index d6dd694a9..000000000 --- a/packages/wekan-cfs-http-methods/http.methods.client.api.js +++ /dev/null @@ -1,6 +0,0 @@ -HTTP = Package.http && Package.http.HTTP || {}; - -// Client-side simulation is not yet implemented -HTTP.methods = function() { - throw new Error('HTTP.methods not implemented on client-side'); -}; diff --git a/packages/wekan-cfs-http-methods/http.methods.server.api.js b/packages/wekan-cfs-http-methods/http.methods.server.api.js deleted file mode 100644 index fc3b9d116..000000000 --- a/packages/wekan-cfs-http-methods/http.methods.server.api.js +++ /dev/null @@ -1,644 +0,0 @@ -/* - -GET /note -GET /note/:id -POST /note -PUT /note/:id -DELETE /note/:id - -*/ -HTTP = Package.http && Package.http.HTTP || {}; - -// Primary local test scope -_methodHTTP = {}; - - -_methodHTTP.methodHandlers = {}; -_methodHTTP.methodTree = {}; - -// This could be changed eg. could allow larger data chunks than 1.000.000 -// 5mb = 5 * 1024 * 1024 = 5242880; -HTTP.methodsMaxDataLength = 5242880; //1e6; - -_methodHTTP.nameFollowsConventions = function(name) { - // Check that name is string, not a falsy or empty - return name && name === '' + name && name !== ''; -}; - - -_methodHTTP.getNameList = function(name) { - // Remove leading and trailing slashes and make command array - name = name && name.replace(/^\//g, '') || ''; // /^\/|\/$/g - // TODO: Get the format from the url - eg.: "/list/45.json" format should be - // set in this function by splitting the last list item by . and have format - // as the last item. How should we toggle: - // "/list/45/item.name.json" and "/list/45/item.name"? - // We would either have to check all known formats or allways determin the "." - // as an extension. Resolving in "json" and "name" as handed format - the user - // Could simply just add the format as a parametre? or be explicit about - // naming - return name && name.split('/') || []; -}; - -// Merge two arrays one containing keys and one values -_methodHTTP.createObject = function(keys, values) { - var result = {}; - if (keys && values) { - for (var i = 0; i < keys.length; i++) { - result[keys[i]] = values[i] && decodeURIComponent(values[i]) || ''; - } - } - return result; -}; - -_methodHTTP.addToMethodTree = function(methodName) { - var list = _methodHTTP.getNameList(methodName); - var name = '/'; - // Contains the list of params names - var params = []; - var currentMethodTree = _methodHTTP.methodTree; - - for (var i = 0; i < list.length; i++) { - - // get the key name - var key = list[i]; - // Check if it expects a value - if (key[0] === ':') { - // This is a value - params.push(key.slice(1)); - key = ':value'; - } - name += key + '/'; - - // Set the key into the method tree - if (typeof currentMethodTree[key] === 'undefined') { - currentMethodTree[key] = {}; - } - - // Dig deeper - currentMethodTree = currentMethodTree[key]; - - } - - if (_.isEmpty(currentMethodTree[':ref'])) { - currentMethodTree[':ref'] = { - name: name, - params: params - }; - } - - return currentMethodTree[':ref']; -}; - -// This method should be optimized for speed since its called on allmost every -// http call to the server so we return null as soon as we know its not a method -_methodHTTP.getMethod = function(name) { - // Check if the - if (!_methodHTTP.nameFollowsConventions(name)) { - return null; - } - var list = _methodHTTP.getNameList(name); - // Check if we got a correct list - if (!list || !list.length) { - return null; - } - // Set current refernce in the _methodHTTP.methodTree - var currentMethodTree = _methodHTTP.methodTree; - // Buffer for values to hand on later - var values = []; - // Iterate over the method name and check if its found in the method tree - for (var i = 0; i < list.length; i++) { - // get the key name - var key = list[i]; - // We expect to find the key or :value if not we break - if (typeof currentMethodTree[key] !== 'undefined' || - typeof currentMethodTree[':value'] !== 'undefined') { - // We got a result now check if its a value - if (typeof currentMethodTree[key] === 'undefined') { - // Push the value - values.push(key); - // Set the key to :value to dig deeper - key = ':value'; - } - - } else { - // Break - method call not found - return null; - } - - // Dig deeper - currentMethodTree = currentMethodTree[key]; - } - - // Extract reference pointer - var reference = currentMethodTree && currentMethodTree[':ref']; - if (typeof reference !== 'undefined') { - return { - name: reference.name, - params: _methodHTTP.createObject(reference.params, values), - handle: _methodHTTP.methodHandlers[reference.name] - }; - } else { - // Did not get any reference to the method - return null; - } -}; - -// This method retrieves the userId from the token and makes sure that the token -// is valid and not expired -_methodHTTP.getUserId = function() { - var self = this; - - // // Get ip, x-forwarded-for can be comma seperated ips where the first is the - // // client ip - // var ip = self.req.headers['x-forwarded-for'] && - // // Return the first item in ip list - // self.req.headers['x-forwarded-for'].split(',')[0] || - // // or return the remoteAddress - // self.req.connection.remoteAddress; - - // Check authentication - var userToken = self.query.token; - - // Check if we are handed strings - try { - userToken && check(userToken, String); - } catch(err) { - throw new Meteor.Error(404, 'Error user token and id not of type strings, Error: ' + (err.stack || err.message)); - } - - // Set the this.userId - if (userToken) { - // Look up user to check if user exists and is loggedin via token - var user = Meteor.users.findOne({ - $or: [ - {'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(userToken)}, - {'services.resume.loginTokens.token': userToken} - ] - }); - // TODO: check 'services.resume.loginTokens.when' to have the token expire - - // Set the userId in the scope - return user && user._id; - } - - return null; -}; - -// Expose the default auth for calling from custom authentication handlers. -HTTP.defaultAuth = _methodHTTP.getUserId; - -/* - -Add default support for options - -*/ -_methodHTTP.defaultOptionsHandler = function(methodObject) { - // List of supported methods - var allowMethods = []; - // The final result object - var result = {}; - - // Iterate over the methods - // XXX: We should have a way to extend this - We should have some schema model - // for our methods... - _.each(methodObject, function(f, methodName) { - // Skip the stream and auth functions - they are not public / accessible - if (methodName !== 'stream' && methodName !== 'auth') { - - // Create an empty description - result[methodName] = { description: '', parameters: {} }; - // Add method name to headers - allowMethods.push(methodName); - - } - }); - - // Lets play nice - this.setStatusCode(200); - - // We have to set some allow headers here - this.addHeader('Allow', allowMethods.join(',')); - - // Return json result - Pretty print - return JSON.stringify(result, null, '\t'); -}; - -// Public interface for adding server-side http methods - if setting a method to -// 'false' it would actually remove the method (can be used to unpublish a method) -HTTP.methods = function(newMethods) { - _.each(newMethods, function(func, name) { - if (_methodHTTP.nameFollowsConventions(name)) { - // Check if we got a function - //if (typeof func === 'function') { - var method = _methodHTTP.addToMethodTree(name); - // The func is good - if (typeof _methodHTTP.methodHandlers[method.name] !== 'undefined') { - if (func === false) { - // If the method is set to false then unpublish - delete _methodHTTP.methodHandlers[method.name]; - // Delete the reference in the _methodHTTP.methodTree - delete method.name; - delete method.params; - } else { - // We should not allow overwriting - following Meteor.methods - throw new Error('HTTP method "' + name + '" is already registered'); - } - } else { - // We could have a function or a object - // The object could have: - // '/test/': { - // auth: function() ... returning the userId using over default - // - // method: function() ... - // or - // post: function() ... - // put: - // get: - // delete: - // head: - // } - - /* - We conform to the object format: - { - auth: - post: - put: - get: - delete: - head: - } - This way we have a uniform reference - */ - - var uniObj = {}; - if (typeof func === 'function') { - uniObj = { - 'auth': _methodHTTP.getUserId, - 'stream': false, - 'POST': func, - 'PUT': func, - 'GET': func, - 'DELETE': func, - 'HEAD': func, - 'OPTIONS': _methodHTTP.defaultOptionsHandler - }; - } else { - uniObj = { - 'stream': func.stream || false, - 'auth': func.auth || _methodHTTP.getUserId, - 'POST': func.post || func.method, - 'PUT': func.put || func.method, - 'GET': func.get || func.method, - 'DELETE': func.delete || func.method, - 'HEAD': func.head || func.get || func.method, - 'OPTIONS': func.options || _methodHTTP.defaultOptionsHandler - }; - } - - // Registre the method - _methodHTTP.methodHandlers[method.name] = uniObj; // func; - - } - // } else { - // // We do require a function as a function to execute later - // throw new Error('HTTP.methods failed: ' + name + ' is not a function'); - // } - } else { - // We have to follow the naming spec defined in nameFollowsConventions - throw new Error('HTTP.method "' + name + '" invalid naming of method'); - } - }); -}; - -var sendError = function(res, code, message) { - if (code) { - res.writeHead(code); - } else { - res.writeHead(500); - } - res.end(message); -}; - -// This handler collects the header data into either an object (if json) or the -// raw data. The data is passed to the callback -var requestHandler = function(req, res, callback) { - if (typeof callback !== 'function') { - return null; - } - - // Container for buffers and a sum of the length - var bufferData = [], dataLen = 0; - - // Extract the body - req.on('data', function(data) { - bufferData.push(data); - dataLen += data.length; - - // We have to check the data length in order to spare the server - if (dataLen > HTTP.methodsMaxDataLength) { - dataLen = 0; - bufferData = []; - // Flood attack or faulty client - sendError(res, 413, 'Flood attack or faulty client'); - req.connection.destroy(); - } - }); - - // When message is ready to be passed on - req.on('end', function() { - if (res.finished) { - return; - } - - // Allow the result to be undefined if so - var result; - - // If data found the work it - either buffer or json - if (dataLen > 0) { - result = new Buffer(dataLen); - // Merge the chunks into one buffer - for (var i = 0, ln = bufferData.length, pos = 0; i < ln; i++) { - bufferData[i].copy(result, pos); - pos += bufferData[i].length; - delete bufferData[i]; - } - // Check if we could be dealing with json - if (result[0] == 0x7b && result[1] === 0x22) { - try { - // Convert the body into json and extract the data object - result = EJSON.parse(result.toString()); - } catch(err) { - // Could not parse so we return the raw data - } - } - } // Else result will be undefined - - try { - callback(result); - } catch(err) { - sendError(res, 500, 'Error in requestHandler callback, Error: ' + (err.stack || err.message) ); - } - }); - -}; - -// This is the simplest handler - it simply passes req stream as data to the -// method -var streamHandler = function(req, res, callback) { - try { - callback(); - } catch(err) { - sendError(res, 500, 'Error in requestHandler callback, Error: ' + (err.stack || err.message) ); - } -}; - -/* - Allow file uploads in cordova cfs -*/ -var setCordovaHeaders = function(request, response) { - var origin = request.headers.origin; - // Match http://localhost: for Cordova clients in Meteor 1.3 - // and http://meteor.local for earlier versions - if (origin && (origin === 'http://meteor.local' || /^http:\/\/localhost/.test(origin))) { - // We need to echo the origin provided in the request - response.setHeader("Access-Control-Allow-Origin", origin); - - response.setHeader("Access-Control-Allow-Methods", "PUT"); - response.setHeader("Access-Control-Allow-Headers", "Content-Type"); - } -}; - -// Handle the actual connection -WebApp.connectHandlers.use(function(req, res, next) { - - // Check to se if this is a http method call - var method = _methodHTTP.getMethod(req._parsedUrl.pathname); - - // If method is null then it wasn't and we pass the request along - if (method === null) { - return next(); - } - - var dataHandle = (method.handle && method.handle.stream)?streamHandler:requestHandler; - - dataHandle(req, res, function(data) { - // If methodsHandler not found or somehow the methodshandler is not a - // function then return a 404 - if (typeof method.handle === 'undefined') { - sendError(res, 404, 'Error HTTP method handler "' + method.name + '" is not found'); - return; - } - - // Set CORS headers for Meteor Cordova clients - setCordovaHeaders(req, res); - - // Set fiber scope - var fiberScope = { - // Pointers to Request / Response - req: req, - res: res, - // Request / Response helpers - statusCode: 200, - method: req.method, - // Headers for response - headers: { - 'Content-Type': 'text/html' // Set default type - }, - // Arguments - data: data, - query: req.query, - params: method.params, - // Method reference - reference: method.name, - methodObject: method.handle, - _streamsWaiting: 0 - }; - - // Helper functions this scope - Fiber = Npm.require('fibers'); - runServerMethod = Fiber(function(self) { - var result, resultBuffer; - - // We fetch methods data from methodsHandler, the handler uses the this.addItem() - // function to populate the methods, this way we have better check control and - // better error handling + messages - - // The scope for the user methodObject callbacks - var thisScope = { - // The user whos id and token was used to run this method, if set/found - userId: null, - // The id of the data - _id: null, - // Set the query params ?token=1&id=2 -> { token: 1, id: 2 } - query: self.query, - // Set params /foo/:name/test/:id -> { name: '', id: '' } - params: self.params, - // Method GET, PUT, POST, DELETE, HEAD - method: self.method, - // User agent - userAgent: req.headers['user-agent'], - // All request headers - requestHeaders: req.headers, - // Add the request object it self - request: req, - // Set the userId - setUserId: function(id) { - this.userId = id; - }, - // We dont simulate / run this on the client at the moment - isSimulation: false, - // Run the next method in a new fiber - This is default at the moment - unblock: function() {}, - // Set the content type in header, defaults to text/html? - setContentType: function(type) { - self.headers['Content-Type'] = type; - }, - setStatusCode: function(code) { - self.statusCode = code; - }, - addHeader: function(key, value) { - self.headers[key] = value; - }, - createReadStream: function() { - self._streamsWaiting++; - return req; - }, - createWriteStream: function() { - self._streamsWaiting++; - return res; - }, - Error: function(err) { - - if (err instanceof Meteor.Error) { - // Return controlled error - sendError(res, err.error, err.message); - } else if (err instanceof Error) { - // Return error trace - this is not intented - sendError(res, 503, 'Error in method "' + self.reference + '", Error: ' + (err.stack || err.message) ); - } else { - sendError(res, 503, 'Error in method "' + self.reference + '"' ); - } - - }, - // getData: function() { - // // XXX: TODO if we could run the request handler stuff eg. - // // in here in a fiber sync it could be cool - and the user did - // // not have to specify the stream=true flag? - // } - }; - - // This function sends the final response. Depending on the - // timing of the streaming, we might have to wait for all - // streaming to end, or we might have to wait for this function - // to finish after streaming ends. The checks in this function - // and the fact that we call it twice ensure that we will always - // send the response if we haven't sent an error response, but - // we will not send it too early. - function sendResponseIfDone() { - res.statusCode = self.statusCode; - // If no streams are waiting - if (self._streamsWaiting === 0 && - (self.statusCode === 200 || self.statusCode === 206) && - self.done && - !self._responseSent && - !res.finished) { - self._responseSent = true; - res.end(resultBuffer); - } - } - - var methodCall = self.methodObject[self.method]; - - // If the method call is set for the POST/PUT/GET or DELETE then run the - // respective methodCall if its a function - if (typeof methodCall === 'function') { - - // Get the userId - This is either set as a method specific handler and - // will allways default back to the builtin getUserId handler - try { - // Try to set the userId - thisScope.userId = self.methodObject.auth.apply(self); - } catch(err) { - sendError(res, err.error, (err.message || err.stack)); - return; - } - - // This must be attached before there's any chance of `createReadStream` - // or `createWriteStream` being called, which means before we do - // `methodCall.apply` below. - req.on('end', function() { - self._streamsWaiting--; - sendResponseIfDone(); - }); - - // Get the result of the methodCall - try { - if (self.method === 'OPTIONS') { - result = methodCall.apply(thisScope, [self.methodObject]) || ''; - } else { - result = methodCall.apply(thisScope, [self.data]) || ''; - } - } catch(err) { - if (err instanceof Meteor.Error) { - // Return controlled error - sendError(res, err.error, err.message); - } else { - // Return error trace - this is not intented - sendError(res, 503, 'Error in method "' + self.reference + '", Error: ' + (err.stack || err.message) ); - } - return; - } - - // Set headers - _.each(self.headers, function(value, key) { - // If value is defined then set the header, this allows for unsetting - // the default content-type - if (typeof value !== 'undefined') - res.setHeader(key, value); - }); - - // If OK / 200 then Return the result - if (self.statusCode === 200 || self.statusCode === 206) { - - if (self.method !== "HEAD") { - // Return result - if (typeof result === 'string') { - resultBuffer = new Buffer(result); - } else { - resultBuffer = new Buffer(JSON.stringify(result)); - } - - // Check if user wants to overwrite content length for some reason? - if (typeof self.headers['Content-Length'] === 'undefined') { - self.headers['Content-Length'] = resultBuffer.length; - } - - } - - self.done = true; - sendResponseIfDone(); - - } else { - // Allow user to alter the status code and send a message - sendError(res, self.statusCode, result); - } - - } else { - sendError(res, 404, 'Service not found'); - } - - - }); - // Run http methods handler - try { - runServerMethod.run(fiberScope); - } catch(err) { - sendError(res, 500, 'Error running the server http method handler, Error: ' + (err.stack || err.message)); - } - - }); // EO Request handler - - -}); diff --git a/packages/wekan-cfs-http-methods/http.methods.tests.js b/packages/wekan-cfs-http-methods/http.methods.tests.js deleted file mode 100644 index 7157feb18..000000000 --- a/packages/wekan-cfs-http-methods/http.methods.tests.js +++ /dev/null @@ -1,117 +0,0 @@ -function equals(a, b) { - return EJSON.stringify(a) === EJSON.stringify(b); -} - -Tinytest.add('http-methods - test environment', function(test) { - test.isTrue(typeof _methodHTTP !== 'undefined', 'test environment not initialized _methodHTTP'); - test.isTrue(typeof HTTP !== 'undefined', 'test environment not initialized HTTP'); - test.isTrue(typeof HTTP.methods !== 'undefined', 'test environment not initialized HTTP.methods'); - -}); - -Tinytest.add('http-methods - nameFollowsConventions', function(test) { - test.isFalse(_methodHTTP.nameFollowsConventions(), 'Tested methods naming convention 1'); - test.isFalse(_methodHTTP.nameFollowsConventions(''), 'Tested methods naming convention 2'); - test.isFalse(_methodHTTP.nameFollowsConventions({}), 'Tested methods naming convention 3'); - test.isFalse(_methodHTTP.nameFollowsConventions([1]), 'Tested methods naming convention 4'); - test.isFalse(_methodHTTP.nameFollowsConventions(-1), 'Tested methods naming convention 5'); - test.isFalse(_methodHTTP.nameFollowsConventions(1), 'Tested methods naming convention 6'); - test.isFalse(_methodHTTP.nameFollowsConventions(0.1), 'Tested methods naming convention 7'); - test.isFalse(_methodHTTP.nameFollowsConventions(-0.1), 'Tested methods naming convention 8'); - - test.isTrue(_methodHTTP.nameFollowsConventions('/test/test'), 'Tested methods naming convention leading slash'); - test.isTrue(_methodHTTP.nameFollowsConventions('test/test'), 'Tested methods naming convention'); -}); - -Tinytest.add('http-methods - getNameList', function(test) { - test.equal(EJSON.stringify(_methodHTTP.getNameList()), '[]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('')), '[]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('/')), '[]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('//')), '["",""]', 'Name list failed'); - - test.equal(EJSON.stringify(_methodHTTP.getNameList('/1/')), '["1",""]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('/1/2')), '["1","2"]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('/1/:name/2')), '["1",":name","2"]', 'Name list failed'); - test.equal(EJSON.stringify(_methodHTTP.getNameList('/1//2')), '["1","","2"]', 'Name list failed'); -}); - - -Tinytest.add('http-methods - createObject', function(test) { - test.equal(EJSON.stringify(_methodHTTP.createObject()), '{}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(2, 4)), '{}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['foo'], [])), '{"foo":""}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['foo'], ['bar'])), '{"foo":"bar"}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['foo'], [3])), '{"foo":"3"}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['foo'], ['bar', 3])), '{"foo":"bar"}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['foo', 'foo'], ['bar', 3])), '{"foo":"3"}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject([''], ['bar', 3])), '{"":"bar"}', 'createObject failed'); - test.equal(EJSON.stringify(_methodHTTP.createObject(['', ''], ['bar', 3])), '{"":"3"}', 'createObject failed'); -}); - -Tinytest.add('http-methods - addToMethodTree', function(test) { - var original = _methodHTTP.methodTree; - _methodHTTP.methodTree = {}; - _methodHTTP.addToMethodTree('login'); - test.equal(EJSON.stringify(_methodHTTP.methodTree), '{"login":{":ref":{"name":"/login/","params":[]}}}', 'addToMethodTree failed'); - - _methodHTTP.methodTree = {}; - _methodHTTP.addToMethodTree('/foo/bar'); - test.equal(EJSON.stringify(_methodHTTP.methodTree), '{"foo":{"bar":{":ref":{"name":"/foo/bar/","params":[]}}}}', 'addToMethodTree failed'); - - _methodHTTP.methodTree = {}; - _methodHTTP.addToMethodTree('/foo/:name/bar'); - test.equal(EJSON.stringify(_methodHTTP.methodTree), '{"foo":{":value":{"bar":{":ref":{"name":"/foo/:value/bar/","params":["name"]}}}}}', 'addToMethodTree failed'); - - _methodHTTP.addToMethodTree('/foo/:name/bar'); - test.equal(EJSON.stringify(_methodHTTP.methodTree), '{"foo":{":value":{"bar":{":ref":{"name":"/foo/:value/bar/","params":["name"]}}}}}', 'addToMethodTree failed'); - - _methodHTTP.addToMethodTree('/foo/name/bar'); - test.equal(EJSON.stringify(_methodHTTP.methodTree), '{"foo":{":value":{"bar":{":ref":{"name":"/foo/:value/bar/","params":["name"]}}},"name":{"bar":{":ref":{"name":"/foo/name/bar/","params":[]}}}}}', 'addToMethodTree failed'); - - _methodHTTP.methodTree = original; -}); - -Tinytest.add('http-methods - getMethod', function(test) { - // Basic tests - test.equal(EJSON.stringify(_methodHTTP.getMethod('')), 'null', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('//')), 'null', 'getMethod failed'); - - _methodHTTP.addToMethodTree('login'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login')), '{"name":"/login/","params":{}}', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('/login')), '{"name":"/login/","params":{}}', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login/')), 'null', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('/login/')), 'null', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login/test')), 'null', 'getMethod failed'); - - _methodHTTP.addToMethodTree('/login/'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login')), '{"name":"/login/","params":{}}', 'getMethod failed'); - - // - - _methodHTTP.addToMethodTree('/login/foo'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login/foo')), '{"name":"/login/foo/","params":{}}', 'getMethod failed'); - - _methodHTTP.addToMethodTree('/login/:name/foo'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login/bar/foo')), '{"name":"/login/:value/foo/","params":{"name":"bar"}}', 'getMethod failed'); - test.equal(EJSON.stringify(_methodHTTP.getMethod('login/foo')), '{"name":"/login/foo/","params":{}}', 'getMethod failed'); - -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equal(actual, expected, message, not) -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) diff --git a/packages/wekan-cfs-http-methods/package.js b/packages/wekan-cfs-http-methods/package.js deleted file mode 100644 index dc1266407..000000000 --- a/packages/wekan-cfs-http-methods/package.js +++ /dev/null @@ -1,31 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-http-methods.git', - name: 'wekan-cfs-http-methods', - version: '0.0.32', - summary: 'Adds HTTP.methods RESTful' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use(['webapp', 'underscore', 'ejson'], 'server'); - - api.use('http', { weak: true }); - - api.export && api.export('HTTP'); - - api.export && api.export('_methodHTTP', { testOnly: true }); - - api.addFiles('http.methods.client.api.js', 'client'); - api.addFiles('http.methods.server.api.js', 'server'); - -}); - -Package.onTest(function (api) { - api.use('wekan-cfs-http-methods', ['server']); - api.use('test-helpers', 'server'); - api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', - 'random', 'deps']); - - api.addFiles('http.methods.tests.js', 'server'); -}); diff --git a/packages/wekan-cfs-http-publish/.editorconfig b/packages/wekan-cfs-http-publish/.editorconfig deleted file mode 100644 index 37a7d486e..000000000 --- a/packages/wekan-cfs-http-publish/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# .editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true diff --git a/packages/wekan-cfs-http-publish/.gitignore b/packages/wekan-cfs-http-publish/.gitignore deleted file mode 100644 index 29c66e308..000000000 --- a/packages/wekan-cfs-http-publish/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/versions.json -.build* -smart.lock -/nbproject/ \ No newline at end of file diff --git a/packages/wekan-cfs-http-publish/.jshintrc b/packages/wekan-cfs-http-publish/.jshintrc deleted file mode 100644 index 52d24acf2..000000000 --- a/packages/wekan-cfs-http-publish/.jshintrc +++ /dev/null @@ -1,97 +0,0 @@ -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr": 50, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "forin": true, - "immed": false, - "indent": 2, - "latedef": false, - "newcap": false, - "noarg": true, - "noempty": true, - "nonew": false, - "plusplus": false, - "quotmark": false, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "maxparams": false, - "maxdepth": false, - "maxstatements": false, - "maxcomplexity": false, - "maxlen": 80, - "asi": false, - "boss": false, - "debug": false, - "eqnull": false, - "es5": false, - "esnext": false, - "moz": false, - "evil": false, - "expr": false, - "funcscope": false, - "globalstrict": true, - "iterator": false, - "lastsemic": false, - "laxbreak": false, - "laxcomma": false, - "loopfunc": false, - "multistr": false, - "proto": false, - "scripturl": false, - "smarttabs": false, - "shadow": false, - "sub": false, - "supernew": false, - "validthis": false, - "browser": true, - "couch": false, - "devel": true, - "dojo": false, - "jquery": false, - "mootools": false, - "node": false, - "nonstandard": false, - "prototypejs": false, - "rhino": false, - "worker": false, - "wsh": false, - "yui": false, - "nomen": false, - "onevar": false, - "passfail": false, - "white": false, - "predef": [ - "Meteor", - "Accounts", - "Session", - "Template", - "check", - "Match", - "Deps", - "EJSON", - "Email", - "Package", - "Tinytest", - "Npm", - "Assets", - "Packages", - "process", - "LocalCollection", - "_", - "Random", - "HTTP", - "_methodHTTP" - ] -} \ No newline at end of file diff --git a/packages/wekan-cfs-http-publish/.travis.yml b/packages/wekan-cfs-http-publish/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-http-publish/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-http-publish/LICENSE.md b/packages/wekan-cfs-http-publish/LICENSE.md deleted file mode 100644 index 2a5c5339e..000000000 --- a/packages/wekan-cfs-http-publish/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-http-publish/README.md b/packages/wekan-cfs-http-publish/README.md deleted file mode 100644 index 33ff66c49..000000000 --- a/packages/wekan-cfs-http-publish/README.md +++ /dev/null @@ -1,129 +0,0 @@ -wekan-cfs-http-publish [![Build Status](https://travis-ci.org/CollectionFS/Meteor-http-publish.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-http-publish) -============ - -This package add the ability to add `HTTP` server publish to your project. It's a server-side package only. - -DEPRECATING: Use https://atmospherejs.com/simple/rest instead - -## Usage -HTTP.publish creates a http crud restpoint for a collection *- only one cursor is allowed pr. publish* - -### Security -`CRUD+L` - Create Read Update Delete + List are common rest point operations. - -All `CUD` methods are the exact same as the `ddp` methods handlers - This means that `Meteor.allow` and `Meteor.deny` are setting the access rules for both `ddp` and `http` collection methods. - -All `R+L` methods are limited to the publish function. - -### Fully mounted -If handed a collection and a publish function the HTTP.publish will mount on follow urls and methods: -* `GET` - `/api/list` *- all published data* -* `POST` - `/api/list` *- insert a document into collection* -* `GET` - `/api/list/:id` *- find one published document* -* `PUT` - `/api/list/:id` *- update a document* -* `DELETE` - `/api/list/:id` *- remove a document* - -```js - myCollection = new Meteor.Collection('list'); - - // Add access points for `GET`, `POST`, `PUT`, `DELETE` - HTTP.publish({collection: myCollection}, function(data) { - // this.userId, this.query, this.params - return myCollection.find({}); - }); -``` - -### Publish view only -If handed a mount name and a publish function the HTTP.publish will mount: -* `GET` - `/mylist` *- all published data* - -```js - myCollection = new Meteor.Collection('list'); - - // Add access points for `GET` - HTTP.publish({name: 'mylist'}, function(data) { - // this.userId, this.query, this.params - return myCollection.find({}); - }); -``` - -### Create Update Delete only -If handed a collection only the HTTP.publish will mount: -* `POST` - `/api/list` *- insert a document into collection* -* `PUT` - `/api/list/:id` *- update a document* -* `DELETE` - `/api/list/:id` *- remove a document* - -```js - myCollection = new Meteor.Collection('list'); - - // Add access points for `POST`, `PUT`, `DELETE` - HTTP.publish({collection: myCollection}); -``` - -## Publish scope -The publish scope contains different kinds of inputs. We can also get user details if logged in. - -* `this.userId` The user whos id and token was used to run this method, if set/found -* `this.query` - query params `?token=1` -> { token: 1 } -* `this.params` - Set params /foo/:name/test/:id -> { name: '', id: '' } - -## Passing data via header -From the client: -```js - HTTP.get('/api/list', { - data: { foo: 'bar' } - }, function(err, result) { - console.log('Content in parsed json: '); - console.log(result.data); - }); -``` - -HTTP Server method: -```js - HTTP.publish({collection: myCollection}, function(data) { - // data === { foo: 'bar' } - }); -``` - -## Authentication -For details on authentication of http calls please read the [Authentication part in HTTP.methods package](https://github.com/raix/Meteor-http-methods#authentication) - -*The publish will have the `this.userId` set if an authenticated user is making the request.* - -## Format handlers -The query parametre `format` is used to set different output formats. The buildin format is `json` *(EJSON since we are on Meteor)* - -Example: *(`json` is buildin)* -```js - // Format the output into json - HTTP.publishFormats({ - 'json': function(result) { - // Set the method scope content type to json - this.setContentType('application/json'); - // Return EJSON string - return EJSON.stringify(result); - } - }); -``` - -`GET` url: `/api/list?format=json` -```js - HTTP.get('/api/list', { - params: { - format: 'json' - } - }, function(err, result) { - console.log('Back from update'); - if (err) { - console.log('Got error'); - } - console.log('Got json back: ' + result.content); - }); -``` - -## Unpublish -For `api` integrity theres added an `HTTP.unpublish` method that takes a collection or name of mount point to remove. - -## API Documentation - -[Here](api.md) diff --git a/packages/wekan-cfs-http-publish/api.md b/packages/wekan-cfs-http-publish/api.md deleted file mode 100644 index b6ca5c8dd..000000000 --- a/packages/wekan-cfs-http-publish/api.md +++ /dev/null @@ -1,153 +0,0 @@ -## http-publish Public API ## - -Adds HTTP.publish and HTTP.unpublish RESTful - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -- - -### _publishHTTP {any}  Server ### - -``` -GET /note -GET /note/:id -POST /note -PUT /note/:id -DELETE /note/:id -``` - -> ```_publishHTTP = { ...``` [http.publish.server.api.js:20](http.publish.server.api.js#L20) - - - -- -Could be cool if we could serve some api doc or even an api script -user could do and be served -a client-side javascript api? -Eg. -HTTP.api.note.create(); -HTTP.api.login(username, password); -HTTP.api.logout -- - -### *http*.publishFormats(newHandlers)  Server ### - -*This method __publishFormats__ is defined in `HTTP`* - -__Arguments__ - -* __newHandlers__ *{Object}* - -__Returns__ *{undefined}* - - -Add publish formats. Example: -```js -HTTP.publishFormats({ -json: function(inputObject) { -// Set the method scope content type to json -this.setContentType('application/json'); -// Return EJSON string -return EJSON.stringify(inputObject); -} -}); -``` - -> ```HTTP.publishFormats = function httpPublishFormats(newHandlers) { ...``` [http.publish.server.api.js:215](http.publish.server.api.js#L215) - - -- - -### *http*.publish(options, [name], [collection], [publishFunc])  Server ### - -*This method __publish__ is defined in `HTTP`* - -__Arguments__ - -* __options__ *{Object}* - * __defaultFormat__ *{String}* (Optional, Default = 'json') - - Format to use for responses when `format` is not found in the query string. - - * __collectionGet__ *{String}* (Optional, Default = true) - - Add GET restpoint for collection? Requires a publish function. - - * __collectionPost__ *{String}* (Optional, Default = true) - - Add POST restpoint for adding documents to the collection? - - * __documentGet__ *{String}* (Optional, Default = true) - - Add GET restpoint for documents in collection? Requires a publish function. - - * __documentPut__ *{String}* (Optional, Default = true) - - Add PUT restpoint for updating a document in the collection? - - * __documentDelete__ *{String}* (Optional, Default = true) - - Add DELETE restpoint for deleting a document in the collection? - -* __name__ *{String}* (Optional) - - Restpoint name (url prefix). Optional if `collection` is passed. Will mount on `/api/collectionName` by default. - -* __collection__ *{[Meteor.Collection](#Meteor.Collection)}* (Optional) - - Meteor.Collection instance. Required for all restpoints except collectionGet - -* __publishFunc__ *{Function}* (Optional) - - A publish function. Required to mount GET restpoints. - - -__Returns__ *{undefined}* - - -Publishes one or more restpoints, mounted on "name" ("/api/collectionName/" -by default). The GET restpoints are subscribed to the document set (cursor) -returned by the publish function you supply. The other restpoints forward -requests to Meteor's built-in DDP methods (insert, update, remove), meaning -that full allow/deny security is automatic. - -__Usage:__ - -Publish only: - -HTTP.publish({name: 'mypublish'}, publishFunc); - -Publish and mount crud rest point for collection /api/myCollection: - -HTTP.publish({collection: myCollection}, publishFunc); - -Mount CUD rest point for collection and documents without GET: - -HTTP.publish({collection: myCollection}); - - -> ```HTTP.publish = function httpPublish(options, publishFunc) { ...``` [http.publish.server.api.js:256](http.publish.server.api.js#L256) - - -- - -### *http*.unpublish([name])  Server ### - -*This method __unpublish__ is defined in `HTTP`* - -__Arguments__ - -* __name__ *{String|[Meteor.Collection](#Meteor.Collection)}* (Optional) - - The method name or collection - - -__Returns__ *{undefined}* - - -Unpublishes all HTTP methods that were published with the given name or -for the given collection. Call with no arguments to unpublish all. - -> ```HTTP.unpublish = _publishHTTP.unpublish;``` [http.publish.server.api.js:453](http.publish.server.api.js#L453) - - diff --git a/packages/wekan-cfs-http-publish/http.publish.client.api.js b/packages/wekan-cfs-http-publish/http.publish.client.api.js deleted file mode 100644 index 62339351c..000000000 --- a/packages/wekan-cfs-http-publish/http.publish.client.api.js +++ /dev/null @@ -1,12 +0,0 @@ -// Client-side is not implemented -HTTP.publish = function() { - throw new Error('HTTP.publish not implemented on client-side'); -}; - -HTTP.publishFormats = function() { - throw new Error('HTTP.publishFormats not implemented on client-side'); -}; - -HTTP.unpublish = function() { - throw new Error('HTTP.unpublish not implemented on client-side'); -}; diff --git a/packages/wekan-cfs-http-publish/http.publish.server.api.js b/packages/wekan-cfs-http-publish/http.publish.server.api.js deleted file mode 100644 index 6fcc44854..000000000 --- a/packages/wekan-cfs-http-publish/http.publish.server.api.js +++ /dev/null @@ -1,466 +0,0 @@ -/* - -GET /note -GET /note/:id -POST /note -PUT /note/:id -DELETE /note/:id - -*/ - -// Could be cool if we could serve some api doc or even an api script -// user could do and be served -// a client-side javascript api? -// Eg. -// HTTP.api.note.create(); -// HTTP.api.login(username, password); -// HTTP.api.logout - - -_publishHTTP = {}; - -// Cache the names of all http methods we've published -_publishHTTP.currentlyPublished = []; - -var defaultAPIPrefix = '/api/'; - -/** - * @method _publishHTTP.getPublishScope - * @private - * @param {Object} scope - * @returns {httpPublishGetPublishScope.publishScope} - * - * Creates a nice scope for the publish method - */ -_publishHTTP.getPublishScope = function httpPublishGetPublishScope(scope) { - var publishScope = {}; - publishScope.userId = scope.userId; - publishScope.params = scope.params; - publishScope.query = scope.query; - // TODO: Additional scoping - // publishScope.added - // publishScope.ready - return publishScope; -}; - -_publishHTTP.formatHandlers = {}; - -/** - * @method _publishHTTP.formatHandlers.json - * @private - * @param {Object} result - The result object - * @returns {String} JSON - * - * Formats the output into JSON and sets the appropriate content type on `this` - */ -_publishHTTP.formatHandlers.json = function httpPublishJSONFormatHandler(result) { - // Set the method scope content type to json - this.setContentType('application/json'); - // Return EJSON string - return EJSON.stringify(result); -}; - -/** - * @method _publishHTTP.formatResult - * @private - * @param {Object} result - The result object - * @param {Object} scope - * @param {String} [defaultFormat='json'] - Default format to use if format is not in query string. - * @returns {Any} The formatted result - * - * Formats the result into the format selected by querystring eg. "&format=json" - */ -_publishHTTP.formatResult = function httpPublishFormatResult(result, scope, defaultFormat) { - - // Get the format in lower case and default to json - var format = scope && scope.query && scope.query.format || defaultFormat || 'json'; - - // Set the format handler found - var formatHandlerFound = !!(typeof _publishHTTP.formatHandlers[format] === 'function'); - - // Set the format handler and fallback to default json if handler not found - var formatHandler = _publishHTTP.formatHandlers[(formatHandlerFound) ? format : 'json']; - - // Check if format handler is a function - if (typeof formatHandler !== 'function') { - // We break things the user could have overwritten the default json handler - throw new Error('The default json format handler not found'); - } - - if (!formatHandlerFound) { - scope.setStatusCode(500); - return '{"error":"Format handler for: `' + format + '` not found"}'; - } - - // Execute the format handler - try { - return formatHandler.apply(scope, [result]); - } catch(err) { - scope.setStatusCode(500); - return '{"error":"Format handler for: `' + format + '` Error: ' + err.message + '"}'; - } -}; - -/** - * @method _publishHTTP.error - * @private - * @param {String} statusCode - The status code - * @param {String} message - The message - * @param {Object} scope - * @returns {Any} The formatted result - * - * Responds with error message in the expected format - */ -_publishHTTP.error = function httpPublishError(statusCode, message, scope) { - var result = _publishHTTP.formatResult(message, scope); - scope.setStatusCode(statusCode); - return result; -}; - -/** - * @method _publishHTTP.getMethodHandler - * @private - * @param {Meteor.Collection} collection - The Meteor.Collection instance - * @param {String} methodName - The method name - * @returns {Function} The server method - * - * Returns the DDP connection handler, already setup and secured - */ -_publishHTTP.getMethodHandler = function httpPublishGetMethodHandler(collection, methodName) { - if (collection instanceof Meteor.Collection) { - if (collection._connection && collection._connection.method_handlers) { - return collection._connection.method_handlers[collection._prefix + methodName]; - } else { - throw new Error('HTTP publish does not work with current version of Meteor'); - } - } else { - throw new Error('_publishHTTP.getMethodHandler expected a collection'); - } -}; - -/** - * @method _publishHTTP.unpublishList - * @private - * @param {Array} names - List of method names to unpublish - * @returns {undefined} - * - * Unpublishes all HTTP methods that have names matching the given list. - */ -_publishHTTP.unpublishList = function httpPublishUnpublishList(names) { - if (!names.length) { - return; - } - - // Carry object for methods - var methods = {}; - - // Unpublish the rest points by setting them to false - for (var i = 0, ln = names.length; i < ln; i++) { - methods[names[i]] = false; - } - - HTTP.methods(methods); - - // Remove the names from our list of currently published methods - _publishHTTP.currentlyPublished = _.difference(_publishHTTP.currentlyPublished, names); -}; - -/** - * @method _publishHTTP.unpublish - * @private - * @param {String|Meteor.Collection} [name] - The method name or collection - * @returns {undefined} - * - * Unpublishes all HTTP methods that were published with the given name or - * for the given collection. Call with no arguments to unpublish all. - */ -_publishHTTP.unpublish = function httpPublishUnpublish(/* name or collection, options */) { - - // Determine what method name we're unpublishing - var name = (arguments[0] instanceof Meteor.Collection) ? - defaultAPIPrefix + arguments[0]._name : arguments[0]; - - // Unpublish name and name/id - if (name && name.length) { - _publishHTTP.unpublishList([name, name + '/:id']); - } - - // If no args, unpublish all - else { - _publishHTTP.unpublishList(_publishHTTP.currentlyPublished); - } - -}; - -/** - * @method HTTP.publishFormats - * @public - * @param {Object} newHandlers - * @returns {undefined} - * - * Add publish formats. Example: - ```js - HTTP.publishFormats({ - - json: function(inputObject) { - // Set the method scope content type to json - this.setContentType('application/json'); - // Return EJSON string - return EJSON.stringify(inputObject); - } - - }); - ``` - */ -HTTP.publishFormats = function httpPublishFormats(newHandlers) { - _.extend(_publishHTTP.formatHandlers, newHandlers); -}; - -/** - * @method HTTP.publish - * @public - * @param {Object} options - * @param {String} [name] - Restpoint name (url prefix). Optional if `collection` is passed. Will mount on `/api/collectionName` by default. - * @param {Meteor.Collection} [collection] - Meteor.Collection instance. Required for all restpoints except collectionGet - * @param {String} [options.defaultFormat='json'] - Format to use for responses when `format` is not found in the query string. - * @param {String} [options.collectionGet=true] - Add GET restpoint for collection? Requires a publish function. - * @param {String} [options.collectionPost=true] - Add POST restpoint for adding documents to the collection? - * @param {String} [options.documentGet=true] - Add GET restpoint for documents in collection? Requires a publish function. - * @param {String} [options.documentPut=true] - Add PUT restpoint for updating a document in the collection? - * @param {String} [options.documentDelete=true] - Add DELETE restpoint for deleting a document in the collection? - * @param {Function} [publishFunc] - A publish function. Required to mount GET restpoints. - * @returns {undefined} - * @todo this should use options argument instead of optional args - * - * Publishes one or more restpoints, mounted on "name" ("/api/collectionName/" - * by default). The GET restpoints are subscribed to the document set (cursor) - * returned by the publish function you supply. The other restpoints forward - * requests to Meteor's built-in DDP methods (insert, update, remove), meaning - * that full allow/deny security is automatic. - * - * __Usage:__ - * - * Publish only: - * - * HTTP.publish({name: 'mypublish'}, publishFunc); - * - * Publish and mount crud rest point for collection /api/myCollection: - * - * HTTP.publish({collection: myCollection}, publishFunc); - * - * Mount CUD rest point for collection and documents without GET: - * - * HTTP.publish({collection: myCollection}); - * - */ -HTTP.publish = function httpPublish(options, publishFunc) { - options = _.extend({ - name: null, - auth: null, - collection: null, - defaultFormat: null, - collectionGet: true, - collectionPost: true, - documentGet: true, - documentPut: true, - documentDelete: true - }, options || {}); - - var collection = options.collection; - - // Use provided name or build one - var name = (typeof options.name === "string") ? options.name : defaultAPIPrefix + collection._name; - - // Make sure we have a name - if (typeof name !== "string") { - throw new Error('HTTP.publish expected a collection or name option'); - } - - var defaultFormat = options.defaultFormat; - - // Rig the methods for the CRUD interface - var methods = {}; - - // console.log('HTTP restpoint: ' + name); - - // list and create - methods[name] = {}; - - if (options.collectionGet && publishFunc) { - // Return the published documents - methods[name].get = function(data) { - // Format the scope for the publish method - var publishScope = _publishHTTP.getPublishScope(this); - // Get the publish cursor - var cursor = publishFunc.apply(publishScope, [data]); - - // Check if its a cursor - if (cursor && cursor.fetch) { - // Fetch the data fron cursor - var result = cursor.fetch(); - // Return the data - return _publishHTTP.formatResult(result, this, defaultFormat); - } else { - // We didnt get any - return _publishHTTP.error(200, [], this); - } - }; - } - - if (collection) { - // If we have a collection then add insert method - if (options.collectionPost) { - methods[name].post = function(data) { - var insertMethodHandler = _publishHTTP.getMethodHandler(collection, 'insert'); - // Make sure that _id isset else create a Meteor id - data._id = data._id || Random.id(); - // Create the document - try { - // We should be passed a document in data - insertMethodHandler.apply(this, [data]); - // Return the data - return _publishHTTP.formatResult({ _id: data._id }, this, defaultFormat); - } catch(err) { - // This would be a Meteor.error? - return _publishHTTP.error(err.error, { error: err.message }, this); - } - }; - } - - // We also add the findOne, update and remove methods - methods[name + '/:id'] = {}; - - if (options.documentGet && publishFunc) { - // We have to have a publish method inorder to publish id? The user could - // just write a publish all if needed - better to make this explicit - methods[name + '/:id'].get = function(data) { - // Get the mongoId - var mongoId = this.params.id; - - // We would allways expect a string but it could be empty - if (mongoId !== '') { - - // Format the scope for the publish method - var publishScope = _publishHTTP.getPublishScope(this); - - // Get the publish cursor - var cursor = publishFunc.apply(publishScope, [data]); - - // Result will contain the document if found - var result; - - // Check to see if document is in published cursor - if (cursor) { - cursor.forEach(function(doc) { - if (!result) { - if (doc._id === mongoId) { - result = doc; - } - } - }); - } - - // If the document is found the return - if (result) { - return _publishHTTP.formatResult(result, this, defaultFormat); - } else { - // We do a check to see if the doc id exists - var exists = collection.findOne({ _id: mongoId }); - // If it exists its not published to the user - if (exists) { - // Unauthorized - return _publishHTTP.error(401, { error: 'Unauthorized' }, this); - } else { - // Not found - return _publishHTTP.error(404, { error: 'Document with id ' + mongoId + ' not found' }, this); - } - } - - } else { - return _publishHTTP.error(400, { error: 'Method expected a document id' }, this); - } - }; - } - - if (options.documentPut) { - methods[name + '/:id'].put = function(data) { - // Get the mongoId - var mongoId = this.params.id; - - // We would allways expect a string but it could be empty - if (mongoId !== '') { - - var updateMethodHandler = _publishHTTP.getMethodHandler(collection, 'update'); - // Create the document - try { - // We should be passed a document in data - updateMethodHandler.apply(this, [{ _id: mongoId }, data]); - // Return the data - return _publishHTTP.formatResult({ _id: mongoId }, this, defaultFormat); - } catch(err) { - // This would be a Meteor.error? - return _publishHTTP.error(err.error, { error: err.message }, this); - } - - } else { - return _publishHTTP.error(400, { error: 'Method expected a document id' }, this); - } - }; - } - - if (options.documentDelete) { - methods[name + '/:id'].delete = function(data) { - // Get the mongoId - var mongoId = this.params.id; - - // We would allways expect a string but it could be empty - if (mongoId !== '') { - - var removeMethodHandler = _publishHTTP.getMethodHandler(collection, 'remove'); - // Create the document - try { - // We should be passed a document in data - removeMethodHandler.apply(this, [{ _id: mongoId }]); - // Return the data - return _publishHTTP.formatResult({ _id: mongoId }, this, defaultFormat); - } catch(err) { - // This would be a Meteor.error? - return _publishHTTP.error(err.error, { error: err.message }, this); - } - - } else { - return _publishHTTP.error(400, { error: 'Method expected a document id' }, this); - } - }; - } - - } - - // Authenticate with our own auth method: https://github.com/zcfs/Meteor-http-methods#authentication - if (options.auth) { - if (methods[name]) { - methods[name].auth = options.auth; - } - if (methods[name + '/:id']) { - methods[name + '/:id'].auth = options.auth; - } - } - - // Publish the methods - HTTP.methods(methods); - - // Mark these method names as currently published - _publishHTTP.currentlyPublished = _.union(_publishHTTP.currentlyPublished, _.keys(methods)); - -}; // EO Publish - -/** - * @method HTTP.unpublish - * @public - * @param {String|Meteor.Collection} [name] - The method name or collection - * @returns {undefined} - * - * Unpublishes all HTTP methods that were published with the given name or - * for the given collection. Call with no arguments to unpublish all. - */ -HTTP.unpublish = _publishHTTP.unpublish; \ No newline at end of file diff --git a/packages/wekan-cfs-http-publish/http.publish.tests.client.js b/packages/wekan-cfs-http-publish/http.publish.tests.client.js deleted file mode 100644 index 185abea23..000000000 --- a/packages/wekan-cfs-http-publish/http.publish.tests.client.js +++ /dev/null @@ -1,175 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -list = new Meteor.Collection('list'); -console.log('Client url: ' + Meteor.absoluteUrl('api')); - -Tinytest.add('http-publish - client - test environment', function(test) { - test.isTrue(typeof _publishHTTP === 'undefined', 'test environment not initialized _publishHTTP'); - test.isTrue(typeof HTTP !== 'undefined', 'test environment not initialized HTTP'); - test.isTrue(typeof HTTP.publish !== 'undefined', 'test environment not initialized HTTP.publish'); - test.isTrue(typeof HTTP.unpublish !== 'undefined', 'test environment not initialized HTTP.unpublish'); - test.isTrue(typeof HTTP.publishFormats !== 'undefined', 'test environment not initialized HTTP.publishFormats'); -}); - -Tinytest.addAsync('http-publish - client - clearTest', function (test, onComplete) { - test.isTrue(true); - Meteor.call('clearTest', function(err, result) { - test.isTrue(result); - onComplete(); - }); - test.isTrue(true); -}); - -id = ''; -removedId = ''; - -Tinytest.addAsync('http-publish - client - get list', function (test, onComplete) { - - HTTP.get(Meteor.absoluteUrl('api/list'), function(err, result) { - // Test the length of array result - var len = result.data && result.data.length; - test.isTrue(!!len, 'Result was empty'); - // Get the object - var obj = result.data && result.data[0] || {}; - test.equal(obj.text, 'OK', 'Didnt get the expected result'); - // Set the id for the next test - id = obj._id; - onComplete(); - }); - -}); - -Tinytest.addAsync('http-publish - client - get list from custom prefix', function (test, onComplete) { - - // Now test the one we added with a custom prefix - HTTP.get(Meteor.absoluteUrl('api2/list'), function(err, result) { - // Test the length of array result - var len = result.data && result.data.length; - test.isTrue(!!len, 'Result was empty'); - // Get the object - var obj = result.data && result.data[0] || {}; - test.equal(obj.text, 'OK', 'Didnt get the expected result'); - onComplete(); - }); - -}); - -Tinytest.addAsync('http-publish - client - unmountCustom', function (test, onComplete) { - // Now unmount the methods with custom prefix - test.isTrue(true); - Meteor.call('unmountCustom', function(err, result) { - test.isTrue(result); - onComplete(); - }); - test.isTrue(true); -}); - -Tinytest.addAsync('http-publish - client - custom unmounted', function (test, onComplete) { - - // Now test the one we added with a custom prefix - HTTP.get(Meteor.absoluteUrl('api2/list'), function(err, result) { - test.isTrue(!!err, "Should have received an error since we unmounted the custom rest points"); - onComplete(); - }); - -}); - -Tinytest.addAsync('http-publish - client - put list', function (test, onComplete) { - - test.isTrue(id !== '', 'No id is set?'); - - // Update the data - HTTP.put(Meteor.absoluteUrl('api/list/' + id), { - data: { - $set: { text: 'UPDATED' } - } - }, function(err, result) { - var resultId = result.data && result.data._id; - test.isTrue(resultId !== undefined, 'Didnt get the expected id in result'); - - // Check if data is updated - HTTP.get(Meteor.absoluteUrl('api/list'), function(err, result) { - var len = result.data && result.data.length; - test.isTrue(!!len, 'Result was empty'); - var obj = result.data && result.data[0] || {}; - test.equal(obj.text, 'UPDATED', 'Didnt get the expected result'); - onComplete(); - }); - }); - -}); - -Tinytest.addAsync('http-publish - client - insert/remove list', function (test, onComplete) { - - // Insert a doc - HTTP.post(Meteor.absoluteUrl('api/list'), { - data: { - text: 'INSERTED' - } - }, function(err, result) { - var resultId = result.data && result.data._id; - test.isTrue(resultId !== undefined, 'Didnt get the expected id in result'); - // Delete the doc - HTTP.del(Meteor.absoluteUrl('api/list/' + resultId), function(err, result) { - removedId = result.data && result.data._id; - test.isTrue(removedId !== undefined, 'Didnt get the expected id in result'); - onComplete(); - }); - }); - -}); - -Tinytest.addAsync('http-publish - client - check removed', function (test, onComplete) { - - test.isTrue(removedId !== '', 'No removedId is set?'); - - HTTP.get(Meteor.absoluteUrl('api/list/' + removedId), function(err, result) { - var obj = result.data || {}; - test.isTrue(obj._id === undefined, 'Item was not removed'); - test.isTrue(err.response.statusCode === 404, 'Item was not removed'); - onComplete(); - }); - -}); - -Tinytest.addAsync('http-publish - client - check findOne', function (test, onComplete) { - - test.isTrue(id !== '', 'No id is set?'); - - HTTP.get(Meteor.absoluteUrl('api/list/' + id), function(err, result) { - var obj = result.data || {}; - test.isTrue(obj._id !== undefined, 'expected a document'); - test.isTrue(obj.text === 'UPDATED', 'expected text === UPDATED'); - - onComplete(); - }); - -}); - - - // Check if removedId found - - // Check if id still found - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-http-publish/http.publish.tests.server.js b/packages/wekan-cfs-http-publish/http.publish.tests.server.js deleted file mode 100644 index 94ca58a87..000000000 --- a/packages/wekan-cfs-http-publish/http.publish.tests.server.js +++ /dev/null @@ -1,149 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('http-publish - server - test environment', function(test) { - test.isTrue(typeof _publishHTTP !== 'undefined', 'test environment not initialized _publishHTTP'); - test.isTrue(typeof HTTP !== 'undefined', 'test environment not initialized HTTP'); - test.isTrue(typeof HTTP.publish !== 'undefined', 'test environment not initialized HTTP.publish'); - test.isTrue(typeof HTTP.unpublish !== 'undefined', 'test environment not initialized HTTP.unpublish'); - test.isTrue(typeof HTTP.publishFormats !== 'undefined', 'test environment not initialized HTTP.publishFormats'); - -}); - -list = new Meteor.Collection('list'); -console.log('Server url: ' + Meteor.absoluteUrl()); - -list.allow({ - insert: function() { return true; }, - update: function() { return true; }, - remove: function() { return true; } -}); - -console.log('Rig publish'); -HTTP.publish({collection: list}, function() { - return list.find(); -}); - -// Test custom prefix, too -HTTP.publish({collection: list, name: '/api2/list'}, function() { - return list.find(); -}); - -Meteor.methods({ - clearTest: function() { - console.log('Client called clearTest'); - // Empty test db - list.remove({}); - - // Insert one text - list.insert({ text: 'OK' }); - - // Count - var count = list.find().count(); - - return !!(count === 1); - }, - unmountCustom: function() { - console.log('Client called unmountCustom'); - _publishHTTP.unpublish('/api2/list'); - return true; - } -}); - - -Tinytest.add('http-publish - server - getMethodHandler', function(test) { - - try { - var methodHandler = _publishHTTP.getMethodHandler(list, 'insert'); - - test.isTrue(typeof methodHandler === 'function', 'expected getMethodHandler to return a function'); - - } catch(err) { - test.fail(err.message); - } - -}); - - -Tinytest.add('http-publish - server - formatHandlers', function(test) { - - test.isTrue(typeof _publishHTTP.formatHandlers.json === 'function', 'Cant find formatHandler for json'); - - var testScope = { - code: 0, - setContentType: function(code) { - this.code = code; - } - }; - var resultFormatHandler = _publishHTTP.formatHandlers.json.apply(testScope, [{test:'ok'}]); - - test.equal(testScope.code, 'application/json', 'json formatHandler have not set setContentType'); - - test.equal(resultFormatHandler, '{"test":"ok"}', 'json formatHandler returned a bad result'); - -}); - -Tinytest.add('http-publish - server - getPublishScope', function(test) { - - var oldScope = { - userId: '1', - params: '2', - query: '3', - oldStuff: 'hmmm' - }; - - var newScope = _publishHTTP.getPublishScope(oldScope); - - test.isUndefined(newScope.oldStuff, 'This oldStuff should not be in the new scope'); - - test.equal(newScope.userId, '1', 'userId not set in the new scope'); - test.equal(newScope.params, '2', 'params not set in the new scope'); - test.equal(newScope.query, '3', 'query not set in the new scope'); - -}); - -Tinytest.add('http-publish - server - formatResult', function(test) { - - var oldScope = { - statusCode: 200, - userId: '1', - params: '2', - query: '3', - oldStuff: 'hmmm', - setStatusCode: function(code) { - this.statusCode = code; - }, - code: 0, - setContentType: function(code) { - this.code = code; - } - }; - - var result = _publishHTTP.formatResult({test: 'ok'}, oldScope); - - test.equal(oldScope.code, 'application/json', 'json formatHandler have not set setContentType'); - - test.equal(result, '{"test":"ok"}', 'json formatHandler returned a bad result'); - -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-http-publish/internal.api.md b/packages/wekan-cfs-http-publish/internal.api.md deleted file mode 100644 index ce31a3e53..000000000 --- a/packages/wekan-cfs-http-publish/internal.api.md +++ /dev/null @@ -1,330 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["http.publish.server.api.js"](http.publish.server.api.js) Where: {server}__ - -*** - -### _publishHTTP {any}  Server ### - -``` -GET /note -GET /note/:id -POST /note -PUT /note/:id -DELETE /note/:id -``` - -> ```_publishHTTP = { ...``` [http.publish.server.api.js:20](http.publish.server.api.js#L20) - - - -- -Could be cool if we could serve some api doc or even an api script -user could do and be served -a client-side javascript api? -Eg. -HTTP.api.note.create(); -HTTP.api.login(username, password); -HTTP.api.logout -- - -### *_publishhttp*.getPublishScope(scope)  Server ### - -*This method is private* -*This method __getPublishScope__ is defined in `_publishHTTP`* - -__Arguments__ - -* __scope__ *{Object}* - -__Returns__ *{httpPublishGetPublishScope.publishScope}* - - -Creates a nice scope for the publish method - -> ```_publishHTTP.getPublishScope = function httpPublishGetPublishScope(scope) { ...``` [http.publish.server.api.js:35](http.publish.server.api.js#L35) - - -- - -### *_publishhttpformathandlers*.json(result)  Server ### - -*This method is private* -*This method __json__ is defined in `_publishHTTP.formatHandlers`* - -__Arguments__ - -* __result__ *{Object}* - - The result object - - -__Returns__ *{String}* -JSON - - -Formats the output into JSON and sets the appropriate content type on `this` - -> ```_publishHTTP.formatHandlers.json = function httpPublishJSONFormatHandler(result) { ...``` [http.publish.server.api.js:56](http.publish.server.api.js#L56) - - -- - -### *_publishhttp*.formatResult(result, scope, [defaultFormat])  Server ### - -*This method is private* -*This method __formatResult__ is defined in `_publishHTTP`* - -__Arguments__ - -* __result__ *{Object}* - - The result object - -* __scope__ *{Object}* -* __defaultFormat__ *{String}* (Optional, Default = 'json') - - Default format to use if format is not in query string. - - -__Returns__ *{Any}* -The formatted result - - -Formats the result into the format selected by querystring eg. "&format=json" - -> ```_publishHTTP.formatResult = function httpPublishFormatResult(result, scope, defaultFormat) { ...``` [http.publish.server.api.js:73](http.publish.server.api.js#L73) - - -- - -### *_publishhttp*.error(statusCode, message, scope)  Server ### - -*This method is private* -*This method __error__ is defined in `_publishHTTP`* - -__Arguments__ - -* __statusCode__ *{String}* - - The status code - -* __message__ *{String}* - - The message - -* __scope__ *{Object}* - -__Returns__ *{Any}* -The formatted result - - -Responds with error message in the expected format - -> ```_publishHTTP.error = function httpPublishError(statusCode, message, scope) { ...``` [http.publish.server.api.js:114](http.publish.server.api.js#L114) - - -- - -### *_publishhttp*.getMethodHandler(collection, methodName)  Server ### - -*This method is private* -*This method __getMethodHandler__ is defined in `_publishHTTP`* - -__Arguments__ - -* __collection__ *{[Meteor.Collection](#Meteor.Collection)}* - - The Meteor.Collection instance - -* __methodName__ *{String}* - - The method name - - -__Returns__ *{Function}* -The server method - - -Returns the DDP connection handler, already setup and secured - -> ```_publishHTTP.getMethodHandler = function httpPublishGetMethodHandler(collection, methodName) { ...``` [http.publish.server.api.js:129](http.publish.server.api.js#L129) - - -- - -### *_publishhttp*.unpublishList(names)  Server ### - -*This method is private* -*This method __unpublishList__ is defined in `_publishHTTP`* - -__Arguments__ - -* __names__ *{Array}* - - List of method names to unpublish - - -__Returns__ *{undefined}* - - -Unpublishes all HTTP methods that have names matching the given list. - -> ```_publishHTTP.unpublishList = function httpPublishUnpublishList(names) { ...``` [http.publish.server.api.js:149](http.publish.server.api.js#L149) - - -- - -### *_publishhttp*.unpublish([name])  Server ### - -*This method is private* -*This method __unpublish__ is defined in `_publishHTTP`* - -__Arguments__ - -* __name__ *{String|[Meteor.Collection](#Meteor.Collection)}* (Optional) - - The method name or collection - - -__Returns__ *{undefined}* - - -Unpublishes all HTTP methods that were published with the given name or -for the given collection. Call with no arguments to unpublish all. - -> ```_publishHTTP.unpublish = function httpPublishUnpublish(``` [http.publish.server.api.js:177](http.publish.server.api.js#L177) - - -- - -### *http*.publishFormats(newHandlers)  Server ### - -*This method __publishFormats__ is defined in `HTTP`* - -__Arguments__ - -* __newHandlers__ *{Object}* - -__Returns__ *{undefined}* - - -Add publish formats. Example: -```js -HTTP.publishFormats({ -json: function(inputObject) { -// Set the method scope content type to json -this.setContentType('application/json'); -// Return EJSON string -return EJSON.stringify(inputObject); -} -}); -``` - -> ```HTTP.publishFormats = function httpPublishFormats(newHandlers) { ...``` [http.publish.server.api.js:215](http.publish.server.api.js#L215) - - -- - -### *http*.publish(options, [name], [collection], [publishFunc])  Server ### - -*This method __publish__ is defined in `HTTP`* - -__Arguments__ - -* __options__ *{Object}* - * __defaultFormat__ *{String}* (Optional, Default = 'json') - - Format to use for responses when `format` is not found in the query string. - - * __collectionGet__ *{String}* (Optional, Default = true) - - Add GET restpoint for collection? Requires a publish function. - - * __collectionPost__ *{String}* (Optional, Default = true) - - Add POST restpoint for adding documents to the collection? - - * __documentGet__ *{String}* (Optional, Default = true) - - Add GET restpoint for documents in collection? Requires a publish function. - - * __documentPut__ *{String}* (Optional, Default = true) - - Add PUT restpoint for updating a document in the collection? - - * __documentDelete__ *{String}* (Optional, Default = true) - - Add DELETE restpoint for deleting a document in the collection? - -* __name__ *{String}* (Optional) - - Restpoint name (url prefix). Optional if `collection` is passed. Will mount on `/api/collectionName` by default. - -* __collection__ *{[Meteor.Collection](#Meteor.Collection)}* (Optional) - - Meteor.Collection instance. Required for all restpoints except collectionGet - -* __publishFunc__ *{Function}* (Optional) - - A publish function. Required to mount GET restpoints. - - -__Returns__ *{undefined}* - -__TODO__ -``` -* this should use options argument instead of optional args -``` - - -Publishes one or more restpoints, mounted on "name" ("/api/collectionName/" -by default). The GET restpoints are subscribed to the document set (cursor) -returned by the publish function you supply. The other restpoints forward -requests to Meteor's built-in DDP methods (insert, update, remove), meaning -that full allow/deny security is automatic. - -__Usage:__ - -Publish only: - -HTTP.publish({name: 'mypublish'}, publishFunc); - -Publish and mount crud rest point for collection /api/myCollection: - -HTTP.publish({collection: myCollection}, publishFunc); - -Mount CUD rest point for collection and documents without GET: - -HTTP.publish({collection: myCollection}); - - -> ```HTTP.publish = function httpPublish(options, publishFunc) { ...``` [http.publish.server.api.js:256](http.publish.server.api.js#L256) - - -- - -### *http*.unpublish([name])  Server ### - -*This method __unpublish__ is defined in `HTTP`* - -__Arguments__ - -* __name__ *{String|[Meteor.Collection](#Meteor.Collection)}* (Optional) - - The method name or collection - - -__Returns__ *{undefined}* - - -Unpublishes all HTTP methods that were published with the given name or -for the given collection. Call with no arguments to unpublish all. - -> ```HTTP.unpublish = _publishHTTP.unpublish;``` [http.publish.server.api.js:453](http.publish.server.api.js#L453) - - diff --git a/packages/wekan-cfs-http-publish/package.js b/packages/wekan-cfs-http-publish/package.js deleted file mode 100644 index 7a16373cc..000000000 --- a/packages/wekan-cfs-http-publish/package.js +++ /dev/null @@ -1,34 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-http-publish.git', - name: 'wekan-cfs-http-publish', - version: '0.0.13', - summary: 'Adds HTTP.publish and HTTP.unpublish RESTful' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use(['webapp', 'underscore', 'ejson', 'random'], 'server'); - - api.use('wekan-cfs-http-methods@0.0.27'); - - api.imply && api.imply('wekan-cfs-http-methods'); - - api.export && api.export('_publishHTTP', { testOnly: true }); - - api.addFiles('http.publish.client.api.js', 'client'); - api.addFiles('http.publish.server.api.js', 'server'); - -}); - -Package.onTest(function (api) { - api.use('wekan-cfs-http-publish', ['client', 'server']); - api.use('test-helpers', ['client', 'server']); - api.use('http', 'client'); - - api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', - 'random', 'deps']); - - api.addFiles('http.publish.tests.server.js', 'server'); - api.addFiles('http.publish.tests.client.js', 'client'); -}); diff --git a/packages/wekan-cfs-http-publish/packages/.gitignore b/packages/wekan-cfs-http-publish/packages/.gitignore deleted file mode 100644 index 3683f43ae..000000000 --- a/packages/wekan-cfs-http-publish/packages/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/http-publish -/http-methods diff --git a/packages/wekan-cfs-power-queue/.editorconfig b/packages/wekan-cfs-power-queue/.editorconfig deleted file mode 100644 index a2cc1c1fe..000000000 --- a/packages/wekan-cfs-power-queue/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# .editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true \ No newline at end of file diff --git a/packages/wekan-cfs-power-queue/.gitignore b/packages/wekan-cfs-power-queue/.gitignore deleted file mode 100644 index dc163f991..000000000 --- a/packages/wekan-cfs-power-queue/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/versions.json -/nbproject/private/ -.build* diff --git a/packages/wekan-cfs-power-queue/.jshintrc b/packages/wekan-cfs-power-queue/.jshintrc deleted file mode 100644 index 2bc2606c4..000000000 --- a/packages/wekan-cfs-power-queue/.jshintrc +++ /dev/null @@ -1,114 +0,0 @@ -//.jshintrc -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : true, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 2, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : true, // true: Requires all functions run in ES5 Strict Mode - "trailing" : true, // true: Prohibit trailing whitespaces - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : 80, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jquery" : false, // jQuery - "mootools" : false, // MooTools - "node" : false, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "rhino" : false, // Rhino - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - //"meteor" : false, // Meteor.js - - // Legacy - "nomen" : false, // true: Prohibit dangling `_` in variables - "onevar" : false, // true: Allow only one `var` statement per function - "passfail" : false, // true: Stop on first error - "white" : false, // true: Check against strict whitespace and indentation rules - - // Custom Globals - "predef" : [ - "Meteor", - "Accounts", - "Session", - "Template", - "check", - "Match", - "Deps", - "EJSON", - "Email", - "Package", - "Tinytest", - "Npm", - "Assets", - "Packages", - "process", - "GroundDB", - "_gDB", - "LocalCollection", - "_", - "Random" - ] // additional predefined global variables -} diff --git a/packages/wekan-cfs-power-queue/.travis.yml b/packages/wekan-cfs-power-queue/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-power-queue/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-power-queue/LICENSE.md b/packages/wekan-cfs-power-queue/LICENSE.md deleted file mode 100644 index 2a5c5339e..000000000 --- a/packages/wekan-cfs-power-queue/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-power-queue/README.md b/packages/wekan-cfs-power-queue/README.md deleted file mode 100644 index 7b889a7c0..000000000 --- a/packages/wekan-cfs-power-queue/README.md +++ /dev/null @@ -1,136 +0,0 @@ -wekan-cfs-power-queue [![Build Status](https://travis-ci.org/CollectionFS/Meteor-powerqueue.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-powerqueue) -========= - -~~Looking for maintainers - please reach out!~~ -This package is to be archived due to inability to find contributors, thanks to everyone who helped make it possible. - -**If you're looking for an alternative, we highly recommend [Meteor-Files](https://github.com/VeliovGroup/Meteor-Files) by [VeliovGroup](https://github.com/VeliovGroup)** - ---- - -PowerQueue is a native Meteor package for memory-backed job queue processing. Features include: -* async tasks -* throttling resource usage -* retrying failed tasks -* managing sub-queues -* powered by Meteor's reactive sugar -* etc. - -PowerQueue can use one of two [spinal-queue](https://github.com/zcfs/Meteor-power-queue/blob/master/spinal-queue.spec.md) packages, [ReactiveList](https://github.com/zcfs/Meteor-reactive-list) or [MicroQueue](https://github.com/zcfs/Meteor-micro-queue). - -## Demos - -**Check out the cool [live queue demo](http://power-queue-test.meteor.com) and [live sub queue example](http://power-queue-sub-test.meteor.com).** - -Source code for both can be found in the two branches of the [power-queue-example repo](https://github.com/zcfs/power-queue-example). - - -Kind regards, -Eric(@aldeed) and Morten(@raix) - -Happy coding! - -# API -All getters and setters are reactive. - -[API Documentation](api.md) - -## Helpers / Getters / Setters: -* PowerQueue.length - Number of tasks in queue -* PowerQueue.progress - Current progress in percent -* PowerQueue.usage - Current load in percent -* PowerQueue.total - Sum of tasks to run in current queue -* PowerQueue.isPaused - True if queue is paused -* PowerQueue.isHalted - True if queue is paused or stopped -* PowerQueue.processing - Number of tasks being processed -* PowerQueue.errors - Failures where task is passed to the errorHandler -* PowerQueue.failures - Number of failures in current queue -* PowerQueue.isRunning - True if queue is active -* PowerQueue.maxProcessing - Getter + Setter for max tasks to run in parallel -* PowerQueue.autostart - Getter + Setter for autostart flag - Allow add task to start the queue -* PowerQueue.maxFailures - Max allowed retries for failing tasks before marked as an error -* options.queue - Use custom micro-queue compatible queue -* options.onEnded - Called when queue has ended -* options.onRelease(remainingTasks) - Called when queue has ended or paused -* options.onAutostart - Called when queue was autostarted - -## Methods -* PowerQueue.add(data) - Add a task to queue -* PowerQueue.run() - Start the queue -* PowerQueue.pause() - Pause the queue -* PowerQueue.resume() - Resume the queue if paused -* PowerQueue.reset() - Reset the queue -* PowerQueue.taskHandler(data, next, failures) - Default task handler, where data is a `function(done)`, can be overwritten -* PowerQueue.errorHandler(data, addTask, failures) - Default error handler, can be overwritten - -# Example 1 -```js - var queue = new PowerQueue({ - isPaused: true - }); - - queue.add(function(done) { - console.log('task 1'); - done(); - }); - queue.add(function(done) { - console.log('task 2'); - done(); - }); - queue.add(function(done) { - console.log('task 3'); - done(); - }); - - console.log('Ready to run queue'); - queue.run(); -``` - -# Example 2 - -This is a very rough example of how to make custom task handling. - -```js - - queue.errorHandler = function(data, addTask) { - // This error handler lets the task drop, but we could use addTask to - // Put the task into the queue again - tasks.update({ _id: data.id }, { $set: { status: 'error'} }); - }; - - queue.taskHandler = function(data, next) { - - // The task is now processed... - tasks.update({ _id: data.id }, { $set: { status: 'processing'} }); - - Meteor.setTimeout(function() { - if (Math.random() > 0.5) { - // We random fail the task - tasks.update({ _id: data.id }, { $set: { status: 'failed'} }); - // Returning error to next - next('Error: Fail task'); - } else { - // We are done! - tasks.update({ _id: data.id }, { $set: { status: 'done'} }); - // Trigger next task - next(); - } - // This async task duration is between 500 - 1000ms - }, Math.round(500 + 500 * Math.random())); - }; - - // Add the task: - var taskId = 0; - queue.add({ id: tasks.insert({ status: 'added', index: ++taskId }) }); -``` - -# Contribute - -Here's the [complete API documentation](internal.api.md), including private methods. - -To update the docs, run `npm install docmeteor` then `docmeteor`. - - -## TODO / Wishlist - -* scheduling jobs to run in the future, like [meteor-queue](https://github.com/artwells/meteor-queue#features) - see [issue #15](https://github.com/zcfs/Meteor-power-queue/issues/15) diff --git a/packages/wekan-cfs-power-queue/api.md b/packages/wekan-cfs-power-queue/api.md deleted file mode 100644 index 435610d8f..000000000 --- a/packages/wekan-cfs-power-queue/api.md +++ /dev/null @@ -1,420 +0,0 @@ - -#### new PowerQueue([options])  Anywhere #### -``` -Creates an instance of a power queue -[Check out demo](http://power-queue-test.meteor.com/) -``` -- - -__Arguments__ - -* __options__ *{object}* (Optional) -Settings - - __filo__ *{boolean}* (Default = false) -Make it a first in last out queue - - __isPaused__ *{boolean}* (Default = false) -Set queue paused - - __autostart__ *{boolean}* (Default = true) -May adding a task start the queue - - __name__ *{string}* (Default = "Queue") -Name of the queue - - __maxProcessing__ *{number}* (Default = 1) -Limit of simultanous running tasks - - __maxFailures__ *{number}* (Default = 5) -Limit retries of failed tasks, if 0 or below we allow infinite failures - - __jumpOnFailure__ *{number}* (Default = true) -Jump to next task and retry failed task later - - __debug__ *{boolean}* (Default = false) -Log verbose messages to the console - - __reactive__ *{boolean}* (Default = true) -Set whether or not this queue should be reactive - - __spinalQueue__ *{[SpinalQueue](spinal-queue.spec.md)}* (Optional) -Set spinal queue uses pr. default `MicroQueue` or `ReactiveList` if added to the project - -- - - - -> ```PowerQueue = function(options) { ...``` [power-queue.js:27](power-queue.js#L27) - -- - -#### *powerqueue*.onEnded  Anywhere #### -- -*This callback __onEnded__ is defined in `PowerQueue`* -Is called when queue is ended - -> ```self.onEnded = options && options.onEnded || function() { ...``` [power-queue.js:103](power-queue.js#L103) - -- - -#### *powerqueue*.onRelease  Anywhere #### -- -*This callback __onRelease__ is defined in `PowerQueue`* -Is called when queue is released - -> ```self.onRelease = options && options.onRelease || function() { ...``` [power-queue.js:110](power-queue.js#L110) - -- - -#### *powerqueue*.onAutostart  Anywhere #### -- -*This callback __onAutostart__ is defined in `PowerQueue`* -Is called when queue is auto started - -> ```self.onAutostart = options && options.onAutostart || function() { ...``` [power-queue.js:115](power-queue.js#L115) - -- - -#### *powerqueue*.total()  Anywhere #### -- -*This method __total__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of tasks added to this queue - -> ```self.total = self._maxLength.get;``` [power-queue.js:123](power-queue.js#L123) - -- - -#### *powerqueue*.isPaused()  Anywhere #### -- -*This method __isPaused__ is defined in `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -Status of the paused state of the queue - -> ```self.isPaused = self._paused.get;``` [power-queue.js:129](power-queue.js#L129) - -- - -#### *powerqueue*.processing()  Anywhere #### -- -*This method __processing__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -Number of tasks currently being processed - -> ```self.processing = self._isProcessing.get;``` [power-queue.js:135](power-queue.js#L135) - -- - -#### *powerqueue*.errors()  Anywhere #### -- -*This method __errors__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of errors -Errors are triggered when [maxFailures](PowerQueue.maxFailures) are exeeded - -> ```self.errors = self._errors.get;``` [power-queue.js:142](power-queue.js#L142) - -- - -#### *powerqueue*.failures()  Anywhere #### -- -*This method __failures__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of failed tasks - -> ```self.failures = self._failures.get;``` [power-queue.js:148](power-queue.js#L148) - -- - -#### *powerqueue*.isRunning()  Anywhere #### -- -*This method __isRunning__ is defined in `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -True if the queue is running -> NOTE: The task can be paused but marked as running - -> ```self.isRunning = self._running.get;``` [power-queue.js:155](power-queue.js#L155) - -- - -#### *powerqueue*.maxProcessing([max])  Anywhere #### -- -*This method __maxProcessing__ is defined in `PowerQueue`* - -__Arguments__ - -* __max__ *{number}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{number}* __(is reactive)__ -Maximum number of simultaneous processing tasks - -Example: -```js - foo.maxProcessing(); // Works as a getter and returns the current value - foo.maxProcessing(20); // This sets the value to 20 -``` - -> ```self.maxProcessing = self._maxProcessing.getset;``` [power-queue.js:168](power-queue.js#L168) - -- - -#### *powerqueue*.autostart([autorun])  Anywhere #### -- -*This method __autostart__ is defined in `PowerQueue`* - -__Arguments__ - -* __autorun__ *{boolean}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{boolean}* __(is reactive)__ -If adding a task may trigger the queue to start - -Example: -```js - foo.autostart(); // Works as a getter and returns the current value - foo.autostart(true); // This sets the value to true -``` - -> ```self.autostart = self._autostart.getset;``` [power-queue.js:189](power-queue.js#L189) - -- - -#### *powerqueue*.maxFailures([max])  Anywhere #### -- -*This method __maxFailures__ is defined in `PowerQueue`* - -__Arguments__ - -* __max__ *{number}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{number}* __(is reactive)__ -The maximum for failures pr. task before triggering an error - -Example: -```js - foo.maxFailures(); // Works as a getter and returns the current value - foo.maxFailures(10); // This sets the value to 10 -``` - -> ```self.maxFailures = self._maxFailures.getset;``` [power-queue.js:202](power-queue.js#L202) - -- - -#### *powerqueue*.processList()  Anywhere #### -- -*This method __processList__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{array}* __(is reactive)__ -List of tasks currently being processed - -> ```PowerQueue.prototype.processingList = function() { ...``` [power-queue.js:209](power-queue.js#L209) - -- - -#### *powerqueue*.isHalted()  Anywhere #### -- -*This method __isHalted__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -True if the queue is not running or paused - -> ```PowerQueue.prototype.isHalted = function() { ...``` [power-queue.js:218](power-queue.js#L218) - -- - -#### *powerqueue*.length()  Anywhere #### -- -*This method __length__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -Number of tasks left in queue to be processed - -> ```PowerQueue.prototype.length = function() { ...``` [power-queue.js:227](power-queue.js#L227) - -- - -#### *powerqueue*.progress()  Anywhere #### -- -*This method __progress__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -0 .. 100 % Indicates the status of the queue - -> ```PowerQueue.prototype.progress = function() { ...``` [power-queue.js:236](power-queue.js#L236) - -- - -#### *powerqueue*.usage()  Anywhere #### -- -*This method __usage__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -0 .. 100 % Indicates ressource usage of the queue - -> ```PowerQueue.prototype.usage = function() { ...``` [power-queue.js:249](power-queue.js#L249) - -- - -#### *powerqueue*.reset()  Anywhere #### -- -*This method __reset__ is defined in `prototype` of `PowerQueue`* -Calling this will: -* stop the queue -* paused to false -* Discart all queue data - -> NOTE: At the moment if the queue has processing tasks they can change -> the `errors` and `failures` counters. This could change in the future or -> be prevented by creating a whole new instance of the `PowerQueue` - -> ```PowerQueue.prototype.reset = function() { ...``` [power-queue.js:264](power-queue.js#L264) - -- - -#### *powerqueue*.add(data, [failures])  Anywhere #### -- -*This method __add__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -The task to be handled -* __failures__ *{number}* (Optional) -Internally used to Pass on number of failures. - -- - -> ```PowerQueue.prototype.add = function(data, failures, id) { ...``` [power-queue.js:316](power-queue.js#L316) - -- - -#### *powerqueue*.next([err])  Anywhere #### -- -*This method __next__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __err__ *{string}* (Optional) -Error message if task failed - -- -> * Can pass in `null` to start the queue -> * Passing in a string to `next` will trigger a failure -> * Passing nothing will simply let the next task run -`next` is handed into the [taskHandler](PowerQueue.taskHandler) as a -callback to mark an error or end of current task - -> ```PowerQueue.prototype.next = function(err) { ...``` [power-queue.js:394](power-queue.js#L394) - -- - -#### *powerqueue*.queueTaskHandler()  Anywhere #### -- -*This method __queueTaskHandler__ is defined in `prototype` of `PowerQueue`* -This method handles tasks that are sub queues - -> ```PowerQueue.prototype.queueTaskHandler = function(subQueue, next, failures) { ...``` [power-queue.js:555](power-queue.js#L555) - -- - -#### *powerqueue*.taskHandler  Anywhere #### -- -*This callback __taskHandler__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -This can be data or functions -* __next__ *{function}* -Function `next` call this to end task -* __failures__ *{number}* -Number of failures on this task - -- - -Default task handler expects functions as data: -```js - self.taskHandler = function(data, next, failures) { - // This default task handler expects invocation to be a function to run - if (typeof data !== 'function') { - throw new Error('Default task handler expects a function'); - } - try { - // Have the function call next - data(next, failures); - } catch(err) { - // Throw to fail this task - next(err); - } - }; -``` - -> ```PowerQueue.prototype.taskHandler = function(data, next, failures) { ...``` [power-queue.js:601](power-queue.js#L601) - -- - -#### *powerqueue*.errorHandler  Anywhere #### -- -*This callback __errorHandler__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -This can be data or functions -* __addTask__ *{function}* -Use this function to insert the data into the queue again -* __failures__ *{number}* -Number of failures on this task - -- - -The default callback: -```js - var foo = new PowerQueue(); - - // Overwrite the default action - foo.errorHandler = function(data, addTask, failures) { - // This could be overwritten the data contains the task data and addTask - // is a helper for adding the task to the queue - // try again: addTask(data); - // console.log('Terminate at ' + failures + ' failures'); - }; -``` - -> ```PowerQueue.prototype.errorHandler = function(data, addTask, failures) { ...``` [power-queue.js:634](power-queue.js#L634) - -- - -#### *powerqueue*.pause()  Anywhere #### -- -*This method __pause__ is defined in `prototype` of `PowerQueue`* - -> ```PowerQueue.prototype.pause = function() { ...``` [power-queue.js:645](power-queue.js#L645) - -- - -#### *powerqueue*.resume()  Anywhere #### -- -*This method __resume__ is defined in `prototype` of `PowerQueue`* - -> This will not start a stopped queue - -> ```PowerQueue.prototype.resume = function() { ...``` [power-queue.js:665](power-queue.js#L665) - -- - -#### *powerqueue*.run()  Anywhere #### -- -*This method __run__ is defined in `prototype` of `PowerQueue`* -> Using this command will resume a paused queue and will -> start a stopped queue. - -> ```PowerQueue.prototype.run = function() { ...``` [power-queue.js:677](power-queue.js#L677) - -- diff --git a/packages/wekan-cfs-power-queue/internal.api.md b/packages/wekan-cfs-power-queue/internal.api.md deleted file mode 100644 index 797f1f454..000000000 --- a/packages/wekan-cfs-power-queue/internal.api.md +++ /dev/null @@ -1,535 +0,0 @@ -> File: ["power-queue.js"](power-queue.js) -> Where: {client|server} - -- - -#### new PowerQueue([options])  Anywhere #### -``` -Creates an instance of a power queue -[Check out demo](http://power-queue-test.meteor.com/) -``` -- - -__Arguments__ - -* __options__ *{object}* (Optional) -Settings - - __filo__ *{boolean}* (Default = false) -Make it a first in last out queue - - __isPaused__ *{boolean}* (Default = false) -Set queue paused - - __autostart__ *{boolean}* (Default = true) -May adding a task start the queue - - __name__ *{string}* (Default = "Queue") -Name of the queue - - __maxProcessing__ *{number}* (Default = 1) -Limit of simultanous running tasks - - __maxFailures__ *{number}* (Default = 5) -Limit retries of failed tasks, if 0 or below we allow infinite failures - - __jumpOnFailure__ *{number}* (Default = true) -Jump to next task and retry failed task later - - __debug__ *{boolean}* (Default = false) -Log verbose messages to the console - - __reactive__ *{boolean}* (Default = true) -Set whether or not this queue should be reactive - - __spinalQueue__ *{[SpinalQueue](spinal-queue.spec.md)}* (Optional) -Set spinal queue uses pr. default `MicroQueue` or `ReactiveList` if added to the project - -- - - - -> ```PowerQueue = function(options) { ...``` [power-queue.js:27](power-queue.js#L27) - -- - -#### *powerqueue*.onEnded  Anywhere #### -- -*This callback __onEnded__ is defined in `PowerQueue`* -Is called when queue is ended - -> ```self.onEnded = options && options.onEnded || function() { ...``` [power-queue.js:103](power-queue.js#L103) - -- - -#### *powerqueue*.onRelease  Anywhere #### -- -*This callback __onRelease__ is defined in `PowerQueue`* -Is called when queue is released - -> ```self.onRelease = options && options.onRelease || function() { ...``` [power-queue.js:110](power-queue.js#L110) - -- - -#### *powerqueue*.onAutostart  Anywhere #### -- -*This callback __onAutostart__ is defined in `PowerQueue`* -Is called when queue is auto started - -> ```self.onAutostart = options && options.onAutostart || function() { ...``` [power-queue.js:115](power-queue.js#L115) - -- - -#### *powerqueue*.total()  Anywhere #### -- -*This method __total__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of tasks added to this queue - -> ```self.total = self._maxLength.get;``` [power-queue.js:123](power-queue.js#L123) - -- - -#### *powerqueue*.isPaused()  Anywhere #### -- -*This method __isPaused__ is defined in `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -Status of the paused state of the queue - -> ```self.isPaused = self._paused.get;``` [power-queue.js:129](power-queue.js#L129) - -- - -#### *powerqueue*.processing()  Anywhere #### -- -*This method __processing__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -Number of tasks currently being processed - -> ```self.processing = self._isProcessing.get;``` [power-queue.js:135](power-queue.js#L135) - -- - -#### *powerqueue*.errors()  Anywhere #### -- -*This method __errors__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of errors -Errors are triggered when [maxFailures](PowerQueue.maxFailures) are exeeded - -> ```self.errors = self._errors.get;``` [power-queue.js:142](power-queue.js#L142) - -- - -#### *powerqueue*.failures()  Anywhere #### -- -*This method __failures__ is defined in `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -The total number of failed tasks - -> ```self.failures = self._failures.get;``` [power-queue.js:148](power-queue.js#L148) - -- - -#### *powerqueue*.isRunning()  Anywhere #### -- -*This method __isRunning__ is defined in `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -True if the queue is running -> NOTE: The task can be paused but marked as running - -> ```self.isRunning = self._running.get;``` [power-queue.js:155](power-queue.js#L155) - -- - -#### *powerqueue*.maxProcessing([max])  Anywhere #### -- -*This method __maxProcessing__ is defined in `PowerQueue`* - -__Arguments__ - -* __max__ *{number}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{number}* __(is reactive)__ -Maximum number of simultaneous processing tasks - -Example: -```js - foo.maxProcessing(); // Works as a getter and returns the current value - foo.maxProcessing(20); // This sets the value to 20 -``` - -> ```self.maxProcessing = self._maxProcessing.getset;``` [power-queue.js:168](power-queue.js#L168) - -- - -#### *powerqueue*.autostart([autorun])  Anywhere #### -- -*This method __autostart__ is defined in `PowerQueue`* - -__Arguments__ - -* __autorun__ *{boolean}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{boolean}* __(is reactive)__ -If adding a task may trigger the queue to start - -Example: -```js - foo.autostart(); // Works as a getter and returns the current value - foo.autostart(true); // This sets the value to true -``` - -> ```self.autostart = self._autostart.getset;``` [power-queue.js:189](power-queue.js#L189) - -- - -#### *powerqueue*.maxFailures([max])  Anywhere #### -- -*This method __maxFailures__ is defined in `PowerQueue`* - -__Arguments__ - -* __max__ *{number}* (Optional) -If not used this function works as a getter - -- - -__Returns__ *{number}* __(is reactive)__ -The maximum for failures pr. task before triggering an error - -Example: -```js - foo.maxFailures(); // Works as a getter and returns the current value - foo.maxFailures(10); // This sets the value to 10 -``` - -> ```self.maxFailures = self._maxFailures.getset;``` [power-queue.js:202](power-queue.js#L202) - -- - -#### *powerqueue*.processList()  Anywhere #### -- -*This method __processList__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{array}* __(is reactive)__ -List of tasks currently being processed - -> ```PowerQueue.prototype.processingList = function() { ...``` [power-queue.js:209](power-queue.js#L209) - -- - -#### *powerqueue*.isHalted()  Anywhere #### -- -*This method __isHalted__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{boolean}* __(is reactive)__ -True if the queue is not running or paused - -> ```PowerQueue.prototype.isHalted = function() { ...``` [power-queue.js:218](power-queue.js#L218) - -- - -#### *powerqueue*.length()  Anywhere #### -- -*This method __length__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -Number of tasks left in queue to be processed - -> ```PowerQueue.prototype.length = function() { ...``` [power-queue.js:227](power-queue.js#L227) - -- - -#### *powerqueue*.progress()  Anywhere #### -- -*This method __progress__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -0 .. 100 % Indicates the status of the queue - -> ```PowerQueue.prototype.progress = function() { ...``` [power-queue.js:236](power-queue.js#L236) - -- - -#### *powerqueue*.usage()  Anywhere #### -- -*This method __usage__ is defined in `prototype` of `PowerQueue`* - -__Returns__ *{number}* __(is reactive)__ -0 .. 100 % Indicates ressource usage of the queue - -> ```PowerQueue.prototype.usage = function() { ...``` [power-queue.js:249](power-queue.js#L249) - -- - -#### *powerqueue*.reset()  Anywhere #### -- -*This method __reset__ is defined in `prototype` of `PowerQueue`* -Calling this will: -* stop the queue -* paused to false -* Discart all queue data - -> NOTE: At the moment if the queue has processing tasks they can change -> the `errors` and `failures` counters. This could change in the future or -> be prevented by creating a whole new instance of the `PowerQueue` - -> ```PowerQueue.prototype.reset = function() { ...``` [power-queue.js:264](power-queue.js#L264) - -- - -#### *powerqueue*._autoStartTasks()  Anywhere #### -- -*This method is private* -*This method ___autoStartTasks__ is defined in `PowerQueue`* - -This method defines the autostart algorithm that allows add task to trigger -a start of the queue if queue is not paused. - -> ```PowerQueue.prototype._autoStartTasks = function() { ...``` [power-queue.js:289](power-queue.js#L289) - -- - -#### *powerqueue*.add(data, [failures])  Anywhere #### -- -*This method __add__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -The task to be handled -* __failures__ *{number}* (Optional) -Internally used to Pass on number of failures. - -- - -> ```PowerQueue.prototype.add = function(data, failures, id) { ...``` [power-queue.js:316](power-queue.js#L316) - -- - -#### *powerqueue*.updateThrottleUp()  Anywhere #### -- -*This method is private* -*This method __updateThrottleUp__ is defined in `prototype` of `PowerQueue`* - -Calling this method will update the throttle on the queue adding tasks. - -> Note: Currently we only support the PowerQueue - but we could support -> a more general interface for pauseable tasks or other usecases. - -> ```PowerQueue.prototype.updateThrottleUp = function() { ...``` [power-queue.js:342](power-queue.js#L342) - -- - -#### *powerqueue*.updateThrottleDown()  Anywhere #### -- -*This method is private* -*This method __updateThrottleDown__ is defined in `prototype` of `PowerQueue`* - -Calling this method will update the throttle on the queue pause tasks. - -> Note: Currently we only support the PowerQueue - but we could support -> a more general interface for pauseable tasks or other usecases. - -> ```PowerQueue.prototype.updateThrottleDown = function() { ...``` [power-queue.js:367](power-queue.js#L367) - -- - -#### *powerqueue*.next([err])  Anywhere #### -- -*This method __next__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __err__ *{string}* (Optional) -Error message if task failed - -- -> * Can pass in `null` to start the queue -> * Passing in a string to `next` will trigger a failure -> * Passing nothing will simply let the next task run -`next` is handed into the [taskHandler](PowerQueue.taskHandler) as a -callback to mark an error or end of current task - -> ```PowerQueue.prototype.next = function(err) { ...``` [power-queue.js:394](power-queue.js#L394) - -- - -#### done  Anywhere #### -- - -__Arguments__ - -* __feedback__ *{[Meteor.Error ](#Meteor.Error )|[ Error ](# Error )|[ String ](# String )|[ null](# null)}* (Optional) -This allows the task to communicate with the queue - -- - -Explaination of `feedback` -* `Meteor.Error` This means that the task failed in a controlled manner and is allowed to rerun -* `Error` This will throw the passed error - as its an unitended error -* `null` The task is not done yet, rerun later -* `String` The task can perform certain commands on the queue - * "pause" - pause the queue - * "stop" - stop the queue - * "reset" - reset the queue - * "cancel" - cancel the queue - - -> ```PowerQueue.prototype.runTaskDone = function(feedback, invocation) { ...``` [power-queue.js:452](power-queue.js#L452) - -- - -#### *powerqueue*.runTaskDone([feedback], invocation)  Anywhere #### -- -*This method is private* -*This method __runTaskDone__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __feedback__ *{[Meteor.Error ](#Meteor.Error )|[ Error ](# Error )|[ String ](# String )|[ null](# null)}* (Optional) -This allows the task to communicate with the queue -* __invocation__ *{object}* - -- - -> Note: `feedback` is explained in [Done callback](#done) - - -> ```PowerQueue.prototype.runTaskDone = function(feedback, invocation) { ...``` [power-queue.js:452](power-queue.js#L452) - -- - -#### *powerqueue*.runTask(invocation)  Anywhere #### -- -*This method is private* -*This method __runTask__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __invocation__ *{object}* -The object stored in the micro-queue - -- - -> ```PowerQueue.prototype.runTask = function(invocation) { ...``` [power-queue.js:521](power-queue.js#L521) - -- - -#### *powerqueue*.queueTaskHandler()  Anywhere #### -- -*This method __queueTaskHandler__ is defined in `prototype` of `PowerQueue`* -This method handles tasks that are sub queues - -> ```PowerQueue.prototype.queueTaskHandler = function(subQueue, next, failures) { ...``` [power-queue.js:555](power-queue.js#L555) - -- - -#### *powerqueue*.taskHandler  Anywhere #### -- -*This callback __taskHandler__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -This can be data or functions -* __next__ *{function}* -Function `next` call this to end task -* __failures__ *{number}* -Number of failures on this task - -- - -Default task handler expects functions as data: -```js - self.taskHandler = function(data, next, failures) { - // This default task handler expects invocation to be a function to run - if (typeof data !== 'function') { - throw new Error('Default task handler expects a function'); - } - try { - // Have the function call next - data(next, failures); - } catch(err) { - // Throw to fail this task - next(err); - } - }; -``` - -> ```PowerQueue.prototype.taskHandler = function(data, next, failures) { ...``` [power-queue.js:601](power-queue.js#L601) - -- - -#### *powerqueue*.errorHandler  Anywhere #### -- -*This callback __errorHandler__ is defined in `prototype` of `PowerQueue`* - -__Arguments__ - -* __data__ *{any}* -This can be data or functions -* __addTask__ *{function}* -Use this function to insert the data into the queue again -* __failures__ *{number}* -Number of failures on this task - -- - -The default callback: -```js - var foo = new PowerQueue(); - - // Overwrite the default action - foo.errorHandler = function(data, addTask, failures) { - // This could be overwritten the data contains the task data and addTask - // is a helper for adding the task to the queue - // try again: addTask(data); - // console.log('Terminate at ' + failures + ' failures'); - }; -``` - -> ```PowerQueue.prototype.errorHandler = function(data, addTask, failures) { ...``` [power-queue.js:634](power-queue.js#L634) - -- - -#### *powerqueue*.pause()  Anywhere #### -- -*This method __pause__ is defined in `prototype` of `PowerQueue`* - -__TODO__ -``` -* We should have it pause all processing tasks -``` - -> ```PowerQueue.prototype.pause = function() { ...``` [power-queue.js:645](power-queue.js#L645) - -- - -#### *powerqueue*.resume()  Anywhere #### -- -*This method __resume__ is defined in `prototype` of `PowerQueue`* - -__TODO__ -``` -* We should have it resume all processing tasks -``` - -> This will not start a stopped queue - -> ```PowerQueue.prototype.resume = function() { ...``` [power-queue.js:665](power-queue.js#L665) - -- - -#### *powerqueue*.run()  Anywhere #### -- -*This method __run__ is defined in `prototype` of `PowerQueue`* -> Using this command will resume a paused queue and will -> start a stopped queue. - -> ```PowerQueue.prototype.run = function() { ...``` [power-queue.js:677](power-queue.js#L677) - -- diff --git a/packages/wekan-cfs-power-queue/package.js b/packages/wekan-cfs-power-queue/package.js deleted file mode 100644 index 757fd06c2..000000000 --- a/packages/wekan-cfs-power-queue/package.js +++ /dev/null @@ -1,27 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-power-queue', - version: '0.9.11', - summary: "PowerQueue is a powerful tool for handling async tasks, throtling etc.", - git: 'https://github.com/zcfs/Meteor-power-queue.git' -}); - -Package.onUse(function (api) { - api.versionsFrom('1.0'); - - api.use(['deps', 'wekan-cfs-reactive-property@0.0.4'], ['client', 'server']); - - // We let the user decide what spinal queue to use - We support both - // reactive-list and micro-queue they obey the spinal-queue spec - api.use(['wekan-cfs-reactive-list@0.0.9', 'wekan-cfs-micro-queue@0.0.6'], ['client', 'server'], { weak: true }); - - api.export && api.export('PowerQueue'); - api.addFiles(['power-queue.js'], ['client', 'server']); -}); - -Package.onTest(function (api) { - api.use(['wekan-cfs-power-queue', 'wekan-cfs-reactive-list']); - api.use('test-helpers', ['server', 'client']); - api.use('tinytest'); - - api.addFiles('tests.js'); -}); diff --git a/packages/wekan-cfs-power-queue/power-queue.js b/packages/wekan-cfs-power-queue/power-queue.js deleted file mode 100644 index e1e323163..000000000 --- a/packages/wekan-cfs-power-queue/power-queue.js +++ /dev/null @@ -1,727 +0,0 @@ -// Rig weak dependencies -if (typeof MicroQueue === 'undefined' && Package['micro-queue']) { - MicroQueue = Package['micro-queue'].MicroQueue; -} -if (typeof ReactiveList === 'undefined' && Package['reactive-list']) { - ReactiveList = Package['reactive-list'].ReactiveList; -} - -// Rig weak dependencies in +0.9.1 -if (typeof MicroQueue === 'undefined' && Package['wekan-cfs-micro-queue']) { - MicroQueue = Package['wekan-cfs-micro-queue'].MicroQueue; -} -if (typeof ReactiveList === 'undefined' && Package['wekan-cfs-reactive-list']) { - ReactiveList = Package['wekan-cfs-reactive-list'].ReactiveList; -} - -/** - * Creates an instance of a power queue // Testing inline comment - * [Check out demo](http://power-queue-test.meteor.com/) - * - * @constructor - * @self powerqueue - * @param {object} [options] Settings - * @param {boolean} [options.filo=false] Make it a first in last out queue - * @param {boolean} [options.isPaused=false] Set queue paused - * @param {boolean} [options.autostart=true] May adding a task start the queue - * @param {string} [options.name="Queue"] Name of the queue - * @param {number} [options.maxProcessing=1] Limit of simultanous running tasks - * @param {number} [options.maxFailures = 5] Limit retries of failed tasks, if 0 or below we allow infinite failures - * @param {number} [options.jumpOnFailure = true] Jump to next task and retry failed task later - * @param {boolean} [options.debug=false] Log verbose messages to the console - * @param {boolean} [options.reactive=true] Set whether or not this queue should be reactive - * @param {boolean} [options.onAutostart] Callback for the queue autostart event - * @param {boolean} [options.onPaused] Callback for the queue paused event - * @param {boolean} [options.onReleased] Callback for the queue release event - * @param {boolean} [options.onEnded] Callback for the queue end event - * @param {[SpinalQueue](spinal-queue.spec.md)} [options.spinalQueue] Set spinal queue uses pr. default `MicroQueue` or `ReactiveList` if added to the project - */ -PowerQueue = function(options) { - var self = this; - var test = 5; - - self.reactive = (options && options.reactive === false) ? false : true; - - // Allow user to use another micro-queue #3 - // We try setting the ActiveQueue to MicroQueue if installed in the app - var ActiveQueue = (typeof MicroQueue !== 'undefined') && MicroQueue || undefined; - - // If ReactiveList is added to the project we use this over MicroQueue - ActiveQueue = (typeof ReactiveList !== 'undefined') && ReactiveList || ActiveQueue; - - // We allow user to overrule and set a custom spinal-queue spec complient queue - if (options && typeof options.spinalQueue !== 'undefined') { - ActiveQueue = options.spinalQueue; - } - - if (typeof ActiveQueue === 'undefined') { - console.log('Error: You need to add a spinal queue to the project'); - console.log('Please add "micro-queue", "reactive-list" to the project'); - throw new Error('Please add "micro-queue", "reactive-list" or other spinalQueue compatible packages'); - } - - // Default is fifo lilo - self.invocations = new ActiveQueue({ - // - sort: (options && (options.filo || options.lifo)), - reactive: self.reactive - }); - //var self.invocations = new ReactiveList(queueOrder); - - // List of current tasks being processed - self._processList = new ActiveQueue({ - reactive: self.reactive - }); //ReactiveList(); - - // Max number of simultanious tasks being processed - self._maxProcessing = new ReactiveProperty(options && options.maxProcessing || 1, self.reactive); - - // Reactive number of tasks being processed - self._isProcessing = new ReactiveProperty(0, self.reactive); - - // Boolean indicating if queue is paused or not - self._paused = new ReactiveProperty((options && options.isPaused || false), self.reactive); - - // Boolean indicator for queue status active / running (can still be paused) - self._running = new ReactiveProperty(false, self.reactive); - - // Counter for errors, errors are triggered if maxFailures is exeeded - self._errors = new ReactiveProperty(0, self.reactive); - - // Counter for task failures, contains error count - self._failures = new ReactiveProperty(0, self.reactive); - - // On failure jump to new task - if false the current task is rerun until error - self._jumpOnFailure = (options && options.jumpOnFailure === false) ? false : true; - - // Count of all added tasks - self._maxLength = new ReactiveProperty(0, self.reactive); - - // Boolean indicate whether or not a "add" task is allowed to start the queue - self._autostart = new ReactiveProperty( ((options && options.autostart === false) ? false : true), self.reactive); - - // Limit times a task is allowed to fail and be rerun later before triggering an error - self._maxFailures = new ReactiveProperty( (options && options.maxFailures || 5), self.reactive); - - // Name / title of this queue - Not used - should deprecate - self.title = options && options.name || 'Queue'; - - // debug - will print error / failures passed to next - self.debug = !!(options && options.debug); - - /** @method PowerQueue.total - * @reactive - * @returns {number} The total number of tasks added to this queue - */ - self.total = self._maxLength.get; - - /** @method PowerQueue.isPaused - * @reactive - * @returns {boolean} Status of the paused state of the queue - */ - self.isPaused = self._paused.get; - - /** @method PowerQueue.processing - * @reactive - * @returns {number} Number of tasks currently being processed - */ - self.processing = self._isProcessing.get; - - /** @method PowerQueue.errors - * @reactive - * @returns {number} The total number of errors - * Errors are triggered when [maxFailures](PowerQueue.maxFailures) are exeeded - */ - self.errors = self._errors.get; - - /** @method PowerQueue.failures - * @reactive - * @returns {number} The total number of failed tasks - */ - self.failures = self._failures.get; - - /** @method PowerQueue.isRunning - * @reactive - * @returns {boolean} True if the queue is running - * > NOTE: The task can be paused but marked as running - */ - self.isRunning = self._running.get; - - /** @method PowerQueue.maxProcessing Get setter for maxProcessing - * @param {number} [max] If not used this function works as a getter - * @reactive - * @returns {number} Maximum number of simultaneous processing tasks - * - * Example: - * ```js - * foo.maxProcessing(); // Works as a getter and returns the current value - * foo.maxProcessing(20); // This sets the value to 20 - * ``` - */ - self.maxProcessing = self._maxProcessing.getset; - - self._maxProcessing.onChange = function() { - // The user can change the max allowed processing tasks up or down here... - // Update the throttle up - self.updateThrottleUp(); - // Update the throttle down - self.updateThrottleDown(); - }; - - /** @method PowerQueue.autostart Get setter for autostart - * @param {boolean} [autorun] If not used this function works as a getter - * @reactive - * @returns {boolean} If adding a task may trigger the queue to start - * - * Example: - * ```js - * foo.autostart(); // Works as a getter and returns the current value - * foo.autostart(true); // This sets the value to true - * ``` - */ - self.autostart = self._autostart.getset; - - /** @method PowerQueue.maxFailures Get setter for maxFailures - * @param {number} [max] If not used this function works as a getter - * @reactive - * @returns {number} The maximum for failures pr. task before triggering an error - * - * Example: - * ```js - * foo.maxFailures(); // Works as a getter and returns the current value - * foo.maxFailures(10); // This sets the value to 10 - * ``` - */ - self.maxFailures = self._maxFailures.getset; - - /** @callback PowerQueue.onPaused - * Is called when queue is ended - */ - self.onPaused = options && options.onPaused || function() { - self.debug && console.log(self.title + ' ENDED'); - }; - - /** @callback PowerQueue.onEnded - * Is called when queue is ended - */ - self.onEnded = options && options.onEnded || function() { - self.debug && console.log(self.title + ' ENDED'); - }; - - /** @callback PowerQueue.onRelease - * Is called when queue is released - */ - self.onRelease = options && options.onRelease || function() { - self.debug && console.log(self.title + ' RELEASED'); - }; - - /** @callback PowerQueue.onAutostart - * Is called when queue is auto started - */ - self.onAutostart = options && options.onAutostart || function() { - self.debug && console.log(self.title + ' Autostart'); - }; -}; - - /** @method PowerQueue.prototype.processList - * @reactive - * @returns {array} List of tasks currently being processed - */ - PowerQueue.prototype.processingList = function() { - var self = this; - return self._processList.fetch(); - }; - - /** @method PowerQueue.prototype.isHalted - * @reactive - * @returns {boolean} True if the queue is not running or paused - */ - PowerQueue.prototype.isHalted = function() { - var self = this; - return (!self._running.get() || self._paused.get()); - }; - - /** @method PowerQueue.prototype.length - * @reactive - * @returns {number} Number of tasks left in queue to be processed - */ - PowerQueue.prototype.length = function() { - var self = this; - return self.invocations.length(); - }; - - /** @method PowerQueue.prototype.progress - * @reactive - * @returns {number} 0 .. 100 % Indicates the status of the queue - */ - PowerQueue.prototype.progress = function() { - var self = this; - var progress = self._maxLength.get() - self.invocations.length() - self._isProcessing.get(); - if (self._maxLength.value > 0) { - return Math.round(progress / self._maxLength.value * 100); - } - return 0; - }; - - /** @method PowerQueue.prototype.usage - * @reactive - * @returns {number} 0 .. 100 % Indicates resource usage of the queue - */ - PowerQueue.prototype.usage = function() { - var self = this; - return Math.round(self._isProcessing.get() / self._maxProcessing.get() * 100); - }; - - /** @method PowerQueue.prototype.reset Reset the queue - * Calling this will: - * * stop the queue - * * paused to false - * * Discart all queue data - * - * > NOTE: At the moment if the queue has processing tasks they can change - * > the `errors` and `failures` counters. This could change in the future or - * > be prevented by creating a whole new instance of the `PowerQueue` - */ - PowerQueue.prototype.reset = function() { - var self = this; - self.debug && console.log(self.title + ' RESET'); - self._running.set(false); - self._paused.set(false); - self.invocations.reset(); - self._processList.reset(); - - // // Loop through the processing tasks and reset these - // self._processList.forEach(function(data) { - // if (data.queue instanceof PowerQueue) { - // data.queue.reset(); - // } - // }, true); - self._maxLength.set(0); - self._failures.set(0); - self._errors.set(0); - }; - - /** @method PowerQueue._autoStartTasks - * @private - * - * This method defines the autostart algorithm that allows add task to trigger - * a start of the queue if queue is not paused. - */ - PowerQueue.prototype._autoStartTasks = function() { - var self = this; - - // We dont start anything by ourselfs if queue is paused - if (!self._paused.value) { - - // Queue is not running and we are set to autostart so we start the queue - if (!self._running.value && self._autostart.value) { - // Trigger callback / event - self.onAutostart(); - // Set queue as running - self._running.set(true); - } - - // Make sure that we use all available resources - if (self._running.value) { - // Call next to start up the queue - self.next(null); - } - - } - }; - - /** @method PowerQueue.prototype.add - * @param {any} data The task to be handled - * @param {number} [failures] Used internally to Pass on number of failures. - */ - PowerQueue.prototype.add = function(data, failures, id) { - var self = this; - - // Assign new id to task - var assignNewId = self._jumpOnFailure || typeof id === 'undefined'; - - // Set the task id - var taskId = (assignNewId) ? self._maxLength.value + 1 : id; - - // self.invocations.add({ _id: currentId, data: data, failures: failures || 0 }, reversed); - self.invocations.insert(taskId, { _id: taskId, data: data, failures: failures || 0 }); - - // If we assigned new id then increase length - if (assignNewId) self._maxLength.inc(); - - self._autoStartTasks(); - }; - - /** @method PowerQueue.prototype.updateThrottleUp - * @private - * - * Calling this method will update the throttle on the queue adding tasks. - * - * > Note: Currently we only support the PowerQueue - but we could support - * > a more general interface for pauseable tasks or other usecases. - */ - PowerQueue.prototype.updateThrottleUp = function() { - var self = this; - - // How many additional tasks can we handle? - var availableSlots = self._maxProcessing.value - self._isProcessing.value; - // If we can handle more, we have more, we're running, and we're not paused - if (!self._paused.value && self._running.value && availableSlots > 0 && self.invocations._length > 0) { - // Increase counter of current number of tasks being processed - self._isProcessing.inc(); - // Run task - self.runTask(self.invocations.getFirstItem()); - // Repeat recursively; this is better than a for loop to avoid blocking the UI - self.updateThrottleUp(); - } - - }; - - /** @method PowerQueue.prototype.updateThrottleDown - * @private - * - * Calling this method will update the throttle on the queue pause tasks. - * - * > Note: Currently we only support the PowerQueue - but we could support - * > a more general interface for pauseable tasks or other usecases. - */ - PowerQueue.prototype.updateThrottleDown = function() { - var self = this; - // Calculate the differece between acutuall processing tasks and target - var diff = self._isProcessing.value - self._maxProcessing.value; - - // If the diff is more than 0 then we have many tasks processing. - if (diff > 0) { - // We pause the latest added tasks - self._processList.forEachReverse(function(data) { - if (diff > 0 && data.queue instanceof PowerQueue) { - diff--; - // We dont mind calling pause on multiple times on each task - // theres a simple check going on preventing any duplicate actions - data.queue.pause(); - } - }, true); - } - }; - - /** @method PowerQueue.prototype.next - * @param {string} [err] Error message if task failed - * > * Can pass in `null` to start the queue - * > * Passing in a string to `next` will trigger a failure - * > * Passing nothing will simply let the next task run - * `next` is handed into the [taskHandler](PowerQueue.taskHandler) as a - * callback to mark an error or end of current task - */ - PowerQueue.prototype.next = function(err) { - var self = this; - // Primary concern is to throttle up because we are either: - // 1. Starting the queue - // 2. Starting next task - // - // This function does not shut down running tasks - self.updateThrottleUp(); - - // We are running, no tasks are being processed even we just updated the - // throttle up and we got no errors. - // 1. We are paused and releasing tasks - // 2. We are done - if (self._running.value && self._isProcessing.value === 0 && err !== null) { - - // We have no tasks processing so this queue is now releasing resources - // this could be that the queue is paused or stopped, in that case the - // self.invocations._length would be > 0 - // If on the other hand the self.invocations._length is 0 then we have no more - // tasks in the queue so the queue has ended - self.onRelease(self.invocations._length); - - if (!self.invocations._length) { // !self._paused.value && - // Check if queue is done working - // Stop the queue - self._running.set(false); - // self.invocations.reset(); // This should be implicit - self.onEnded(); - } - - } - }; - - /** @callback done - * @param {Meteor.Error | Error | String | null} [feedback] This allows the task to communicate with the queue - * - * Explaination of `feedback` - * * `Meteor.Error` This means that the task failed in a controlled manner and is allowed to rerun - * * `Error` This will throw the passed error - as its an unitended error - * * `null` The task is not done yet, rerun later - * * `String` The task can perform certain commands on the queue - * * "pause" - pause the queue - * * "stop" - stop the queue - * * "reset" - reset the queue - * * "cancel" - cancel the queue - * - */ - - - /** @method PowerQueue.prototype.runTaskDone - * @private - * @param {Meteor.Error | Error | String | null} [feedback] This allows the task to communicate with the queue - * @param {object} invocation - * - * > Note: `feedback` is explained in [Done callback](#done) - * - */ - // Rig the callback function - PowerQueue.prototype.runTaskDone = function(feedback, invocation) { - var self = this; - - // If the task handler throws an error then add it to the queue again - // we allow this for a max of self._maxFailures - // If the error is null then we add the task silently back into the - // microQueue in reverse... This could be due to pause or throttling - if (feedback instanceof Meteor.Error) { - // We only count failures if maxFailures are above 0 - if (self._maxFailures.value > 0) invocation.failures++; - self._failures.inc(); - - // If the user has set the debug flag we print out failures/errors - self.debug && console.error('Error: "' + self.title + '" ' + feedback.message + ', ' + feedback.stack); - - if (invocation.failures < self._maxFailures.value) { - // Add the task again with the increased failures - self.add(invocation.data, invocation.failures, invocation._id); - } else { - self._errors.inc(); - self.errorHandler(invocation.data, self.add, invocation.failures); - } - - // If a error is thrown we assume its not intended - } else if (feedback instanceof Error) throw feedback; - - if (feedback) - - // We use null to throttle pauseable tasks - if (feedback === null) { - // We add this task into the queue, no questions asked - self.invocations.insert(invocation._id, { data: invocation.data, failures: invocation.failures, _id: invocation._id }); - } - - // If the user returns a string we got a command - if (feedback === ''+feedback) { - var command = { - 'pause': function() { self.pause(); }, - 'stop': function() { self.stop(); }, - 'reset': function() { self.reset(); }, - 'cancel': function() { self.cancel(); }, - }; - if (typeof command[feedback] === 'function') { - // Run the command on this queue - command[feedback](); - } else { - // We dont recognize this command, throw an error - throw new Error('Unknown queue command "' + feedback + '"'); - } - } - // Decrease the number of tasks being processed - // make sure we dont go below 0 - if (self._isProcessing.value > 0) self._isProcessing.dec(); - // Task has ended we remove the task from the process list - self._processList.remove(invocation._id); - - invocation.data = null; - invocation.failures = null; - invocation._id = null; - invocation = null; - delete invocation; - // Next task - Meteor.setTimeout(function() { - self.next(); - }, 0); - - }; - - - /** @method PowerQueue.prototype.runTask - * @private // This is not part of the open api - * @param {object} invocation The object stored in the micro-queue - */ - PowerQueue.prototype.runTask = function(invocation) { - var self = this; - - // We start the fitting task handler - // Currently we only support the PowerQueue but we could have a more general - // interface for tasks that allow throttling - try { - if (invocation.data instanceof PowerQueue) { - - // Insert PowerQueue into process list - self._processList.insert(invocation._id, { id: invocation._id, queue: invocation.data }); - // Handle task - self.queueTaskHandler(invocation.data, function subQueueCallbackDone(feedback) { - self.runTaskDone(feedback, invocation); - }, invocation.failures); - - } else { - - // Insert task into process list - self._processList.insert(invocation._id, invocation.data); - // Handle task - self.taskHandler(invocation.data, function taskCallbackDone(feedback) { - self.runTaskDone(feedback, invocation); - }, invocation.failures); - - } - } catch(err) { - throw new Error('Error while running taskHandler for queue, Error: ' + err.message); - } - }; - - /** @method PowerQueue.prototype.queueTaskHandler - * This method handles tasks that are sub queues - */ - PowerQueue.prototype.queueTaskHandler = function(subQueue, next, failures) { - var self = this; - // Monitor sub queue task releases - subQueue.onRelease = function(remaining) { - // Ok, we were paused - this could be throttling so we respect this - // So when the queue is halted we add it back into the main queue - if (remaining > 0) { - // We get out of the queue but dont repport error and add to run later - next(null); - } else { - // Queue has ended - // We simply trigger next task when the sub queue is complete - next(); - // When running subqueues it doesnt make sense to track failures and retry - // the sub queue - this is sub queue domain - } - }; - - // Start the queue - subQueue.run(); - }; - - /** @callback PowerQueue.prototype.taskHandler - * @param {any} data This can be data or functions - * @param {function} next Function `next` call this to end task - * @param {number} failures Number of failures on this task - * - * Default task handler expects functions as data: - * ```js - * self.taskHandler = function(data, next, failures) { - * // This default task handler expects invocation to be a function to run - * if (typeof data !== 'function') { - * throw new Error('Default task handler expects a function'); - * } - * try { - * // Have the function call next - * data(next, failures); - * } catch(err) { - * // Throw to fail this task - * next(err); - * } - * }; - * ``` - */ - - // Can be overwrittin by the user - PowerQueue.prototype.taskHandler = function(data, next, failures) { - var self = this; - // This default task handler expects invocation to be a function to run - if (typeof data !== 'function') { - throw new Error('Default task handler expects a function'); - } - try { - // Have the function call next - data(next, failures); - } catch(err) { - // Throw to fail this task - next(err); - } - }; - - /** @callback PowerQueue.prototype.errorHandler - * @param {any} data This can be data or functions - * @param {function} addTask Use this function to insert the data into the queue again - * @param {number} failures Number of failures on this task - * - * The default callback: - * ```js - * var foo = new PowerQueue(); - * - * // Overwrite the default action - * foo.errorHandler = function(data, addTask, failures) { - * // This could be overwritten the data contains the task data and addTask - * // is a helper for adding the task to the queue - * // try again: addTask(data); - * // console.log('Terminate at ' + failures + ' failures'); - * }; - * ``` - */ - PowerQueue.prototype.errorHandler = function(data, addTask, failures) { - var self = this; - // This could be overwritten the data contains the task data and addTask - // is a helper for adding the task to the queue - // try again: addTask(data); - self.debug && console.log('Terminate at ' + failures + ' failures'); - }; - - /** @method PowerQueue.prototype.pause Pause the queue - * @todo We should have it pause all processing tasks - */ - PowerQueue.prototype.pause = function() { - var self = this; - if (!self._paused.value) { - - self._paused.set(true); - // Loop through the processing tasks and pause these - self._processList.forEach(function(data) { - if (data.queue instanceof PowerQueue) { - // Pause the sub queue - data.queue.pause(); - } - }, true); - - // Trigger callback - self.onPaused(); - } - }; - - /** @method PowerQueue.prototype.resume Start a paused queue - * @todo We should have it resume all processing tasks - * - * > This will not start a stopped queue - */ - PowerQueue.prototype.resume = function() { - var self = this; - self.run(); - }; - - /** @method PowerQueue.prototype.run Starts the queue - * > Using this command will resume a paused queue and will - * > start a stopped queue. - */ - PowerQueue.prototype.run = function() { - var self = this; - //not paused and already running or queue empty or paused subqueues - if (!self._paused.value && self._running.value || !self.invocations._length) { - return; - } - - self._paused.set(false); - self._running.set(true); - self.next(null); - }; - - /** @method PowerQueue.prototype.stop Stops the queue - */ - PowerQueue.prototype.stop = function() { - var self = this; - self._running.set(false); - }; - - /** @method PowerQueue.prototype.cancel Cancel the queue - */ - PowerQueue.prototype.cancel = function() { - var self = this; - self.reset(); - }; - diff --git a/packages/wekan-cfs-power-queue/spinal-queue.spec.md b/packages/wekan-cfs-power-queue/spinal-queue.spec.md deleted file mode 100644 index cb2e50eb1..000000000 --- a/packages/wekan-cfs-power-queue/spinal-queue.spec.md +++ /dev/null @@ -1,151 +0,0 @@ -#Spinal Queue Spec -This specification declares the interface for the "spinal" queue in `PowerQueue`. -We allready have two implementations the [MicroQueue](https://github.com/zcfs/Meteor-micro-queue) and [ReactiveList](https://github.com/zcfs/Meteor-reactive-list) - -#SpinalQueue -Provides a simple reactive list interface - -#### new SpinalQueue(lifo)  Anywhere #### -- - -__Arguments__ - -* __lifo__ *{boolean}* -Set the order of the queue default is `fifo` - -- -Example: -```js - var list = new SpinalQueue(); - list.insert(1, { text: 'Hello id: 1' }); - list.insert(2, { text: 'Hello id: 2' }); - list.insert(3, { text: 'Hello id: 3' }); - list.update(2, { text: 'Updated 2'}); - list.remove(1); - - list.forEach(function(value, key) { - console.log('GOT: ' + value.text); - }, true); // Set noneReactive = true, default behaviour is reactive - // Return from Template: - Template.hello.list = function() { - return list.fetch(); - }; -``` - -- - -#### *SpinalQueue*.length()  Anywhere #### -- -*This method __length__ is defined in `SpinalQueue`* - -__Returns__ *{number}* __(is reactive)__ -Length of the reactive list - -- - -#### *SpinalQueue*.reset()  Anywhere #### -- -*This method __reset__ is defined in `SpinalQueue`* - -- - -#### *SpinalQueue*.update(key, value)  Anywhere #### -- -*This method __update__ is defined in `SpinalQueue`* - -__Arguments__ - -* __key__ *{string|number}* -Key to update -* __value__ *{any}* -Update with this value - -> Note: Method is currently not used by `PowerQueue` - -- - -#### *SpinalQueue*.insert(key, value)  Anywhere #### -- -*This method __insert__ is defined in `SpinalQueue`* - -__Arguments__ - -* __key__ *{string|number}* -Key to insert -* __value__ *{any}* -Insert item with this value - -- - -#### *SpinalQueue*.remove(key)  Anywhere #### -- -*This method __remove__ is defined in `SpinalQueue`* - -__Arguments__ - -* __key__ *{string|number}* -Key to remove - -- - -#### *SpinalQueue*.getLastItem()  Anywhere #### -- -*This method __getLastItem__ is defined in `SpinalQueue`* - -__Returns__ *{any}* -Pops last item from the list - removes the item from the list - -> Note: Method is currently not used by `PowerQueue` - -- - -#### *SpinalQueue*.getFirstItem()  Anywhere #### -- -*This method __getFirstItem__ is defined in `SpinalQueue`* - -__Returns__ *{any}* -Pops first item from the list - removes the item from the list - - -#### *SpinalQueue*.forEach(f, [noneReactive], [reverse])  Anywhere #### -- -*This method __forEach__ is defined in `SpinalQueue`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - - -#### *SpinalQueue*.forEachReverse(f, [noneReactive])  Anywhere #### -- -*This method __forEachReverse__ is defined in `SpinalQueue`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -#### *SpinalQueue*.fetch([noneReactive])  Anywhere #### -- -*This method __fetch__ is defined in `SpinalQueue`* - -__Arguments__ - -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -__Returns__ *{array}* __(is reactive)__ -List of items - -- diff --git a/packages/wekan-cfs-power-queue/tests.js b/packages/wekan-cfs-power-queue/tests.js deleted file mode 100644 index 01cdd6b1f..000000000 --- a/packages/wekan-cfs-power-queue/tests.js +++ /dev/null @@ -1,198 +0,0 @@ -"use strict"; - -function equals(a, b) { - return !!(JSON.stringify(a) === JSON.stringify(b)); -} - -Tinytest.add('PowerQueue - scope', function(test) { - - test.isTrue(typeof PowerQueue !== 'undefined', 'The PowerQueue scope is missing, please add the power-queue package'); - - -}); - - -// We run 5 tasks in serial mode -Tinytest.addAsync('PowerQueue - test serial run', function (test, onComplete) { - var queue = new PowerQueue({ - name: 'test queue 1', - autostart: false, - maxProcessing: 1, - debug: true, - // When this task is released we do our tests - onEnded: function() { - console.log('It ended'); - // Check that we ran the expected number of tasks - test.equal(counter, 5, 'counter did not match number of tasks'); - // Check that the result was correct - test.equal(result, expectedResult, 'result was unexpected'); - // We are done testing - onComplete(); - } - }); - - var result = ''; - var expectedResult = '12345'; - var counter = 0; - - var checkCounter = function(id, next) { - console.log('test queue 1 - Run task: ' + id); - // Keep a counter - counter++; - // push id to result - result += id; - // call next task - next(); - }; - - - // Add the tasks to the queue - queue.add(function(next) { checkCounter('1', next); }); - queue.add(function(next) { checkCounter('2', next); }); - queue.add(function(next) { checkCounter('3', next); }); - queue.add(function(next) { checkCounter('4', next); }); - queue.add(function(next) { checkCounter('5', next); }); - - // Run the queue - queue.run(); -}); - -// We run 5 tasks in serial mode but pause the queue on 3 -Tinytest.addAsync('PowerQueue - test serial pause', function (test, onComplete) { - var queue = new PowerQueue({ - name: 'test queue 2', - autostart: false, - maxProcessing: 1, - debug: true, - // When this task is released we do our tests - onPaused: function() { - console.log('Its paused'); - // Check that we ran the expected number of tasks - test.equal(counter, 3, 'counter did not match number of tasks'); - // Check that the result was correct - test.equal(result, expectedResult, 'result was unexpected'); - // We are done testing - onComplete(); - } - }); - - var result = ''; - var expectedResult = '123'; - var counter = 0; - - var checkCounter = function(id, next) { - console.log('test queue 2 - Run task: ' + id); - // Keep a counter - counter++; - // push id to result - result += id; - // call next task - if (id === '3') - next('pause') - else - next(); - }; - - - // Add the tasks to the queue - queue.add(function(next) { checkCounter('1', next); }); - queue.add(function(next) { checkCounter('2', next); }); - queue.add(function(next) { checkCounter('3', next); }); - queue.add(function(next) { checkCounter('4', next); }); - queue.add(function(next) { checkCounter('5', next); }); - - // Run the queue - queue.run(); -}); - -// We run 5 tasks in serial mode but pause the queue on 3 -Tinytest.addAsync('PowerQueue - test 2 task in parallel', function (test, onComplete) { - var queue = new PowerQueue({ - name: 'test queue 3', - autostart: false, - maxProcessing: 2, - debug: true, - // When this task is released we do our tests - onEnded: function() { - console.log('Its paused'); - // Check that we ran the expected number of tasks - test.equal(counter, 10, 'counter did not match number of tasks'); - // Check that the result was correct - test.equal(result, expectedResult, 'result was unexpected'); - // We are done testing - onComplete(); - } - }); - - // start 1-----3-------4-------6------------------------9-----------------------X - // 2-----------------5---------------7--------8-----------10------X - // ms 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 - // result 1 2 3 4 5 6 7 8 9 10 - // result 1 3 2 4 5 7 6 8 10 9 - - var wait = { - '1': 10, - '2': 25, - '3': 10, - '4': 10, - '5': 20, - '6': 30, - '7': 10, - '8': 15, - '9': 30, - '10': 10, - }; - - // 1324 - - var result = ''; - var expectedResult = '13245768109'; - var counter = 0; - - var checkCounter = function(id, next) { - console.log('test queue 3 - Run task: ' + id); - // Keep a counter - counter++; - // push id to result - Meteor.setTimeout(function() { - result += id; - // call next task - next(); - }, wait[id] * 5); // give it a factor 2 to make sure we get the correct result - }; - - - // Add the tasks to the queue - queue.add(function(next) { checkCounter('1', next); }); - queue.add(function(next) { checkCounter('2', next); }); - queue.add(function(next) { checkCounter('3', next); }); - queue.add(function(next) { checkCounter('4', next); }); - queue.add(function(next) { checkCounter('5', next); }); - queue.add(function(next) { checkCounter('6', next); }); - queue.add(function(next) { checkCounter('7', next); }); - queue.add(function(next) { checkCounter('8', next); }); - queue.add(function(next) { checkCounter('9', next); }); - queue.add(function(next) { checkCounter('10', next); }); - - // Run the queue - queue.run(); -}); -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equal(actual, expected, message, not) -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-reactive-list/.editorconfig b/packages/wekan-cfs-reactive-list/.editorconfig deleted file mode 100644 index a2cc1c1fe..000000000 --- a/packages/wekan-cfs-reactive-list/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# .editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true \ No newline at end of file diff --git a/packages/wekan-cfs-reactive-list/.gitignore b/packages/wekan-cfs-reactive-list/.gitignore deleted file mode 100644 index 45353da68..000000000 --- a/packages/wekan-cfs-reactive-list/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/versions.json -.build* diff --git a/packages/wekan-cfs-reactive-list/.jshintrc b/packages/wekan-cfs-reactive-list/.jshintrc deleted file mode 100644 index 3f0dbcc61..000000000 --- a/packages/wekan-cfs-reactive-list/.jshintrc +++ /dev/null @@ -1,115 +0,0 @@ -//.jshintrc -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : true, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 2, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : true, // true: Requires all functions run in ES5 Strict Mode - "trailing" : true, // true: Prohibit trailing whitespaces - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : 80, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jquery" : false, // jQuery - "mootools" : false, // MooTools - "node" : false, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "rhino" : false, // Rhino - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - //"meteor" : false, // Meteor.js - - // Legacy - "nomen" : false, // true: Prohibit dangling `_` in variables - "onevar" : false, // true: Allow only one `var` statement per function - "passfail" : false, // true: Stop on first error - "white" : false, // true: Check against strict whitespace and indentation rules - - // Custom Globals - "predef" : [ - "Meteor", - "Accounts", - "Session", - "Template", - "check", - "Match", - "Deps", - "EJSON", - "Email", - "Package", - "Tinytest", - "Npm", - "Assets", - "Packages", - "process", - "GroundDB", - "_gDB", - "LocalCollection", - "ReactiveList", - "_", - "Random" - ] // additional predefined global variables -} diff --git a/packages/wekan-cfs-reactive-list/.travis.yml b/packages/wekan-cfs-reactive-list/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-reactive-list/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-reactive-list/LICENSE.md b/packages/wekan-cfs-reactive-list/LICENSE.md deleted file mode 100644 index 2a5c5339e..000000000 --- a/packages/wekan-cfs-reactive-list/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-reactive-list/README.md b/packages/wekan-cfs-reactive-list/README.md deleted file mode 100644 index a05b0f7d8..000000000 --- a/packages/wekan-cfs-reactive-list/README.md +++ /dev/null @@ -1,82 +0,0 @@ -wekan-cfs-reactive-list [![Build Status](https://travis-ci.org/CollectionFS/Meteor-reactive-list.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-reactive-list) -========= - -~~Looking for maintainers - please reach out!~~ -This package is to be archived due to inability to find contributors, thanks to everyone who helped make it possible. - -**If you're looking for an alternative, we highly recommend [Meteor-Files](https://github.com/VeliovGroup/Meteor-Files) by [VeliovGroup](https://github.com/VeliovGroup)** - ---- - -ReactiveList keeps a sortable reactive list of key+value items. It's simple and fast. - -And... It's powered by Meteor's reactive sugar :) - -Kind regards, -Eric (@aldeed) and Morten (@raix) - -Happy coding!! - -#API -[API Documentation](api.md) - -From the docs: -#### new ReactiveList([options], sort)  Anywhere #### -- - -__Arguments__ - -* __options__ *{object}* (Optional) -* __sort__ *{function}* -The sort algorithm to use - -- -Example: -```js - var list = new ReactiveList(); - list.insert(1, { text: 'Hello id: 1' }); - list.insert(2, { text: 'Hello id: 2' }); - list.insert(3, { text: 'Hello id: 3' }); - list.update(2, { text: 'Updated 2'}); - list.remove(1); - - list.forEach(function(value, key) { - console.log('GOT: ' + value.text); - }, true); // Set noneReactive = true, default behaviour is reactive - // Return from Template: - Template.hello.list = function() { - return list.fetch(); - }; -``` - -#### Example of a sort algorithm -Sort can be used to define the order of the list -```js - var list = new ReactiveList({ - sort: function(a, b) { - // a and b are type of { key, value } - // here we sort by the key: - return a.key < b.key; - } - }); -``` -### Object chain -``` - first last - undefined - obj - obj - obj - undefined - (prev value next) (prev value next) (prev value next) -``` - -``` -ReactiveList = function(options) { ... -``` - -See more at [reactive-list.js:46](reactive-list.js#L46). - -# Contribute - -Here's the [complete API documentation](internal.api.md). To update the docs, run `npm install docmeteor`, then - -```bash -$ docmeteor -``` diff --git a/packages/wekan-cfs-reactive-list/api.md b/packages/wekan-cfs-reactive-list/api.md deleted file mode 100644 index 0f7eaa5a3..000000000 --- a/packages/wekan-cfs-reactive-list/api.md +++ /dev/null @@ -1,195 +0,0 @@ -#ReactiveList -Provides a simple reactive list interface - -#### new ReactiveList([options], sort)  Anywhere #### -- - -__Arguments__ - -* __options__ *{object}* (Optional) -* __sort__ *{function}* -The sort algorithm to use - -- -Example: -```js - var list = new ReactiveList(); - list.insert(1, { text: 'Hello id: 1' }); - list.insert(2, { text: 'Hello id: 2' }); - list.insert(3, { text: 'Hello id: 3' }); - list.update(2, { text: 'Updated 2'}); - list.remove(1); - - list.forEach(function(value, key) { - console.log('GOT: ' + value.text); - }, true); // Set noneReactive = true, default behaviour is reactive - // Return from Template: - Template.hello.list = function() { - return list.fetch(); - }; -``` -####Example of a sort algorithm -Sort can be used to define the order of the list -```js - var list = new ReactiveList({ - sort: function(a, b) { - // a and b are type of { key, value } - // here we sort by the key: - return a.key < b.key; - } - }); -``` -###Object chain -``` - first last - undefined - obj - obj - obj - undefined - (prev value next) (prev value next) (prev value next) -``` - -> ```ReactiveList = function(options) { ...``` [reactive-list.js:46](reactive-list.js#L46) - -- - -#### *reactivelist*.length()  Anywhere #### -- -*This method __length__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{number}* __(is reactive)__ -Length of the reactive list - -> ```ReactiveList.prototype.length = function() { ...``` [reactive-list.js:73](reactive-list.js#L73) - -- - -#### *reactivelist*.reset()  Anywhere #### -- -*This method __reset__ is defined in `prototype` of `ReactiveList`* - -> ```ReactiveList.prototype.reset = function() { ...``` [reactive-list.js:83](reactive-list.js#L83) - -- - -#### *reactivelist*.update(key, value)  Anywhere #### -- -*This method __update__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to update -* __value__ *{any}* -Update with this value - -- - -> ```ReactiveList.prototype.update = function(key, value) { ...``` [reactive-list.js:102](reactive-list.js#L102) - -- - -#### *reactivelist*.insert(key, value)  Anywhere #### -- -*This method __insert__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to insert -* __value__ *{any}* -Insert item with this value - -- - -> ```ReactiveList.prototype.insert = function(key, value) { ...``` [reactive-list.js:118](reactive-list.js#L118) - -- - -#### *reactivelist*.remove(key)  Anywhere #### -- -*This method __remove__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to remove - -- - -> ```ReactiveList.prototype.remove = function(key) { ...``` [reactive-list.js:180](reactive-list.js#L180) - -- - -#### *reactivelist*.getLastItem()  Anywhere #### -- -*This method __getLastItem__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{any}* -Pops last item from the list - removes the item from the list - -> ```ReactiveList.prototype.getLastItem = function(first) { ...``` [reactive-list.js:221](reactive-list.js#L221) - -- - -#### *reactivelist*.getFirstItem()  Anywhere #### -- -*This method __getFirstItem__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{any}* -Pops first item from the list - removes the item from the list - -> ```ReactiveList.prototype.getFirstItem = function() { ...``` [reactive-list.js:239](reactive-list.js#L239) - -- - -#### *reactivelist*.forEach(f, [noneReactive], [reverse])  Anywhere #### -- -*This method __forEach__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity -* __reverse__ *{boolean}* (Optional = false) -Set true to reverse iteration `forEachReverse` - -- - -> ```ReactiveList.prototype.forEach = function(f, noneReactive, reverse) { ...``` [reactive-list.js:249](reactive-list.js#L249) - -- - -#### *reactivelist*.forEachReverse(f, [noneReactive])  Anywhere #### -- -*This method __forEachReverse__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -> ```ReactiveList.prototype.forEachReverse = function(f, noneReactive) { ...``` [reactive-list.js:272](reactive-list.js#L272) - -- - -#### *reactivelist*.fetch([noneReactive])  Anywhere #### -- -*This method __fetch__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -__Returns__ *{array}* __(is reactive)__ -List of items - -> ```ReactiveList.prototype.fetch = function(noneReactive) { ...``` [reactive-list.js:282](reactive-list.js#L282) - -- diff --git a/packages/wekan-cfs-reactive-list/internal.api.md b/packages/wekan-cfs-reactive-list/internal.api.md deleted file mode 100644 index 3eb92996d..000000000 --- a/packages/wekan-cfs-reactive-list/internal.api.md +++ /dev/null @@ -1,203 +0,0 @@ -> File: ["reactive-list.js"](reactive-list.js) -> Where: {client|server} - -- -#ReactiveList -Provides a simple reactive list interface - -#### new ReactiveList([options], sort)  Anywhere #### -- - -__Arguments__ - -* __options__ *{object}* (Optional) -* __sort__ *{function}* -The sort algorithm to use - -- -Example: -```js - var list = new ReactiveList(); - list.insert(1, { text: 'Hello id: 1' }); - list.insert(2, { text: 'Hello id: 2' }); - list.insert(3, { text: 'Hello id: 3' }); - list.update(2, { text: 'Updated 2'}); - list.remove(1); - - list.forEach(function(value, key) { - console.log('GOT: ' + value.text); - }, true); // Set noneReactive = true, default behaviour is reactive - // Return from Template: - Template.hello.list = function() { - return list.fetch(); - }; -``` -####Example of a sort algorithm -Sort can be used to define the order of the list -```js - var list = new ReactiveList({ - sort: function(a, b) { - // a and b are type of { key, value } - // here we sort by the key: - return a.key < b.key; - } - }); -``` -###Object chain -``` - first last - undefined - obj - obj - obj - undefined - (prev value next) (prev value next) (prev value next) -``` - -> ```ReactiveList = function(options) { ...``` [reactive-list.js:46](reactive-list.js#L46) - -- - -#### *reactivelist*.length()  Anywhere #### -- -*This method __length__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{number}* __(is reactive)__ -Length of the reactive list - -> ```ReactiveList.prototype.length = function() { ...``` [reactive-list.js:73](reactive-list.js#L73) - -- - -#### *reactivelist*.reset()  Anywhere #### -- -*This method __reset__ is defined in `prototype` of `ReactiveList`* -__TODO__ -``` -* Check for memory leaks, if so we have to iterate over lookup and delete the items -``` - -> ```ReactiveList.prototype.reset = function() { ...``` [reactive-list.js:83](reactive-list.js#L83) - -- - -#### *reactivelist*.update(key, value)  Anywhere #### -- -*This method __update__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to update -* __value__ *{any}* -Update with this value - -- - -> ```ReactiveList.prototype.update = function(key, value) { ...``` [reactive-list.js:102](reactive-list.js#L102) - -- - -#### *reactivelist*.insert(key, value)  Anywhere #### -- -*This method __insert__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to insert -* __value__ *{any}* -Insert item with this value - -- - -> ```ReactiveList.prototype.insert = function(key, value) { ...``` [reactive-list.js:118](reactive-list.js#L118) - -- - -#### *reactivelist*.remove(key)  Anywhere #### -- -*This method __remove__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __key__ *{string|number}* -Key to remove - -- - -> ```ReactiveList.prototype.remove = function(key) { ...``` [reactive-list.js:180](reactive-list.js#L180) - -- - -#### *reactivelist*.getLastItem()  Anywhere #### -- -*This method __getLastItem__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{any}* -Pops last item from the list - removes the item from the list - -> ```ReactiveList.prototype.getLastItem = function(first) { ...``` [reactive-list.js:221](reactive-list.js#L221) - -- - -#### *reactivelist*.getFirstItem()  Anywhere #### -- -*This method __getFirstItem__ is defined in `prototype` of `ReactiveList`* - -__Returns__ *{any}* -Pops first item from the list - removes the item from the list - -> ```ReactiveList.prototype.getFirstItem = function() { ...``` [reactive-list.js:239](reactive-list.js#L239) - -- - -#### *reactivelist*.forEach(f, [noneReactive], [reverse])  Anywhere #### -- -*This method __forEach__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity -* __reverse__ *{boolean}* (Optional = false) -Set true to reverse iteration `forEachReverse` - -- - -> ```ReactiveList.prototype.forEach = function(f, noneReactive, reverse) { ...``` [reactive-list.js:249](reactive-list.js#L249) - -- - -#### *reactivelist*.forEachReverse(f, [noneReactive])  Anywhere #### -- -*This method __forEachReverse__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __f__ *{function}* -Callback `funciton(value, key)` -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -> ```ReactiveList.prototype.forEachReverse = function(f, noneReactive) { ...``` [reactive-list.js:272](reactive-list.js#L272) - -- - -#### *reactivelist*.fetch([noneReactive])  Anywhere #### -- -*This method __fetch__ is defined in `prototype` of `ReactiveList`* - -__Arguments__ - -* __noneReactive__ *{boolean}* (Optional = false) -Set true if want to disable reactivity - -- - -__Returns__ *{array}* __(is reactive)__ -List of items - -> ```ReactiveList.prototype.fetch = function(noneReactive) { ...``` [reactive-list.js:282](reactive-list.js#L282) - -- diff --git a/packages/wekan-cfs-reactive-list/package.js b/packages/wekan-cfs-reactive-list/package.js deleted file mode 100644 index a96928f78..000000000 --- a/packages/wekan-cfs-reactive-list/package.js +++ /dev/null @@ -1,23 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-reactive-list', - version: '0.0.9', - summary: 'ReactiveList provides a small, fast queue/list built for Power-Queue', - git: 'https://github.com/zcfs/Meteor-reactive-list.git' -}); - -Package.onUse(function (api) { - api.versionsFrom('1.0'); - - api.use('deps', ['client', 'server']); - - api.export('ReactiveList'); - api.addFiles(['reactive-list.js'], ['client', 'server']); -}); - -Package.onTest(function (api) { - api.use('wekan-cfs-reactive-list'); - api.use('test-helpers', 'server'); - api.use('tinytest'); - - api.addFiles('tests.js'); -}); diff --git a/packages/wekan-cfs-reactive-list/reactive-list.js b/packages/wekan-cfs-reactive-list/reactive-list.js deleted file mode 100644 index c99434bc4..000000000 --- a/packages/wekan-cfs-reactive-list/reactive-list.js +++ /dev/null @@ -1,313 +0,0 @@ -// #ReactiveList -// Provides a simple reactive list interface -var _noopCallback = function() {}; - -var _nonReactive = { - changed: _noopCallback, - depend: _noopCallback -}; - -/** @method ReactiveList Keeps a reactive list of key+value items - * @constructor - * @namespace ReactiveList - * @param {object} [options] - * @param {function} sort The sort algorithm to use - * @param {boolean} [reactive=true] If set false this list is not reactive - * Example: - * ```js - * var list = new ReactiveList(); - * list.insert(1, { text: 'Hello id: 1' }); - * list.insert(2, { text: 'Hello id: 2' }); - * list.insert(3, { text: 'Hello id: 3' }); - * list.update(2, { text: 'Updated 2'}); - * list.remove(1); - * - * list.forEach(function(value, key) { - * console.log('GOT: ' + value.text); - * }, true); // Set noneReactive = true, default behaviour is reactive - * - * // Return from Template: - * Template.hello.list = function() { - * return list.fetch(); - * }; - * ``` - * - * ####Example of a sort algorithm - * Sort can be used to define the order of the list - * ```js - * var list = new ReactiveList({ - * sort: function(a, b) { - * // a and b are type of { key, value } - * // here we sort by the key: - * return a.key < b.key; - * } - * }); - * ``` - * ###Object chain - * ``` - * first last - * undefined - obj - obj - obj - undefined - * (prev value next) (prev value next) (prev value next) - * ``` - */ -ReactiveList = function(options) { - var self = this; - // Object container - self.lookup = {}; - // Length - self._length = 0; - // First object in list - self.first; - // Last object in list - self.last; - // Set sort to options.sort or default to true (asc) - self.sort = (options && options.sort || function(a, b) { - return a.key < b.key; - }); - - // Allow user to disable reactivity, default true - self.isReactive = (options)? options.reactive !== false : true; - - // If lifo queue - if (options === true || options && options.sort === true) { - self.sort = function(a, b) { return a.key > b.key; }; - } - - // Rig the dependencies - self._listDeps = (self.isReactive)? new Deps.Dependency() : _nonReactive; - - self._lengthDeps = (self.isReactive)? new Deps.Dependency() : _nonReactive; -}; - -/** @method ReactiveList.prototype.length Returns the length of the list - * @reactive - * @returns {number} Length of the reactive list - */ -ReactiveList.prototype.length = function() { - var self = this; - // Make this reactive - self._lengthDeps.depend(); - return self._length; -}; - -/** @method ReactiveList.prototype.reset Reset and empty the list - * @todo Check for memory leaks, if so we have to iterate over lookup and delete the items - */ -ReactiveList.prototype.reset = function() { - var self = this; - // Clear the reference to the first object - self.first = undefined; - // Clear the reference to the last object - self.last = undefined; - // Clear the lookup object - self.lookup = {}; - // Set the length to 0 - self._length = 0; - self._lengthDeps.changed(); - // Invalidate the list - self._listDeps.changed(); -}; - -/** @method ReactiveList.prototype.update - * @param {string|number} key Key to update - * @param {any} value Update with this value - */ -ReactiveList.prototype.update = function(key, value) { - var self = this; - // Make sure the key is found in the list - if (typeof self.lookup[key] === 'undefined') { - throw new Error('Reactive list cannot update, key "' + key + '" not found'); - } - // Set the new value - self.lookup[key].value = value; - // Invalidate the list - self._listDeps.changed(); -}; - -/** @method ReactiveList.prototype.insert - * @param {string|number} key Key to insert - * @param {any} value Insert item with this value - */ -ReactiveList.prototype.insert = function(key, value) { - var self = this; - if (typeof self.lookup[key] !== 'undefined') { - throw new Error('Reactive list could not insert: key "' + key + - '" allready found'); - } - // Create the new item to insert into the list - var newItem = { key: key, value: value }; - // Init current by pointing it at the first object in the list - var current = self.first; - // Init the isInserted flag - var isInserted = false; - - - // Iterate through list while not empty and item is not inserted - while (typeof current !== 'undefined' && !isInserted) { - - // Sort the list by using the sort function - if (self.sort(newItem, current)) { - - // Insert self.lookup[key] before - if (typeof current.prev === 'undefined') { self.first = newItem; } - - // Set the references in the inserted object - newItem.prev = current.prev; - newItem.next = current; - - // Update the two existing objects - if (current.prev) { current.prev.next = newItem; } - current.prev = newItem; - - // Mark the item as inserted - job's done - isInserted = true; - } - // Goto next object - current = current.next; - } - - - if (!isInserted) { - // We append it to the list - newItem.prev = self.last; - if (self.last) { self.last.next = newItem; } - - // Update the last pointing to newItem - self.last = newItem; - // Update first if we are appending to an empty list - if (self._length === 0) { self.first = newItem; } - } - - - // Reference the object for a quick lookup option - self.lookup[key] = newItem; - // Increase length - self._length++; - self._lengthDeps.changed(); - // And invalidate the list - self._listDeps.changed(); -}; - -/** @method ReactiveList.prototype.remove - * @param {string|number} key Key to remove - */ -ReactiveList.prototype.remove = function(key) { - var self = this; - // Get the item object - var item = self.lookup[key]; - - // Check that it exists - if (typeof item === 'undefined') { - return; - // throw new Error('ReactiveList cannot remove item, unknow key "' + key + - // '"'); - } - - // Rig the references - var prevItem = item.prev; - var nextItem = item.next; - - // Update chain prev object next reference - if (typeof prevItem !== 'undefined') { - prevItem.next = nextItem; - } else { - self.first = nextItem; - } - - // Update chain next object prev reference - if (typeof nextItem !== 'undefined') { - nextItem.prev = prevItem; - } else { - self.last = prevItem; - } - - // Clean up - self.lookup[key].last = null; - self.lookup[key].prev = null; - self.lookup[key] = null; - prevItem = null; - - delete self.lookup[key]; - // Decrease the length - self._length--; - self._lengthDeps.changed(); - // Invalidate the list - self._listDeps.changed(); -}; - -/** @method ReactiveList.prototype.getLastItem - * @returns {any} Pops last item from the list - removes the item from the list - */ -ReactiveList.prototype.getLastItem = function(first) { - var self = this; - - // Get the relevant item first or last - var item = (first)?self.first: self.last; - - if (typeof item === 'undefined') { - return; // Empty list - } - // Remove the item from the list - self.remove(item.key); - // Return the value - return item.value; -}; - -/** @method ReactiveList.prototype.getFirstItem - * @returns {any} Pops first item from the list - removes the item from the list - */ -ReactiveList.prototype.getFirstItem = function() { - // This gets the first item... - return this.getLastItem(true); -}; - -/** @method ReactiveList.prototype.forEach - * @param {function} f Callback `funciton(value, key)` - * @param {boolean} [noneReactive=false] Set true if want to disable reactivity - * @param {boolean} [reverse=false] Set true to reverse iteration `forEachReverse` - */ -ReactiveList.prototype.forEach = function(f, noneReactive, reverse) { - var self = this; - // Check if f is a function - if (typeof f !== 'function') { - throw new Error('ReactiveList forEach requires a function'); - } - // We allow this not to be reactive - if (!noneReactive) { self._listDeps.depend(); } - // Set current to the first object - var current = (reverse)?self.last: self.first; - // Iterate over the list while its not empty - while (current) { - // Call the callback function - f(current.value, current.key); - // Jump to the next item in the list - current = (reverse)?current.prev: current.next; - } -}; - -/** @method ReactiveList.prototype.forEachReverse - * @param {function} f Callback `funciton(value, key)` - * @param {boolean} [noneReactive=false] Set true if want to disable reactivity - */ -ReactiveList.prototype.forEachReverse = function(f, noneReactive) { - // Call forEach with the reverse flag - this.forEach(f, noneReactive, true); -}; - -/** @method ReactiveList.prototype.fetch Returns list as array - * @param {boolean} [noneReactive=false] Set true if want to disable reactivity - * @reactive This can be disabled - * @returns {array} List of items - */ -ReactiveList.prototype.fetch = function(noneReactive) { - var self = this; - // Init the result buffer - var result = []; - // Iterate over the list items - self.forEach(function fetchCallback(value) { - // Add the item value to the result - result.push(value); - }, noneReactive); - // Return the result - return result; -}; diff --git a/packages/wekan-cfs-reactive-list/tests.js b/packages/wekan-cfs-reactive-list/tests.js deleted file mode 100644 index e13e90318..000000000 --- a/packages/wekan-cfs-reactive-list/tests.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; - -function equals(a, b) { - return !!(JSON.stringify(a) === JSON.stringify(b)); -} - -Tinytest.add('ReactiveList - definition', function(test) { - test.isTrue(typeof ReactiveList !== 'undefined', 'ReactiveList is undefined, make sure to add the reactive-list package'); -}); - - -// We do a small test of insert and remove -Tinytest.addAsync('ReactiveList - basic insert and remove - test 1', function test1 (test, onComplete) { - Meteor.setTimeout(function() { - var list = new ReactiveList({ - reactive: true - }); - - var testLength = 500; - - for (var i = 0; i < testLength; i++) - list.insert(i, 'value' + i); - - test.equal(list._length, testLength, 'List length is not as expected'); - - var order = 0; - list.forEach(function(value, key) { - test.equal(key, order, 'order is not as expected'); - test.equal(value, 'value'+order, 'order is not as expected'); - order++; - }); - - test.equal(order, testLength, 'forEach length is not as expected'); - - list.forEachReverse(function(value, key) { - order--; - test.equal(key, order, 'order is not as expected'); - test.equal(value, 'value'+order, 'order is not as expected'); - }); - - test.equal(order, 0, 'forEachReverse length is not as expected'); - - // Remove all items - for (var i = 0; i < testLength; i++) - list.remove(i); - - test.equal(list._length, 0, 'List length is not as expected'); - - test.isUndefined(list.first, 'First should now be undefined'); - - test.isUndefined(list.last, 'Last should now be undefined'); - onComplete(); - }, 1000); -}); - - -// We test insert and remove on larger scale -Tinytest.addAsync('ReactiveList - basic insert and reset - test 2', function test2 (test, onComplete) { - Meteor.setTimeout(function() { - var list = new ReactiveList({ - reactive: true - }); - - - var testLength = 500; - - for (var i = 0; i < testLength; i++) - list.insert(i, 'value' + i); - - test.equal(list._length, testLength, 'List length is not as expected'); - - - // Remove all items - list.reset(); - - test.equal(list._length, 0, 'List length is not as expected'); - - test.isUndefined(list.first, 'First should now be undefined'); - - test.isUndefined(list.last, 'Last should now be undefined'); - - onComplete(); - }, 5000); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-reactive-property/.editorconfig b/packages/wekan-cfs-reactive-property/.editorconfig deleted file mode 100644 index 37a7d486e..000000000 --- a/packages/wekan-cfs-reactive-property/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# .editorconfig -# Meteor adapted EditorConfig, http://EditorConfig.org -# By RaiX 2013 - -root = true - -[*.js] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -charset = utf-8 -max_line_length = 80 -indent_brace_style = 1TBS -spaces_around_operators = true -quote_type = auto -# curly_bracket_next_line = true diff --git a/packages/wekan-cfs-reactive-property/.gitignore b/packages/wekan-cfs-reactive-property/.gitignore deleted file mode 100644 index 45353da68..000000000 --- a/packages/wekan-cfs-reactive-property/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/versions.json -.build* diff --git a/packages/wekan-cfs-reactive-property/.jshintrc b/packages/wekan-cfs-reactive-property/.jshintrc deleted file mode 100644 index 52d24acf2..000000000 --- a/packages/wekan-cfs-reactive-property/.jshintrc +++ /dev/null @@ -1,97 +0,0 @@ -{ - // JSHint Meteor Configuration File - // Match the Meteor Style Guide - // - // By @raix with contributions from @aldeed and @awatson1978 - // Source https://github.com/raix/Meteor-jshintrc - // - // See http://jshint.com/docs/ for more details - - "maxerr": 50, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "forin": true, - "immed": false, - "indent": 2, - "latedef": false, - "newcap": false, - "noarg": true, - "noempty": true, - "nonew": false, - "plusplus": false, - "quotmark": false, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "maxparams": false, - "maxdepth": false, - "maxstatements": false, - "maxcomplexity": false, - "maxlen": 80, - "asi": false, - "boss": false, - "debug": false, - "eqnull": false, - "es5": false, - "esnext": false, - "moz": false, - "evil": false, - "expr": false, - "funcscope": false, - "globalstrict": true, - "iterator": false, - "lastsemic": false, - "laxbreak": false, - "laxcomma": false, - "loopfunc": false, - "multistr": false, - "proto": false, - "scripturl": false, - "smarttabs": false, - "shadow": false, - "sub": false, - "supernew": false, - "validthis": false, - "browser": true, - "couch": false, - "devel": true, - "dojo": false, - "jquery": false, - "mootools": false, - "node": false, - "nonstandard": false, - "prototypejs": false, - "rhino": false, - "worker": false, - "wsh": false, - "yui": false, - "nomen": false, - "onevar": false, - "passfail": false, - "white": false, - "predef": [ - "Meteor", - "Accounts", - "Session", - "Template", - "check", - "Match", - "Deps", - "EJSON", - "Email", - "Package", - "Tinytest", - "Npm", - "Assets", - "Packages", - "process", - "LocalCollection", - "_", - "Random", - "HTTP", - "_methodHTTP" - ] -} \ No newline at end of file diff --git a/packages/wekan-cfs-reactive-property/LICENSE.md b/packages/wekan-cfs-reactive-property/LICENSE.md deleted file mode 100644 index 2a5c5339e..000000000 --- a/packages/wekan-cfs-reactive-property/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-reactive-property/README.md b/packages/wekan-cfs-reactive-property/README.md deleted file mode 100644 index 14d5c4a7f..000000000 --- a/packages/wekan-cfs-reactive-property/README.md +++ /dev/null @@ -1,32 +0,0 @@ -wekan-cfs-reactive-property [![Build Status](https://travis-ci.org/CollectionFS/Meteor-reactive-property.png?branch=master)](https://travis-ci.org/CollectionFS/Meteor-reactive-property) -========= - -~~Looking for maintainers - please reach out!~~ -This package is to be archived due to inability to find contributors, thanks to everyone who helped make it possible. - -**If you're looking for an alternative, we highly recommend [Meteor-Files](https://github.com/VeliovGroup/Meteor-Files) by [VeliovGroup](https://github.com/VeliovGroup)** - ---- - -ReactiveProperty: -* `get` Get value -* `set` Set value -* `getset` A combined getter and setter -* `inc` Increase numeric values -* `dec` Decrease numeric values - -And... It's powered by Meteor's reactive sugar :) - -Kind regards Eric(@aldeed) and Morten(@raix) - -Happy coding!! - -#API -[API Documentation](api.md) - -#Contribute -[API Complete Documentation](internal.api.md) -Update docs, `npm install docmeteor` -```bash -$ docmeteor -``` diff --git a/packages/wekan-cfs-reactive-property/api.md b/packages/wekan-cfs-reactive-property/api.md deleted file mode 100644 index ce1886f88..000000000 --- a/packages/wekan-cfs-reactive-property/api.md +++ /dev/null @@ -1,152 +0,0 @@ -#ReactiveProperty -A simple class that provides an reactive property interface - -#### new ReactiveProperty(defaultValue, [reactive])  Anywhere #### -- - -__Arguments__ - -* __defaultValue__ *{any}* -Set the default value for the reactive property -* __reactive__ *{boolean}* (Optional = true) -Allow the user to disable reactivity - -- - - -This api should only be in the internal.api.md - -> ```ReactiveProperty = function(defaultValue, reactive) { ...``` [reactive-property.js:18](reactive-property.js#L18) - -- - -#### ReactiveProperty.get()  Anywhere #### -- -*This method __get__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.get(); // equals "bar" -``` - -> ```self.get = function() { ...``` [reactive-property.js:44](reactive-property.js#L44) - -- - -#### ReactiveProperty.set(value)  Anywhere #### -- -*This method __set__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __value__ *{any}* - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set('bar'); -``` - -> ```self.set = function(value) { ...``` [reactive-property.js:58](reactive-property.js#L58) - -- - -#### ReactiveProperty.dec([by])  Anywhere #### -- -*This method __dec__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __by__ *{number}* (Optional = 1) -Value to decrease by - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set(0); - foo.dec(5); // -5 -``` - -> ```self.dec = function(by) { ...``` [reactive-property.js:75](reactive-property.js#L75) - -- - -#### ReactiveProperty.inc([by])  Anywhere #### -- -*This method __inc__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __by__ *{number}* (Optional = 1) -Value to increase by - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set(0); - foo.inc(5); // 5 -``` - -> ```self.inc = function(by) { ...``` [reactive-property.js:90](reactive-property.js#L90) - -- - -#### ReactiveProperty.getset([value])  Anywhere #### -- -*This method __getset__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __value__ *{any}* (Optional) -Value to set property - if undefined the act like `get` - -- - -__Returns__ *{any}* -Returns value if no arguments are passed to the function - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.getset(5); - foo.getset(); // returns 5 -``` - -> ```self.getset = function(value) { ...``` [reactive-property.js:106](reactive-property.js#L106) - -- - -#### ReactiveProperty.toString()  Anywhere #### -- -*This method __toString__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.toString(); // returns 'bar' -``` - -> ```self.toString = function() { ...``` [reactive-property.js:122](reactive-property.js#L122) - -- - -#### ReactiveProperty.toText()  Anywhere #### -- -*This method __toText__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.toText(); // returns 'bar' -``` - -> ```self.toText = self.toString;``` [reactive-property.js:135](reactive-property.js#L135) - -- diff --git a/packages/wekan-cfs-reactive-property/internal.api.md b/packages/wekan-cfs-reactive-property/internal.api.md deleted file mode 100644 index 74b4b6607..000000000 --- a/packages/wekan-cfs-reactive-property/internal.api.md +++ /dev/null @@ -1,167 +0,0 @@ -> File: ["reactive-property.js"](reactive-property.js) -> Where: {client|server} - -- -#ReactiveProperty -A simple class that provides an reactive property interface - -#### new ReactiveProperty(defaultValue, [reactive])  Anywhere #### -- - -__Arguments__ - -* __defaultValue__ *{any}* -Set the default value for the reactive property -* __reactive__ *{boolean}* (Optional = true) -Allow the user to disable reactivity - -- - - -This api should only be in the internal.api.md - -> ```ReactiveProperty = function(defaultValue, reactive) { ...``` [reactive-property.js:18](reactive-property.js#L18) - -- - -#### ReactiveProperty.value {any}  Anywhere #### -- -*This property is private* -*This property __value__ is defined in `ReactiveProperty`* -This contains the non reactive value, should only be used as a getter for -internal use - -> ```self.value = defaultValue;``` [reactive-property.js:27](reactive-property.js#L27) - -- - -#### ReactiveProperty.get()  Anywhere #### -- -*This method __get__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.get(); // equals "bar" -``` - -> ```self.get = function() { ...``` [reactive-property.js:44](reactive-property.js#L44) - -- - -#### ReactiveProperty.set(value)  Anywhere #### -- -*This method __set__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __value__ *{any}* - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set('bar'); -``` - -> ```self.set = function(value) { ...``` [reactive-property.js:58](reactive-property.js#L58) - -- - -#### ReactiveProperty.dec([by])  Anywhere #### -- -*This method __dec__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __by__ *{number}* (Optional = 1) -Value to decrease by - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set(0); - foo.dec(5); // -5 -``` - -> ```self.dec = function(by) { ...``` [reactive-property.js:75](reactive-property.js#L75) - -- - -#### ReactiveProperty.inc([by])  Anywhere #### -- -*This method __inc__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __by__ *{number}* (Optional = 1) -Value to increase by - -- - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.set(0); - foo.inc(5); // 5 -``` - -> ```self.inc = function(by) { ...``` [reactive-property.js:90](reactive-property.js#L90) - -- - -#### ReactiveProperty.getset([value])  Anywhere #### -- -*This method __getset__ is defined in `ReactiveProperty`* - -__Arguments__ - -* __value__ *{any}* (Optional) -Value to set property - if undefined the act like `get` - -- - -__Returns__ *{any}* -Returns value if no arguments are passed to the function - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.getset(5); - foo.getset(); // returns 5 -``` - -> ```self.getset = function(value) { ...``` [reactive-property.js:106](reactive-property.js#L106) - -- - -#### ReactiveProperty.toString()  Anywhere #### -- -*This method __toString__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.toString(); // returns 'bar' -``` - -> ```self.toString = function() { ...``` [reactive-property.js:122](reactive-property.js#L122) - -- - -#### ReactiveProperty.toText()  Anywhere #### -- -*This method __toText__ is defined in `ReactiveProperty`* - -Usage: -```js - var foo = new ReactiveProperty('bar'); - foo.toText(); // returns 'bar' -``` - -> ```self.toText = self.toString;``` [reactive-property.js:135](reactive-property.js#L135) - -- diff --git a/packages/wekan-cfs-reactive-property/package.js b/packages/wekan-cfs-reactive-property/package.js deleted file mode 100644 index cc8797e96..000000000 --- a/packages/wekan-cfs-reactive-property/package.js +++ /dev/null @@ -1,23 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-reactive-property', - version: '0.0.4', - summary: 'Reactive Property is a small, fast reative property class', - git: 'https://github.com/zcfs/Meteor-reactive-property.git' -}); - -Package.onUse(function (api) { - api.versionsFrom('1.0'); - - api.use('deps', ['client', 'server']); - - api.export('ReactiveProperty'); - api.addFiles(['reactive-property.js'], ['client', 'server']); -}); - -// Package.onTest(function (api) { -// api.use('power-queue'); -// api.use('test-helpers', 'server'); -// api.use('tinytest'); - -// api.add_files('tests.js'); -// }); diff --git a/packages/wekan-cfs-reactive-property/reactive-property.js b/packages/wekan-cfs-reactive-property/reactive-property.js deleted file mode 100644 index 183f3aea9..000000000 --- a/packages/wekan-cfs-reactive-property/reactive-property.js +++ /dev/null @@ -1,137 +0,0 @@ -// #ReactiveProperty -// A simple class that provides an reactive property interface - -_noopCallback = function() {}; - -_nonReactive = { - changed: _noopCallback, - depend: _noopCallback -}; - -/** - * @constructor - * @param {any} defaultValue Set the default value for the reactive property - * @param {boolean} [reactive = true] Allow the user to disable reactivity - * - * This api should only be in the internal.api.md - */ -ReactiveProperty = function(defaultValue, reactive) { - var self = this; - var _deps = (reactive === false)? _nonReactive : new Deps.Dependency(); - - /** @property ReactiveProperty.value - * @private - * This contains the non reactive value, should only be used as a getter for - * internal use - */ - self.value = defaultValue; - - self.onChange = function() {}; - - self.changed = function() { - _deps.changed(); - self.onChange(self.value); - }; - - /** - * @method ReactiveProperty.get - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.get(); // equals "bar" - * ``` - */ - self.get = function() { - _deps.depend(); - return self.value; - }; - - /** - * @method ReactiveProperty.set Set property to value - * @param {any} value - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.set('bar'); - * ``` - */ - self.set = function(value) { - if (self.value !== value) { - self.value = value; - self.changed(); - } - }; - - /** - * @method ReactiveProperty.dec Decrease numeric property - * @param {number} [by=1] Value to decrease by - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.set(0); - * foo.dec(5); // -5 - * ``` - */ - self.dec = function(by) { - self.value -= by || 1; - self.changed(); - }; - - /** - * @method ReactiveProperty.inc increase numeric property - * @param {number} [by=1] Value to increase by - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.set(0); - * foo.inc(5); // 5 - * ``` - */ - self.inc = function(by) { - self.value += by || 1; - self.changed(); - }; - - /** - * @method ReactiveProperty.getset increase numeric property - * @param {any} [value] Value to set property - if undefined the act like `get` - * @returns {any} Returns value if no arguments are passed to the function - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.getset(5); - * foo.getset(); // returns 5 - * ``` - */ - self.getset = function(value) { - if (typeof value !== 'undefined') { - self.set(value); - } else { - return self.get(); - } - }; - - /** - * @method ReactiveProperty.toString - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.toString(); // returns 'bar' - * ``` - */ - self.toString = function() { - var val = self.get(); - return val ? val.toString() : ''; - }; - - /** - * @method ReactiveProperty.toText - * Usage: - * ```js - * var foo = new ReactiveProperty('bar'); - * foo.toText(); // returns 'bar' - * ``` - */ - self.toText = self.toString; - -}; diff --git a/packages/wekan-cfs-reactive-property/tests.js b/packages/wekan-cfs-reactive-property/tests.js deleted file mode 100644 index 863e96821..000000000 --- a/packages/wekan-cfs-reactive-property/tests.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; - -function equals(a, b) { - return !!(JSON.stringify(a) === JSON.stringify(b)); -} - -Tinytest.add('ReactiveProperty - test', function(test) { - //TODO -}); - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-standard-packages/.travis.yml b/packages/wekan-cfs-standard-packages/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-standard-packages/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-standard-packages/ADVANCED.md b/packages/wekan-cfs-standard-packages/ADVANCED.md deleted file mode 100644 index 8e8b64012..000000000 --- a/packages/wekan-cfs-standard-packages/ADVANCED.md +++ /dev/null @@ -1,265 +0,0 @@ -This is advanced information useful for anyone who contributes to CollectionFS -or wants to make their own storage adapter. - -## Goals - -* Scale horizontally and vertically -* Secure file operations and file serving -* Limit memory consumption and stream where possible -* Use queues to provide synchronous execution of tasks -* Reactivity -* Uploads and downloads are cancelable and resumable - -## All Packages - -* wekan-cfs-standard-packages (implies some component packages) - * wekan-cfs-base-package - * wekan-cfs-file - * wekan-cfs-collection - * wekan-cfs-collection-filters - * wekan-cfs-access-point - * wekan-cfs-worker - * wekan-cfs-upload-http -* wekan-cfs-graphicsmagick -* wekan-cfs-ui -* wekan-cfs-filesystem -* wekan-cfs-gridfs -* wekan-cfs-s3 -* wekan-cfs-dropbox - -## Collections - -Various MongoDB collections are created by CollectionFS and related packages. -Here's an explanation of what they are named and what their documents look like. - -### cfs.collectionName.filerecord (FS.Collection) - -```js -{ - _id: "", - copies: { - storeName: { - key: String, // a string that the store generates, understands, and uses to uniquely identify the file in the backing store - name: String, // as saved in this store, potentially changed by beforeWrite - type: String, // as saved in this store, potentially changed by beforeWrite - size: Number, // as saved in this store, in bytes, potentially changed by beforeWrite - createdAt: Date, // when first saved in this store - updatedAt: Date // when last saved in this store - } - }, - original: { - name: String, // of the originally uploaded file - type: String, // of the originally uploaded file - size: Number, // of the originally uploaded file, in bytes - updatedAt: Date // of the originally uploaded file - }, - failures: { - copies: { - storeName: { - count: Number, - firstAttempt: Date, - lastAttempt: Date, - doneTrying: Boolean - } - } - } -} -``` - -The `original` object represents the file that was uploaded. Each object under `copies`, represents the file that was stored, keyed by store name. - -The original file isn’t technically stored anywhere permanently, so the `original` object can be generally ignored. It’s there for reference in case you want to see any of that info. - -The objects under the `copies` object represent the copies of the original that were actually saved in the backing stores. The info here might be the same as the original file, or it might be different if your store has a `beforeWrite` or `transformWrite` function that changes the stored file's properties. - -You can change any of the info in the `copies` object using the setter methods on FS.File instances, like fileObj.name('NewName.gif', {store: 'blobs'}), which would change the name of the file stored in the blobs store. Of course you wouldn't want to change `type` or `size` unless you were also transforming the binary file data itself. The important thing is not to touch the `key` property since that's used by the store to retrieve the file data. The rest is metadata that you're free to change. - -### cfs_gridfs... - -Created by the GridFS storage adapter. The `cfs_gridfs..files` and `cfs_gridfs..chunks` collections match the MongoDB GridFS spec. - -### _tempstore - -When files are first uploaded or inserted on the server, we save the original to a temporary store. This is a place where data can be stored until we have all the chunks we need and we are able to successfully save the file to all of the defined permanant stores. The temporary store may create one or more collections with `_tempstore` in the name. In general, it is relatively safe to clear these collections at any time. The worst you will do is cause a currently uploading or currently storing file to fail. - -## Creating a Storage Adapter - -To create a storage adapter, define an object constructor function that takes -a name as a first argument and any additional necessary settings as additional -arguments. Make it return an instance of FS.StorageAdapter, passing your API to -the FS.StorageAdapter constructor function. Here's an example: - -```js -FS.MyStore = function(name, options) { - // Prep some variables here - - return new FS.StorageAdapter(name, {}, { - typeName: 'storage.myadapter', - get: function(identifier, callback) { - // Use identifier to retrieve a Buffer and pass it to callback - }, - getBytes: function(identifier, start, end, callback) { - // Use identifier to retrieve a Buffer containing only - // the bytes from start to end, and pass it to callback. - // If this is impossible, don't include a getBytes property. - }, - put: function(id, fileKey, buffer, options, callback) { - // Store the buffer and then call the callback, passing it - // an identifier that will later be the first argument of the - // other API functions. The identifier will likely be the - // fileKey, the id, or some altered version of those. - }, - remove: function(identifier, callback) { - // Delete the data for the file identified by identifier - }, - watch: function(callback) { - // If you can watch file data, initialize a watcher and then call - // callback whenever a file changes. Refer to the filesystem - // storage adapter for an example. If you can't watch files, then - // throw an error stating that the "sync" option is not supported. - }, - init: function() { - // Perform any initialization - } - }); -}; -``` - -`getBytes` and `init` are optional. The others are required, but you should throw -an error from `watch` if you can't watch files. Your `put` function should check -for an `overwrite` option. If it's true, save the data even if you've already -saved for the given `id` or `fileKey`. If not, you may alter the `fileKey` as -necessary to prevent overwriting and then pass the altered `fileKey` to the -callback. - -By convention, any official stores should be in the `FS` namespace -and end with the word "Store". - -## Architecture - -``` -Client <---- (ddp/http) --- | CFS access point | - | Security layer | - | Storage adapters | - | | | | - Mongo–––––––––O | | | - Local––––––––––––––O | | - Fileserver––––––––––––––O | - External server––––––––––––––O -``` - -## The Upload Process (DDP) - -Here's a closer look at what happens when a file is uploaded. - -### Step 1: Insert - -All uploads initiate on a client. If a file is inserted on the server, the -data is already on the server, so no upload process is necessary. - -An upload begins when you call `insert()` on an `FS.Collection` instance. The -`insert` method inserts the file's metadata into the underlying collection on -the client. If that is successful, it immediately calls `put()` on the `FS.File` -instance. This in turn calls `FS.uploadQueue.uploadFile()`, which kicks off -the data upload. - -### Step 2: Transfer - -The upload transfer queue's `uploadFile` method uses the file size and a -pre-defined chunk size to determine how many chunks the file will be broken into. -It then adds one task to its PowerQueue instance per chunk. Each chunk task does -the following: - -1. Extracts the necessary subset (chunk) of data from the file. -2. Passes the data chunk to a server method over DDP. -3. Marks the chunk uploaded in a client-only tracking collection if the server -method reports no errors. - -PowerQueue's reactive methods are used to report total progress for all current -uploads, but the custom client-only tracking collection is used to report progress -per file. (TODO: update this after PQ sub-queues are done and the transfer -queues are updated to use them) - -### Step 3: Receive - -Each data chunk is received by a DDP access point (a server method defined in -accessPoint.js). This method does the following: - -1. Checks that incoming arguments are of the correct type. -2. If the `insecure` package is not used, checks the `insert` allow and deny -functions. If insertion is denied, the method throws an access denied error. -3. Passes the data chunk to the temporary store. -4. If the temporary store reports that it now has all chunks for the file, -retrieves the complete file from the temporary store and calls `fsFile.put()` -to begin the process of saving it to each of the defined stores. - -### Step 4: Temporarily Store - -The temporary store is managed by the `FS.TempStore` object. When the server method -calls `FS.TempStore.saveChunk()`, the chunk data is saved to a randomly named -temporary file in the server operating system's default temporary directory. -The path to this file is saved in the `chunks` array on the corresponding FS.File. -(The `chunks` property is available on an FS.File instance only on the server -because it is used strictly for server-side tracking.) - -`saveChunk` calls a callback after saving the chunk. The second argument of -this callback is `true` if all chunks for the given file are now saved in the -temporary store (i.e., all chunks were uploaded so all file data is now present -on the server). - -Using a temporary filesystem store like this ensures that chunks remain available -after an app or server restart, allowing the client to resume uploads. Chunks -are saved to the app server filesystem rather than GridFS in your MongoDB because it -is theoretically faster, especially when the mongo database is on a separate server. - -NOTE: The first version of temp storage appended/wrote to a single temp file -per uploaded file, but there are issues with file locking and writing to -specific start-points in an existing file. By switching to 1 chunk = 1 temp -file, we have the freedom to have parallel chunk uploads in any order without -fear of file lock contention, and it's still really fast. - -### Step 5: Store - -After the server method calls `put()` on the complete uploaded file, this in -turn calls `saveCopies()` on its associated `FS.Collection` instance. `saveCopies` -loops through each copy/store you defined in the options and saves the file -to that store. If you defined a `beforeSave` function for the store, the file -passes through that function first. If a `beforeSave` returns `false`, this is -recorded in the `FS.File` instance and the file will never be saved to that store. - -* If the store reports that it successfully saved the file, a reference string, -returned by the store, is stored in `fsFile.copies[storeName]`. This string will -be anything that the store wants to return, so long as it can be used later to -retrieve that same file. -* If the store reports that it was not able to save the file, the error is logged -in the `FS.File` instance. If the total number of failures exceeds the `maxTries` -setting for the store, a `doneTrying` flag is set to `true`. When `doneTrying` -is `false`, the FileWorker may attempt to save again later. (See the next step.) - -### Step 6: Retry - -The `FileWorker` (in fileWorker.js), searches all `FS.Collection` every 5 -seconds (not configurable right now but could be) to see if there are any -storage failures that meet the criteria to be -retried (namely, if failure count > 0 and doneTrying is false). The file worker -then calls `saveCopies` for each file that is identified. (See the previous step.) - -The `FileWorker` also does one more thing. If it identifies any files that have -been successfully saved to all defined stores, or that have failed to save the -maximum number of times for a store, or that won't be saved to a store because -`beforeSave` returned `false`, then it tells `FS.TempStore` to delete all the -temporary chunks for that file. They are no longer needed. - -Note: One the temporary chunks are deleted, the "original" file will be no longer -available if all stores are modifying the original using a `beforeSave` function. - -## The Download Process (DDP) - -Here's a closer look at what happens when a file is downloaded. - -TODO Explain with similar layout to "The Upload Process" section - -## Wish List - -* Dynamic file manipulation -* Paste box upload component diff --git a/packages/wekan-cfs-standard-packages/CHANGELOG.md b/packages/wekan-cfs-standard-packages/CHANGELOG.md deleted file mode 100644 index 342de524c..000000000 --- a/packages/wekan-cfs-standard-packages/CHANGELOG.md +++ /dev/null @@ -1,721 +0,0 @@ -# Changelog - -## vCurrent -## [v0.5.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.2) -#### 17/12/14 by Morten Henriksen -- Bump to version 0.5.2 - -## [v0.5.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.1) -#### 17/12/14 by Morten Henriksen -- mbr update, remove versions.json - -- Bump to version 0.5.1 - -## [v0.5.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.5.0) -#### 17/12/14 by Morten Henriksen -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- mbr update versions and fix warnings - -- update pkg, dependencies, etc. - -- Fix #483 - -- *Merged pull-request:* "mrt graphicsmagick instructions to meteor 0.9+" [#442](https://github.com/zcfs/Meteor-CollectionFS/issues/442) ([yogiben](https://github.com/yogiben)) - -- mrt graphicsmagick instructions to meteor 0.9+ - -- mention underlying collection - -- *Merged pull-request:* "Added server-side Buffer example to README.md" [#405](https://github.com/zcfs/Meteor-CollectionFS/issues/405) ([abuddenb](https://github.com/abuddenb)) - -- change prop names - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- add "Display an Uploaded Image" example - -- addition to steps - -- correct 0.9.0 steps - -- Merge branch 'devel' of github.com:abuddenb/Meteor-CollectionFS into devel - -- Added server-side Buffer example to README.md - -Patches by GitHub users [@yogiben](https://github.com/yogiben), [@abuddenb](https://github.com/abuddenb). - -## [v0.4.9] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.9) -#### 27/08/14 by Eric Dobbertin -- add 0.9.0 instructions - -- change package name to lowercase - -- Added server-side Buffer example to README.md - -- *Merged pull-request:* "Updated README.md to reflect that FS.File - Objects can't be stored in t..." [#395](https://github.com/zcfs/Meteor-CollectionFS/issues/395) ([DanielDornhardt](https://github.com/DanielDornhardt)) - -- Updated README.md to reflect that FS.File - Objects can't be stored in the Server MongoDB at the moment. - -- document key - -- update the descriptions of collections - -- document beforeWrite - -- add download button example - -- *Merged pull-request:* "Update README.md" [#354](https://github.com/zcfs/Meteor-CollectionFS/issues/354) ([karabijavad](https://github.com/karabijavad)) - -- should say to use cfs-graphicsmagick pkg - -- fix typo - -- *Merged pull-request:* "Added "Storing FS.File references in your objects" chapter to README" [#311](https://github.com/zcfs/Meteor-CollectionFS/issues/311) ([Sanjo](https://github.com/Sanjo)) - -- Added "Storing FS.File references in your objects" chapter to README - -- a few more API updates - -- updates for changed FS.File API - -- additions and clarifications - -- *Merged pull-request:* "Custom Metadata misleading example" [#282](https://github.com/zcfs/Meteor-CollectionFS/issues/282) ([czeslaaw](https://github.com/czeslaaw)) - -- Custom Metadata misleading example - -Patches by GitHub users [@DanielDornhardt](https://github.com/DanielDornhardt), [@karabijavad](https://github.com/karabijavad), [@Sanjo](https://github.com/Sanjo), [@czeslaaw](https://github.com/czeslaaw). - -## [v0.4.8] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.8) -#### 09/04/14 by Eric Dobbertin -- Add cfs-collection-filters pkg by default - -- Use FS.Utility.setFileExtension in example - -## [v0.4.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.7) -#### 05/04/14 by Morten Henriksen -- corrections, and move image examples here so we can deprecate cfs-imagemagick - -## [v0.4.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.6) -#### 02/04/14 by Morten Henriksen -- *Fixed bug:* "Documentation Issues" [#241](https://github.com/zcfs/Meteor-CollectionFS/issues/241) - -- point to cfs-graphicsmagick readme for transform examples - -## [v0.4.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.5) -#### 31/03/14 by Eric Dobbertin -- use latest releases - -- Add yet a note about mrt and collectionFS in the readme - -## [v0.4.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.4) -#### 25/03/14 by Morten Henriksen -- attempt to get everything up to date - -- Add notice about mrt having troubles figuring out deps - -- *Merged pull-request:* "Removed redundant installation instructions." [#212](https://github.com/zcfs/Meteor-CollectionFS/issues/212) ([lleonard188](https://github.com/lleonard188)) - -- up to date - -- read me update - -- add test note - -Patches by GitHub user [@lleonard188](https://github.com/lleonard188). - -## [v0.4.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.3) -#### 23/03/14 by Morten Henriksen -- use collectionFS travis version force update - -## [v0.4.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.2) -#### 22/03/14 by Morten Henriksen -- change deps - -- Add read me about transformWrite - -## [v0.4.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.1) -#### 21/03/14 by Morten Henriksen -- update reference to devel branch - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS into devel - -- don't need to install transfer - -- mark deprecated api docs - -- test strikeout md - -- no need to imply cfs-transfer since it doesn't do anything at the moment - -- Remove ejson-file imply - -## [v0.4.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.4.0) -#### 06/03/14 by Eric Dobbertin -- add section for documenting example code for common tasks, and add some of the examples; @raix feel free to add more - -- add http upload package to smart.json - -- Merge origin/devel into devel - -- need to imply the http upload package because it's the default now - -- update HTTP access point override docs - -- update docs to use `devel` branch - -- list component packages in smart.json - -- Merge origin/devel into devel-merge - -- add the ejson-file and correct doc - -- refactor everything into packages - -## [(origin/devel-merge-old] (https://github.com/zcfs/Meteor-CollectionFS/tree/(origin/devel-merge-old) -#### 12/02/14 by Eric Dobbertin -- update to latest FileSaver.js - -- one of many refactores - -- add optimization section - -- add section explaining client vs server insert - -- prevent autopublish for the SA collections - -- remove arg that isn't used or passed - -- changes to support client SA, plus clean/reorg SA code to have less duplication - -- merge the concepts of "store" and "copy", update docs, switch to FS.Store namespace - -- use wait:true to avoid Meteor issue - -- extend allow when insecure package is installed - -- document and improve code flow a bit - -- faster to use onResultReceived callback - -- use onload instead of onloadend because we want only successful loads - -- remove some console logging - -- fix issue where stuff wasn't uploading because we weren't calling getFileRecord() in the access point methods - -- make allowed file extension checks not be case sensitive - -- remove DDP "/del" access point since it's not used or necessary - -- Remove collection-hooks dependency; use deny instead. Also some cleanup and code docs - -- replace `mmmagic` dependency with a `mime` dependency; hopefully fixes issues we've seen with meteor deploy - -- refactor to expose saveCopy to API; then change fileworker observes to be per-copy, calling saveCopy and allowing better control of which copies to create at which times - -- use observes for all store saving and temp store deleting; add/adjust some api doc comments (didn't regenerate yet) - -- improve fileIsAllowed check order and messages - -- Add check for the Accounts package - -- *Fixed bug:* "no userId passed to download allow validator" [#120](https://github.com/zcfs/Meteor-CollectionFS/issues/120) - -- always append access token to url when a user is logged in; makes usage simpler to do opt-out rather than opt-in - -- Don't queue ddp method calls - -- Merge changes - -- Optimize buffer handling - -- Switch to MicroQueue - -- improve memory management, attempt client side resume implementation, other minor fixes - -- fix several issues, make downloading work, improve a few bits of code - -- do the isImage test correctly; add some API docs - -- isEmpty will be true for null or undefined - -- rewrite getExtension so it works for unmounted files, too - -- add strong reactive-list dependency for powerqueue - -- minor fixes and code improvements; track uploading files by both collection and ID since one queue handles all collections - -- Base the upload queue on PowerQueue sub queues - -- Add sa note - -- limit use of db - -- Refactor and documentation - -- use mmmagic 0.3.5 - -- *Fixed bug:* "Option to set Cache-Control and Max-Age" [#117](https://github.com/zcfs/Meteor-CollectionFS/issues/117) - -- fix stuff that's broken - -## [v0.3.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.7) -#### 08/01/14 by Morten Henriksen -- *Fixed bug:* "How to store files on the server side?" [#29](https://github.com/zcfs/Meteor-CollectionFS/issues/29) - -- rework ejson and remove fsFile.reload - -- explain complete upload process in ADVANCED docs - -- Adds join to smart.json (its a weak dependency #119) - -- link to api docs for acceptDropsOn - -- typo/formatting fixes - -- docs + insert callback returns `FS.File` instead of `id` - -- Add docs and `FS.File.fetch` - -- Add support for `Join` - -- end with line - -- smaller headlines in docs - -- init api docs - -- Refactor and documentation - -- FS.Collection.insert should return the `FS.File` object - -- remove some comments and such - -- document custom connections - -- add livedata ref to access DDP obj - -- use separate ddp connection with option to pass in custom - -- public folder and gm/im - -- fix null options - -- *Fixed bug:* "no userId passed to download allow validator" [#120](https://github.com/zcfs/Meteor-CollectionFS/issues/120) - -- make useHTTP true by default - -- skip auth checks if Package.insecure - -- remove `callback` arg from fsFile.get since it's not used or necessary; fix partial gets such that they actually use getBytes, greatly speeding up downloads of large files - -- reorg code and speed up downloads - -- split TransferQueue into DownloadTransferQueue and UploadTransferQueue - -- improvements to make use of new PowerQueue features - -- fix issue with previous commit - -- add accessPoints option - -- Pull out temporary chunk code into a separate tempStore.js file, within a TempStore object. This makes it easier to maintain. Also updated the file worker code to correctly find temporary chunks that can be removed and delete those files. - -- add security section - -- Internally, change all "master" stuff to be the same as "copies". External API is still the same, but master options are copied to a special copy named "_master" so that all the other code can be cleaner. This may be a step toward being able to blur or eliminate the master/copy distinction, although there are still some benefits to having a master. - -- Add instructions for installing for testing - -- refactor code to be a bit cleaner - -- add functions for getting an FS.File or setting FS.File data from a URL on the server - -- clean up and improve some transfer code - -- update console log message to be more correct - -- ensure that fsFile.bytesUploaded is always set correctly - -- fix some issues with recent commits - -- *Merged pull-request:* "Updates the filter example area so that it works" [#109](https://github.com/zcfs/Meteor-CollectionFS/issues/109) ([cramhead](https://github.com/cramhead)) - -- add .npm to gitignore - -- Remove .npm folder - -- Clean clone just a bit - -- Refactor fsCollection and argParser - -- Comment on filter options - -- Add download url - -- refactor access point - -- add put/get/del security based on allow/deny functions - -- Updates the filter example area so that it works - -- update for API change - -- more client-side speed improvements and allow passing File/Blob to FS.File constructor again - -- fix data mixup - -- fix upload slowness and blocking - -- change API to adjust issue with data loading callbacks - -- revise FS.File API where data handling is concerned; fix some issues with callback handling in client-side methods; upshot should be faster, smoother uploads and downloads - -- change names and put everything in exported FS namespace - -- fix get/download of copies - -- *Fixed bug:* "Files after certain size aren't saved properly. " [#104](https://github.com/zcfs/Meteor-CollectionFS/issues/104) - -- add fileobject metadata and acceptDropsOn - -- add some methods to load FO data from URL - -- Correct allow/deny examples - -- call put callback correctly - -- add correct temporary installation instructions - -- use correct filename when saving download - -- filtering fixes - -- removed some unused stuff - -- adjust some comments - -- switch api.remove to api.del for consistency with the other methods - -- add hasCopy method - -- new api; tons of changes - -- use generic queue for server file handling - -- update progress in the correct place - -- minor changes to comments - -- fix gridfs get method - -- incorporate #82 - -- make filtering work (added collection-hooks dependency for core package) - -- change UploadsCollection to CollectionFS; change former CollectionFS to GridFS and don't export it (used only by the gridfs storage adaptor); clean up some other areas and update readmes - -- *Fixed bug:* "retrieveBlob failure" [#93](https://github.com/zcfs/Meteor-CollectionFS/issues/93) - -- implement http methods URLs - -- Merge branch 'devel' of https://github.com/zcfs/Meteor-CollectionFS.git into devel - -- significant revisions to move downloading support to the UploadsCollection and make collectionFS/gridFS a pure storage adaptor - -- Merge branch 'pr/94' into devel - -- split and revise readmes - -- rename packages and organize package.js - -- error handling improvements - -- better failure handling for removeCopy - -- handlebars helper to display blob image in CFS package - -- remove all encoding info - -- refactor to fix multiple-file simultaneous uploads - -- don't use _id in filesystem destination since it's not set anyway - -- remove FileObject.file and instead save file as Blob (.blob) when FileObject.fromFile is called - -- revise API a bit - -- stop using strings and encoding and pass everything as Uint8Array (fixes downloading corruption) - -- only attempt to delete file if it exists - -- remove unused file - -- complete refactoring; temporary for testing/tweaking and then will split into multiple packages - -- *Merged pull-request:* "Implemented max parallel transfers" [#62](https://github.com/zcfs/Meteor-CollectionFS/issues/62) ([floo51](https://github.com/floo51)) - -Patches by GitHub users [@cramhead](https://github.com/cramhead), [@floo51](https://github.com/floo51). - -## [v0.3.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.6) -#### 10/10/13 by Morten Henriksen -- Edit ideas about storage adapters and filehandlers - -- Add MIT License - -- Add paypal and weak deps - -- Added the org. filemanager demo/example - -## [v0.3.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.5) -#### 20/09/13 by Morten Henriksen -## [v0.3.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.4) -#### 20/09/13 by Morten Henriksen -- Extract the examples from collectionFS - -- Added examples from @mxab - -## [v0.3.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.3) -#### 18/09/13 by Morten Henriksen -- added travis badge - -- Added travis badge - -- Added basic environment - -- Added metadata getter to docs - -## [v0.3.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.2) -#### 17/09/13 by Morten Henriksen -## [v0.3.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.3.1) -#### 16/09/13 by Morten Henriksen -- Added some details about http.publishing of collections - -- added check in filehandlers - -- Updated som docs - -- js hint added scope - -- jshint clean up - -- *Fixed bug:* "Exception from setTimeout callback: { stack: [Getter] }" [#64](https://github.com/zcfs/Meteor-CollectionFS/issues/64) - -- Merge branch 'devel' - -- Bump version to preview of 0.3.0 - -- Implemented max parallel transfers - -- Revert "began refractoring" - -- Revert "Run jshint through files" - -- Revert "Preparing file object methods for better api" - -- Revert "added fileobject files to package" - -- added fileobject files to package - -- Preparing file object methods for better api - -- Run jshint through files - -- *Merged pull-request:* "Improvements and Fixes to built-in helpers, storeFiles, and acceptDropsOn" [#51](https://github.com/zcfs/Meteor-CollectionFS/issues/51) ([aldeed](https://github.com/aldeed)) - -- Add generic events system, switch to "enums" for invalid event types, and change "fileFilter" to "filter" throughout. Update README to reflect these changes. - -- Update readme to reflect storeFiles and acceptDropsOn changes, plus add documentation for all of the new built-in handlebars helpers - -- commit some files that should be committed - -- -Improve and fix built-in handlebars helpers -Prefix all built-in helpers with "cfs" -Update new example app to reflect helper changes, and improve and fix it a bit, too - -- Merge remote-tracking branch 'upstream/master' - -- update documentation of storeFiles and acceptDropsOn - -- Added credit to @eprochasson - -- *Merged pull-request:* "Should fix issue #45" [#50](https://github.com/zcfs/Meteor-CollectionFS/issues/50) ([eprochasson](https://github.com/eprochasson)) - -- *Fixed bug:* "file handlers not showing up in local demo" [#45](https://github.com/zcfs/Meteor-CollectionFS/issues/45) - -- *Merged pull-request:* "Update README.md" [#49](https://github.com/zcfs/Meteor-CollectionFS/issues/49) ([eprochasson](https://github.com/eprochasson)) - -- Added meteor style guide for jshint - -- fix package file - -- fixes and improvements to storeFiles() and acceptDropsOn() - -- Use a different saveAs shim - -- Merge branch 'master' of https://github.com/aldeed/Meteor-CollectionFS - -- Fixes and changes to support cfs changes - -- -"cfs" prefix, new helpers, improvements and fixes -include saveAs shim in the package so that download button helper can reliably call it - -- Add dependencies and files - -- Document storeFiles() and acceptDropsOn() - -- *Merged pull-request:* "Built-ins, fixes, etc." [#48](https://github.com/zcfs/Meteor-CollectionFS/issues/48) ([aldeed](https://github.com/aldeed)) - -- Add the new files to the package manifest - -- Add underscore as dependency. It seems that Meteor may soon remove underscore from the core. - -- Minor changes to support fileHanders() and fileFilter() function changes - -- Copy in numeral.js for use by the built-in handlebar helper that displays file size in human readable format. This means the helper supports any of the format strings supported by numeral.js for file sizes. - -- -Add fileFilter() function to specify allowed and disallowed files per collectionFS, based on extensions and/or content types -Add fileIsAllowed() function to easily check whether a particular file is allowed based on the rules set up by fileFilter() -Change all of the passthrough functions (find, findOne, update, remove, allow, deny) to pass through all function arguments more simply and more safely. This allows, for example, using find() instead of find({}). -Change fileHandlers() to extend the object whenever called, which means you can safely call it more than once -Add several utility functions for use in either client or server code - -- -Add storeFiles API -Check that files are allowed by fileFilter before saving -Add acceptDropsOn API -Use .depend() instead of Deps throughout -Pull out _getProgress calc to use in two places -Add isUploading API -Improve isDownloading code - -- New file to hold built-in handlebars helpers, including several initial helpers - -- New file manager example app showing how to use new features, built-in handlebars helpers, etc. - -- *Merged pull-request:* "Minor doc correction" [#47](https://github.com/zcfs/Meteor-CollectionFS/issues/47) ([aldeed](https://github.com/aldeed)) - -- *Merged pull-request:* "Documentation Improvement" [#46](https://github.com/zcfs/Meteor-CollectionFS/issues/46) ([aldeed](https://github.com/aldeed)) - -- Extensively revised README - -Patches by GitHub users [@aldeed](https://github.com/aldeed), [@eprochasson](https://github.com/eprochasson). - -## [v0.2.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.3) -#### 04/05/13 by Morten Henriksen -- *Fixed bug:* "Binary File Transfers Corrupted? Truncated?" [#41](https://github.com/zcfs/Meteor-CollectionFS/issues/41) - -## [v0.2.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.2) -#### 03/05/13 by Morten Henriksen -- updated scope for serverConsole - -- *Fixed bug:* "Error when using fresh meteor install" [#40](https://github.com/zcfs/Meteor-CollectionFS/issues/40) - -- more text edits - -- Minor text edits - -- Add credit to README - -- *Merged pull-request:* "Option for file encoding" [#36](https://github.com/zcfs/Meteor-CollectionFS/issues/36) ([nhibner](https://github.com/nhibner)) - -- Typo fix. - -- Updated documentation (added encoding to the fileRecord structure). - -- File encoding is stored in the fileRecord. - -- Allow the user to specify an encoding for the buffer when storing on the server. - -- *Merged pull-request:* "Fix backwards incompatibility" [#33](https://github.com/zcfs/Meteor-CollectionFS/issues/33) ([mitar](https://github.com/mitar)) - -- Fix backwards incompatibility. - -Patches by GitHub users [@nhibner](https://github.com/nhibner), [@mitar](https://github.com/mitar). - -## [v0.2.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.1) -#### 08/04/13 by Morten Henriksen -- Minor fixes, added dragndrop, minor refractoring - -- Only work on completed files - -## [v0.2.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.2.0) -#### 06/04/13 by Morten Henriksen -- Bump to 0.2.0 - Nice - -- Big speed and refractoring - -## [v0.1.9] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.9) -#### 31/03/13 by Morten Henriksen -- Added some more doc, deprecated autosubscribe to autopublish instead - -## [v0.1.8] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.8) -#### 31/03/13 by Morten Henriksen -- Added maxFilehandlers to the doc - -## [(origin/devel-old, origin/devel-#27-fixed] (https://github.com/zcfs/Meteor-CollectionFS/tree/(origin/devel-old, origin/devel-#27-fixed) -#### 31/03/13 by Morten Henriksen -- Added documentation by @petrocket - -- Got filehandlers up and running in bundles - -- Make a seperate thread + connection foreach collectionFS - -## [v0.1.7] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.7) -#### 14/03/13 by Morten Henriksen -## [v0.1.6] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.6) -#### 13/01/13 by Morten Henriksen -- Converted .length to string to cope with Meteor use of underscore - -## [(origin/devel-server-cache] (https://github.com/zcfs/Meteor-CollectionFS/tree/(origin/devel-server-cache) -#### 11/01/13 by Morten Henriksen -## [v0.1.5] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.5) -#### 11/01/13 by Morten Henriksen -- On going tests - db updates gone, requires refresh to commit changes to db - guess some que not working - -- removed setTimeout when spawn == 1 - -## [v0.1.4] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.4) -#### 08/01/13 by Morten Henriksen -## [v0.1.3] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.3) -#### 08/01/13 by Morten Henriksen -## [v0.1.2] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.2) -#### 08/01/13 by Morten Henriksen -## [v0.1.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.1) -#### 08/01/13 by Morten Henriksen -- Big one, added fileHandler to create cashed versions of the file - -- added made with Meteor in fileHandler example - -- corrected param bug in find and findOne - -- minor fix and update - -- Corrected install guide to use Meteorite - -## [v0.1.0] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1.0) -#### 07/01/13 by Morten Henriksen -## [v0.1] (https://github.com/zcfs/Meteor-CollectionFS/tree/v0.1) -#### 07/01/13 by Morten Henriksen -- updated file strukture and example - -- Restructure to package system - -- Refractoring filenames and edit package.js - -- Package.js added - -- Added smart.json for Atmosphere packages - Not tested! - -- Readme styling corrected - -- Added comments to the upload, storeFile - -- StoreFile should return fileId or null - -- Added notes about security - -- Added only owner can resume, makes sense for now - -- Added how to make a download... - -- Changed project title git - -- And some more corrections - -- More readme text - -- Added some short reference - -- some more md - -- Initial commit - diff --git a/packages/wekan-cfs-standard-packages/LICENSE.md b/packages/wekan-cfs-standard-packages/LICENSE.md deleted file mode 100644 index e49ce11bc..000000000 --- a/packages/wekan-cfs-standard-packages/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2015 [@raix](https://github.com/raix), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-standard-packages/README.md b/packages/wekan-cfs-standard-packages/README.md deleted file mode 100644 index ce2fa69d7..000000000 --- a/packages/wekan-cfs-standard-packages/README.md +++ /dev/null @@ -1,16 +0,0 @@ -wekan-cfs-standard-packages -========================= - -This packege serves as a wrapper for several other packages and has no functionality in itself: - -* wekan-cfs-standard-packages (implies some component packages) - * wekan-cfs-base-package - * wekan-cfs-file - * wekan-cfs-collection - * wekan-cfs-collection-filters - * wekan-cfs-access-point - * wekan-cfs-worker - * wekan-cfs-upload-http - -Refer to the [CollectionFS](https://github.com/zcfs/Meteor-CollectionFS) -documentation for more information. diff --git a/packages/wekan-cfs-standard-packages/package.js b/packages/wekan-cfs-standard-packages/package.js deleted file mode 100644 index cf1a8da05..000000000 --- a/packages/wekan-cfs-standard-packages/package.js +++ /dev/null @@ -1,42 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-CollectionFS.git', - name: 'wekan-cfs-standard-packages', - version: '0.5.10', - summary: 'Filesystem for Meteor, collectionFS' -}); - -Package.onUse(function(api) { - // Rig the collectionFS package v2 - api.imply([ - // Base util rigs the basis for the FS scope and some general helper mehtods - 'wekan-cfs-base-package@0.0.30', - // Want to make use of the file object and its api, yes! - 'wekan-cfs-file@0.1.17', - // Add the FS.Collection to keep track of everything - 'wekan-cfs-collection@0.5.5', - // Support filters for easy rules about what may be inserted - 'wekan-cfs-collection-filters@0.2.4', - // Add the option to have ddp and http access point - 'wekan-cfs-access-point@0.1.49', - // We might also want to have the server create copies of our files? - 'wekan-cfs-worker@0.1.5', - // By default we want to support uploads over HTTP - 'wekan-cfs-upload-http@0.0.20', - ]); -}); - -Package.onTest(function (api) { - api.use('wekan-cfs-standard-packages'); - api.use('test-helpers@1.0.0', 'server'); - api.use([ - 'tinytest@1.0.0', - 'underscore@1.0.0', - 'ejson@1.0.0', - 'ordered-dict@1.0.0', - 'random@1.0.0', - 'tracker@1.0.3' - ]); - - api.addFiles('tests/server-tests.js', 'server'); - api.addFiles('tests/client-tests.js', 'client'); -}); diff --git a/packages/wekan-cfs-standard-packages/tests/client-tests.js b/packages/wekan-cfs-standard-packages/tests/client-tests.js deleted file mode 100644 index 08b9671ac..000000000 --- a/packages/wekan-cfs-standard-packages/tests/client-tests.js +++ /dev/null @@ -1,25 +0,0 @@ -Tinytest.add('FS.Collection - client - test environment', function(test) { - test.isTrue(typeof FS.Utility !== 'undefined', 'test environment not initialized FS.Utility'); - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof FS.File !== 'undefined', 'test environment not initialized FS.File'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-standard-packages/tests/server-tests.js b/packages/wekan-cfs-standard-packages/tests/server-tests.js deleted file mode 100644 index edf4c1624..000000000 --- a/packages/wekan-cfs-standard-packages/tests/server-tests.js +++ /dev/null @@ -1,25 +0,0 @@ -Tinytest.add('FS.Collection - server - test environment', function(test) { - test.isTrue(typeof FS.Utility !== 'undefined', 'test environment not initialized FS.Utility'); - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof FS.File !== 'undefined', 'test environment not initialized FS.File'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-storage-adapter/.travis.yml b/packages/wekan-cfs-storage-adapter/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-storage-adapter/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-storage-adapter/LICENSE.md b/packages/wekan-cfs-storage-adapter/LICENSE.md deleted file mode 100644 index 51e60c3d0..000000000 --- a/packages/wekan-cfs-storage-adapter/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2015 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-storage-adapter/README.md b/packages/wekan-cfs-storage-adapter/README.md deleted file mode 100644 index bc8e464a1..000000000 --- a/packages/wekan-cfs-storage-adapter/README.md +++ /dev/null @@ -1,7 +0,0 @@ -wekan-cfs-storage-adapter -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is used by other packages to create various storage adapters. diff --git a/packages/wekan-cfs-storage-adapter/api.md b/packages/wekan-cfs-storage-adapter/api.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/wekan-cfs-storage-adapter/internal.api.md b/packages/wekan-cfs-storage-adapter/internal.api.md deleted file mode 100644 index ae9f64ad3..000000000 --- a/packages/wekan-cfs-storage-adapter/internal.api.md +++ /dev/null @@ -1,101 +0,0 @@ -> File: ["storageAdapter.server.js"](storageAdapter.server.js) -> Where: {server} - -- -############################################################################# - -STORAGE ADAPTER - -############################################################################# - -#### *self*.insert(fsFile, [options], [callback])  Server #### -``` -Attempts to insert a file into the store, first running the beforeSave -function for the store if there is one. If there is a temporary failure, -returns (or passes to the second argument of the callback) `null`. If there -is a permanant failure or the beforeSave function returns `false`, returns -`false`. If the file is successfully stored, returns an object with file -info that the FS.Collection can save. -Also updates the `files` collection for this store to save info about this -file. -``` -- -*This method __insert__ is defined in `self`* - -__Arguments__ - -* __fsFile__ *{[FS.File](#FS.File)}* -The FS.File instance to be stored. -* __options__ *{Object}* (Optional) -Options (currently unused) -* __callback__ *{Function}* (Optional) -If not provided, will block and return file info. - -- - - - - -> ```self.insert = function(fsFile, options, callback) { ...``` [storageAdapter.server.js:169](storageAdapter.server.js#L169) - -- - -#### *self*.update(fsFile, [options], [callback])  Server #### -``` -Attempts to update a file in the store, first running the beforeSave -function for the store if there is one. If there is a temporary failure, -returns (or passes to the second argument of the callback) `null`. If there -is a permanant failure or the beforeSave function returns `false`, returns -`false`. If the file is successfully stored, returns an object with file -info that the FS.Collection can save. -Also updates the `files` collection for this store to save info about this -file. -``` -- -*This method __update__ is defined in `self`* - -__Arguments__ - -* __fsFile__ *{[FS.File](#FS.File)}* -The FS.File instance to be stored. -* __options__ *{Object}* (Optional) -Options (currently unused) -* __callback__ *{Function}* (Optional) -If not provided, will block and return file info. - -- - - - - -> ```self.update = function(fsFile, options, callback) { ...``` [storageAdapter.server.js:264](storageAdapter.server.js#L264) - -- - -#### *self*.remove(fsFile, [options], [callback])  Server #### -``` -Attempts to remove a file from the store. Returns true if removed, or false. -Also removes file info from the `files` collection for this store. -``` -- -*This method __remove__ is defined in `self`* - -__Arguments__ - -* __fsFile__ *{[FS.File](#FS.File)}* -The FS.File instance to be stored. -* __options__ *{Object}* (Optional) -Options - - __ignoreMissing__ *{Boolean}* (Optional) -Set true to treat missing files as a successful deletion. Otherwise throws an error. -* __callback__ *{Function}* (Optional) -If not provided, will block and return true or false - -- - - - - -> ```self.remove = function(fsFile, options, callback) { ...``` [storageAdapter.server.js:321](storageAdapter.server.js#L321) - -- diff --git a/packages/wekan-cfs-storage-adapter/package.js b/packages/wekan-cfs-storage-adapter/package.js deleted file mode 100644 index 92838d44a..000000000 --- a/packages/wekan-cfs-storage-adapter/package.js +++ /dev/null @@ -1,50 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-cfs-storage-adapter.git', - name: 'wekan-cfs-storage-adapter', - version: '0.2.4', - summary: 'CollectionFS, Class for creating Storage adapters' -}); - -Npm.depends({ - 'length-stream': '0.1.1' -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use([ - // CFS - 'wekan-cfs-base-package@0.0.30', - // Core - 'deps', - 'check', - 'livedata', - 'mongo-livedata', - 'ejson', - // Other - 'raix:eventemitter@0.1.1' - ]); - - // We want to make sure that its added to scope for now if installed. - // We have set a deprecation warning on the transform scope - api.use('wekan-cfs-graphicsmagick@0.0.17', 'server', { weak: true }); - - api.addFiles([ - 'storageAdapter.client.js' - ], 'client'); - - api.addFiles([ - 'storageAdapter.server.js', - 'transform.server.js' - ], 'server'); -}); - -Package.onTest(function (api) { - api.use('wekan-cfs-storage-adapter'); - api.use('test-helpers', 'server'); - api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', - 'random', 'deps']); - - api.addFiles('tests/server-tests.js', 'server'); - api.addFiles('tests/client-tests.js', 'client'); -}); diff --git a/packages/wekan-cfs-storage-adapter/storageAdapter.client.js b/packages/wekan-cfs-storage-adapter/storageAdapter.client.js deleted file mode 100644 index 90c87d00e..000000000 --- a/packages/wekan-cfs-storage-adapter/storageAdapter.client.js +++ /dev/null @@ -1,37 +0,0 @@ -/* global FS, _storageAdapters:true, EventEmitter */ - -// ############################################################################# -// -// STORAGE ADAPTER -// -// ############################################################################# - -_storageAdapters = {}; - -FS.StorageAdapter = function(name, options, api) { - var self = this; - - // Check the api - if (typeof api === 'undefined') { - throw new Error('FS.StorageAdapter please define an api'); - } - - // store reference for easy lookup by name - if (typeof _storageAdapters[name] !== 'undefined') { - throw new Error('Storage name already exists: "' + name + '"'); - } else { - _storageAdapters[name] = self; - } - - // extend self with options and other info - FS.Utility.extend(this, options || {}, { - name: name - }); - - // XXX: TODO, add upload feature here... - // we default to ddp upload but really let the SA like S3Cloud overwrite to - // implement direct client to s3 upload - -}; - -FS.StorageAdapter.prototype = new EventEmitter(); diff --git a/packages/wekan-cfs-storage-adapter/storageAdapter.server.js b/packages/wekan-cfs-storage-adapter/storageAdapter.server.js deleted file mode 100644 index 5af1bcbf5..000000000 --- a/packages/wekan-cfs-storage-adapter/storageAdapter.server.js +++ /dev/null @@ -1,269 +0,0 @@ -/* global FS, _storageAdapters:true, EventEmitter */ - -// ############################################################################# -// -// STORAGE ADAPTER -// -// ############################################################################# -_storageAdapters = {}; - -FS.StorageAdapter = function(storeName, options, api) { - var self = this, fileKeyMaker; - options = options || {}; - - // If storeName is the only argument, a string and the SA already found - // we will just return that SA - if (arguments.length === 1 && storeName === '' + storeName && - typeof _storageAdapters[storeName] !== 'undefined') - return _storageAdapters[storeName]; - - // Verify that the storage adapter defines all the necessary API methods - if (typeof api === 'undefined') { - throw new Error('FS.StorageAdapter please define an api'); - } - - FS.Utility.each('fileKey,remove,typeName,createReadStream,createWriteStream'.split(','), function(name) { - if (typeof api[name] === 'undefined') { - throw new Error('FS.StorageAdapter please define an api. "' + name + '" ' + (api.typeName || '')); - } - }); - - // Create an internal namespace, starting a name with underscore is only - // allowed for stores marked with options.internal === true - if (options.internal !== true && storeName[0] === '_') { - throw new Error('A storage adapter name may not begin with "_"'); - } - - if (storeName.indexOf('.') !== -1) { - throw new Error('A storage adapter name may not contain a "."'); - } - - // store reference for easy lookup by storeName - if (typeof _storageAdapters[storeName] !== 'undefined') { - throw new Error('Storage name already exists: "' + storeName + '"'); - } else { - _storageAdapters[storeName] = self; - } - - // User can customize the file key generation function - if (typeof options.fileKeyMaker === "function") { - fileKeyMaker = options.fileKeyMaker; - } else { - fileKeyMaker = api.fileKey; - } - - // User can provide a function to adjust the fileObj - // before it is written to the store. - var beforeWrite = options.beforeWrite; - - // extend self with options and other info - FS.Utility.extend(this, options, { - name: storeName, - typeName: api.typeName - }); - - // Create a nicer abstracted adapter interface - self.adapter = {}; - - self.adapter.fileKey = function(fileObj) { - return fileKeyMaker(fileObj); - }; - - // Return readable stream for fileKey - self.adapter.createReadStreamForFileKey = function(fileKey, options) { - if (FS.debug) console.log('createReadStreamForFileKey ' + storeName); - return FS.Utility.safeStream( api.createReadStream(fileKey, options) ); - }; - - // Return readable stream for fileObj - self.adapter.createReadStream = function(fileObj, options) { - if (FS.debug) console.log('createReadStream ' + storeName); - if (self.internal) { - // Internal stores take a fileKey - return self.adapter.createReadStreamForFileKey(fileObj, options); - } - return FS.Utility.safeStream( self._transform.createReadStream(fileObj, options) ); - }; - - function logEventsForStream(stream) { - if (FS.debug) { - stream.on('stored', function() { - console.log('-----------STORED STREAM', storeName); - }); - - stream.on('close', function() { - console.log('-----------CLOSE STREAM', storeName); - }); - - stream.on('end', function() { - console.log('-----------END STREAM', storeName); - }); - - stream.on('finish', function() { - console.log('-----------FINISH STREAM', storeName); - }); - - stream.on('error', function(error) { - console.log('-----------ERROR STREAM', storeName, error && (error.message || error.code)); - }); - } - } - - // Return writeable stream for fileKey - self.adapter.createWriteStreamForFileKey = function(fileKey, options) { - if (FS.debug) console.log('createWriteStreamForFileKey ' + storeName); - var writeStream = FS.Utility.safeStream( api.createWriteStream(fileKey, options) ); - - logEventsForStream(writeStream); - - return writeStream; - }; - - // Return writeable stream for fileObj - self.adapter.createWriteStream = function(fileObj, options) { - if (FS.debug) console.log('createWriteStream ' + storeName + ', internal: ' + !!self.internal); - - if (self.internal) { - // Internal stores take a fileKey - return self.adapter.createWriteStreamForFileKey(fileObj, options); - } - - // If we haven't set name, type, or size for this version yet, - // set it to same values as original version. We don't save - // these to the DB right away because they might be changed - // in a transformWrite function. - if (!fileObj.name({store: storeName})) { - fileObj.name(fileObj.name(), {store: storeName, save: false}); - } - if (!fileObj.type({store: storeName})) { - fileObj.type(fileObj.type(), {store: storeName, save: false}); - } - if (!fileObj.size({store: storeName})) { - fileObj.size(fileObj.size(), {store: storeName, save: false}); - } - - // Call user function to adjust file metadata for this store. - // We support updating name, extension, and/or type based on - // info returned in an object. Or `fileObj` could be - // altered directly within the beforeWrite function. - if (beforeWrite) { - var fileChanges = beforeWrite(fileObj); - if (typeof fileChanges === "object") { - if (fileChanges.extension) { - fileObj.extension(fileChanges.extension, {store: storeName, save: false}); - } else if (fileChanges.name) { - fileObj.name(fileChanges.name, {store: storeName, save: false}); - } - if (fileChanges.type) { - fileObj.type(fileChanges.type, {store: storeName, save: false}); - } - } - } - - var writeStream = FS.Utility.safeStream( self._transform.createWriteStream(fileObj, options) ); - - logEventsForStream(writeStream); - - // Its really only the storage adapter who knows if the file is uploaded - // - // We have to use our own event making sure the storage process is completed - // this is mainly - writeStream.safeOn('stored', function(result) { - if (typeof result.fileKey === 'undefined') { - throw new Error('SA ' + storeName + ' type ' + api.typeName + ' did not return a fileKey'); - } - if (FS.debug) console.log('SA', storeName, 'stored', result.fileKey); - // Set the fileKey - fileObj.copies[storeName].key = result.fileKey; - - // Update the size, as provided by the SA, in case it was changed by stream transformation - if (typeof result.size === "number") { - fileObj.copies[storeName].size = result.size; - } - - // Set last updated time, either provided by SA or now - fileObj.copies[storeName].updatedAt = result.storedAt || new Date(); - - // If the file object copy havent got a createdAt then set this - if (typeof fileObj.copies[storeName].createdAt === 'undefined') { - fileObj.copies[storeName].createdAt = fileObj.copies[storeName].updatedAt; - } - - fileObj._saveChanges(storeName); - - // There is code in transform that may have set the original file size, too. - fileObj._saveChanges('_original'); - }); - - // Emit events from SA - writeStream.once('stored', function(/*result*/) { - // XXX Because of the way stores inherit from SA, this will emit on every store. - // Maybe need to rewrite the way we inherit from SA? - var emitted = self.emit('stored', storeName, fileObj); - if (FS.debug && !emitted) { - console.log(fileObj.name() + ' was successfully stored in the ' + storeName + ' store. You are seeing this informational message because you enabled debugging and you have not defined any listeners for the "stored" event on this store.'); - } - }); - - writeStream.on('error', function(error) { - // XXX We could wrap and clarify error - // XXX Because of the way stores inherit from SA, this will emit on every store. - // Maybe need to rewrite the way we inherit from SA? - var emitted = self.emit('error', storeName, error, fileObj); - if (FS.debug && !emitted) { - console.log(error); - } - }); - - return writeStream; - }; - - //internal - self._removeAsync = function(fileKey, callback) { - // Remove the file from the store - api.remove.call(self, fileKey, callback); - }; - - /** - * @method FS.StorageAdapter.prototype.remove - * @public - * @param {FS.File} fsFile The FS.File instance to be stored. - * @param {Function} [callback] If not provided, will block and return true or false - * - * Attempts to remove a file from the store. Returns true if removed or not - * found, or false if the file couldn't be removed. - */ - self.adapter.remove = function(fileObj, callback) { - if (FS.debug) console.log("---SA REMOVE"); - - // Get the fileKey - var fileKey = (fileObj instanceof FS.File) ? self.adapter.fileKey(fileObj) : fileObj; - - if (callback) { - return self._removeAsync(fileKey, FS.Utility.safeCallback(callback)); - } else { - return Meteor.wrapAsync(self._removeAsync)(fileKey); - } - }; - - self.remove = function(fileObj, callback) { - // Add deprecation note - console.warn('Storage.remove is deprecating, use "Storage.adapter.remove"'); - return self.adapter.remove(fileObj, callback); - }; - - if (typeof api.init === 'function') { - Meteor.wrapAsync(api.init.bind(self))(); - } - - // This supports optional transformWrite and transformRead - self._transform = new FS.Transform({ - adapter: self.adapter, - // Optional transformation functions: - transformWrite: options.transformWrite, - transformRead: options.transformRead - }); - -}; - -Npm.require('util').inherits(FS.StorageAdapter, EventEmitter); diff --git a/packages/wekan-cfs-storage-adapter/tests/client-tests.js b/packages/wekan-cfs-storage-adapter/tests/client-tests.js deleted file mode 100644 index efe5a3abb..000000000 --- a/packages/wekan-cfs-storage-adapter/tests/client-tests.js +++ /dev/null @@ -1,44 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-storage-adapter - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Client Tests - * - * construct FS.File with no arguments - * construct FS.File passing in File - * construct FS.File passing in Blob - * load blob into FS.File and then call FS.File.toDataUrl - * call FS.File.setDataFromBinary, then FS.File.getBlob(); make sure correct data is returned - * load blob into FS.File and then call FS.File.getBinary() with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * load blob into FS.File and make sure FS.File.saveLocal initiates a download (possibly can't do automatically) - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-storage-adapter/tests/server-tests.js b/packages/wekan-cfs-storage-adapter/tests/server-tests.js deleted file mode 100644 index b25036569..000000000 --- a/packages/wekan-cfs-storage-adapter/tests/server-tests.js +++ /dev/null @@ -1,49 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-storage-adapter - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Server Tests - * - * construct FS.File with no arguments - * load data with FS.File.setDataFromBuffer - * load data with FS.File.setDataFromBinary - * load data and then call FS.File.toDataUrl with and without callback - * load buffer into FS.File and then call FS.File.getBinary with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * (call these with and without callback to test sync vs. async) - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * - * - * FS.Collection Server Tests - * - * Make sure options.filter is respected - * - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-storage-adapter/transform.server.js b/packages/wekan-cfs-storage-adapter/transform.server.js deleted file mode 100644 index 8936ddc3f..000000000 --- a/packages/wekan-cfs-storage-adapter/transform.server.js +++ /dev/null @@ -1,119 +0,0 @@ -/* global FS */ - -var PassThrough = Npm.require('stream').PassThrough; -var lengthStream = Npm.require('length-stream'); - -FS.Transform = function(options) { - var self = this; - - options = options || {}; - - if (!(self instanceof FS.Transform)) - throw new Error('FS.Transform must be called with the "new" keyword'); - - if (!options.adapter) - throw new Error('Transform expects option.adapter to be a storage adapter'); - - self.storage = options.adapter; - - // Fetch the transformation functions if any - self.transformWrite = options.transformWrite; - self.transformRead = options.transformRead; -}; - -// Allow packages to add scope -FS.Transform.scope = {}; - -// The transformation stream triggers an "stored" event when data is stored into -// the storage adapter -FS.Transform.prototype.createWriteStream = function(fileObj) { - var self = this; - - // Get the file key - var fileKey = self.storage.fileKey(fileObj); - - // Rig write stream - var destinationStream = self.storage.createWriteStreamForFileKey(fileKey, { - // Not all SA's can set these options and cfs dont depend on setting these - // but its nice if other systems are accessing the SA that some of the data - // is also available to those - aliases: [fileObj.name()], - contentType: fileObj.type(), - metadata: fileObj.metadata - }); - - // Pass through transformWrite function if provided - if (typeof self.transformWrite === 'function') { - - destinationStream = addPassThrough(destinationStream, function (ptStream, originalStream) { - // Rig transform - try { - self.transformWrite.call(FS.Transform.scope, fileObj, ptStream, originalStream); - // XXX: If the transform function returns a buffer should we stream that? - } catch(err) { - // We emit an error - should we throw an error? - console.warn('FS.Transform.createWriteStream transform function failed, Error: '); - throw err; - } - }); - - } - - // If original doesn't have size, add another PassThrough to get and set the size. - // This will run on size=0, too, which is OK. - // NOTE: This must come AFTER the transformWrite code block above. This might seem - // confusing, but by coming after it, this will actually be executed BEFORE the user's - // transform, which is what we need in order to be sure we get the original file - // size and not the transformed file size. - if (!fileObj.size()) { - destinationStream = addPassThrough(destinationStream, function (ptStream, originalStream) { - var lstream = lengthStream(function (fileSize) { - fileObj.size(fileSize, {save: false}); - }); - - ptStream.pipe(lstream).pipe(originalStream); - }); - } - - return destinationStream; -}; - -FS.Transform.prototype.createReadStream = function(fileObj, options) { - var self = this; - - // Get the file key - var fileKey = self.storage.fileKey(fileObj); - - // Rig read stream - var sourceStream = self.storage.createReadStreamForFileKey(fileKey, options); - - // Pass through transformRead function if provided - if (typeof self.transformRead === 'function') { - - sourceStream = addPassThrough(sourceStream, function (ptStream, originalStream) { - // Rig transform - try { - self.transformRead.call(FS.Transform.scope, fileObj, originalStream, ptStream); - } catch(err) { - //throw new Error(err); - // We emit an error - should we throw an error? - sourceStream.emit('error', 'FS.Transform.createReadStream transform function failed'); - } - }); - - } - - // We dont transform just normal SA interface - return sourceStream; -}; - -// Utility function to simplify adding layers of passthrough -function addPassThrough(stream, func) { - var pts = new PassThrough(); - // We pass on the special "stored" event for those listening - stream.on('stored', function(result) { - pts.emit('stored', result); - }); - func(pts, stream); - return pts; -} diff --git a/packages/wekan-cfs-temp-store/.travis.yml b/packages/wekan-cfs-temp-store/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-temp-store/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-temp-store/CHANGELOG.md b/packages/wekan-cfs-temp-store/CHANGELOG.md deleted file mode 100644 index 3113b8e61..000000000 --- a/packages/wekan-cfs-temp-store/CHANGELOG.md +++ /dev/null @@ -1,169 +0,0 @@ -# Changelog - -## vCurrent -## [v0.1.2] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.1.2) -#### 17/12/14 by Morten Henriksen -## [v0.1.1] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.1.1) -#### 17/12/14 by Morten Henriksen -- mbr update, remove versions.json - -- Bump to version 0.1.1 - -## [v0.1.0] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.1.0) -#### 17/12/14 by Morten Henriksen -- mbr update versions and fix warnings - -- fix 0.9.1 package scope - -- don't rely on package names; fix for 0.9.1 - -- 0.9.1 support - -## [v0.0.29] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.29) -#### 28/08/14 by Morten Henriksen -- Meteor Package System Update - -## [v0.0.28] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.28) -#### 27/08/14 by Eric Dobbertin -- change package name to lowercase - -## [v0.0.27] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.27) -#### 17/06/14 by Eric Dobbertin -- add `FS.TempStore.removeAll` method - -## [v0.0.26] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.26) -#### 30/04/14 by Eric Dobbertin -## [v0.0.25] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.25) -#### 30/04/14 by Eric Dobbertin -- use third-party combined-stream node pkg as attempt to resolve pesky streaming issues - -## [v0.0.24] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.24) -#### 29/04/14 by Eric Dobbertin -- generate api docs - -- fileKey methods now expect an FS.File always, so we give them one - -- small FS.File API change - -## [v0.0.23] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.23) -#### 12/04/14 by Eric Dobbertin -- test for packages since we're assigning default error functions for stores - -## [v0.0.22] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.22) -#### 12/04/14 by Eric Dobbertin -- avoid errors if file already removed from temp store - -## [v0.0.21] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.21) -#### 12/04/14 by Eric Dobbertin -## [v0.0.20] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.20) -#### 08/04/14 by Eric Dobbertin -- cleanup stored/uploaded events and further improve chunk tracking - -## [v0.0.19] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.19) -#### 08/04/14 by Eric Dobbertin -- use internal tracking collection - -- Have TempStore set the size - -- Add the SA on stored result - -- allow unset chunkSum - -## [v0.0.18] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.18) -#### 06/04/14 by Eric Dobbertin -- delete chunkCount and chunkSize props from fileObj after upload is complete - -## [v0.0.17] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.17) -#### 06/04/14 by Eric Dobbertin -- We now wait to mount storage until it's needed (first upload begins); this ensures that we are able to accurately check for the cfs-worker package, which loads after this one. It also makes the code a bit cleaner. - -## [v0.0.16] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.16) -#### 04/04/14 by Morten Henriksen -- Temporary workaround: We currently we generate a mongoId if gridFS is used for TempStore - -- Note: At the moment tempStore will only use gridfs if no filesystem is installed - -## [v0.0.15] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.15) -#### 02/04/14 by Morten Henriksen -- Use the stored event and object instead (result object is not used at the moment - but we could store an id at some point) - -## [v0.0.14] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.14) -#### 31/03/14 by Eric Dobbertin -- use latest releases - -- use latest releases - -## [v0.0.13] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.13) -#### 31/03/14 by Morten Henriksen -- Try to use latest when using weak deps - -## [v0.0.12] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.12) -#### 30/03/14 by Morten Henriksen -## [v0.0.11] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.11) -#### 30/03/14 by Morten Henriksen -- Set noon callback - we just want the file gone - -## [v0.0.10] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.10) -#### 29/03/14 by Morten Henriksen -- add filesystem and gridfs as weak deps - -## [v0.0.9] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.9) -#### 29/03/14 by Morten Henriksen -- Add check to see if FS.TempStore.Storage is set - -## [v0.0.8] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.8) -#### 29/03/14 by Morten Henriksen -- Converting TempStore to use SA api - -## [v0.0.7] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.7) -#### 25/03/14 by Morten Henriksen -- use `new Date` - -- Have TempStore emit relevant events - -## [v0.0.6] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.6) -#### 23/03/14 by Morten Henriksen -- Rollback to specific git dependency - -- use collectionFS travis version force update - -## [v0.0.5] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.5) -#### 22/03/14 by Morten Henriksen -- try to fix travis test by using general package references - -## [v0.0.4] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.4) -#### 21/03/14 by Morten Henriksen -- fix chunk files not actually being deleted - -## [v0.0.3] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.3) -#### 18/03/14 by Morten Henriksen -- * TempStore is now an EventEmitter * progress event * uploaded * (start) should perhaps be created * remove * Added FS.TempStore.listParts - will return lookup object listing the parts already uploaded - -- Allow chunk to be undefined an thereby have the createWriteStream follow normal streaming api - -- Allow undefined in chunkPath - -- added comments - -- bug hunting - -- Add streaming WIP - -- rename temp store collection to 'cfs.tempstore' - -- fix ensureForFile - -- track tempstore chunks in our own collection rather than in the file object - -- change to accept buffer; less converting - -- prevent bytesUploaded from getting bigger than size - -## [v0.0.2] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.2) -#### 15/02/14 by Morten Henriksen -- fix typo - -## [v0.0.1] (https://github.com/zcfs/Meteor-cfs-tempstore/tree/v0.0.1) -#### 13/02/14 by Morten Henriksen -- init commit - diff --git a/packages/wekan-cfs-temp-store/LICENSE.md b/packages/wekan-cfs-temp-store/LICENSE.md deleted file mode 100644 index 1a3820821..000000000 --- a/packages/wekan-cfs-temp-store/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-temp-store/README.md b/packages/wekan-cfs-temp-store/README.md deleted file mode 100644 index e0d8f0c48..000000000 --- a/packages/wekan-cfs-temp-store/README.md +++ /dev/null @@ -1,24 +0,0 @@ -wekan-cfs-tempstore -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). It provides -an API for quickly storing chunks of file data in temporary files. If also supports deleting those chunks, and combining them into one -binary object and attaching it to an FS.File instance. - -You don't need to manually add this package to your app, but you could replace -this package with your own if you want to handle temporary storage in another -way. - -> `FS.TempStore` uses the `wekan-cfs-storage-adapter` compatible Storage Adapters, both `FS.Store.FileSystem` and `FS.Store.GridFS` will be defaulted. *for more information read the [internal.api.md](internal.api.md)* - -##Documentation -[API Documentation](api.md) - -##Contribute -Here's the [complete API documentation](internal.api.md), including private methods. - -Update docs, `npm install docmeteor` -```bash -$ docmeteor -``` \ No newline at end of file diff --git a/packages/wekan-cfs-temp-store/api.md b/packages/wekan-cfs-temp-store/api.md deleted file mode 100644 index cbb34632e..000000000 --- a/packages/wekan-cfs-temp-store/api.md +++ /dev/null @@ -1,112 +0,0 @@ -## cfs-tempstore Public API ## - -CollectionFS, temporary storage - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -##Temporary Storage - -Temporary storage is used for chunked uploads until all chunks are received -and all copies have been made or given up. In some cases, the original file -is stored only in temporary storage (for example, if all copies do some -manipulation in beforeSave). This is why we use the temporary file as the -basis for each saved copy, and then remove it after all copies are saved. - -Every chunk is saved as an individual temporary file. This is safer than -attempting to write multiple incoming chunks to different positions in a -single temporary file, which can lead to write conflicts. - -Using temp files also allows us to easily resume uploads, even if the server -restarts, and to keep the working memory clear. -The FS.TempStore emits events that others are able to listen to -- - -### *fs*.TempStore {object}  Server ### - -*This property __TempStore__ is defined in `FS`* -it's an event emitter* - -> ```FS.TempStore = new EventEmitter();``` [tempStore.js:28](tempStore.js#L28) - - - -- -We will not mount a storage adapter until needed. This allows us to check for the -existance of FS.FileWorker, which is loaded after this package because it -depends on this package. - -- -XXX: TODO -FS.TempStore.on('stored', function(fileObj, chunkCount, result) { -This should work if we pass on result from the SA on stored event... -fileObj.update({ $set: { chunkSum: 1, chunkCount: chunkCount, size: result.size } }); -}); -Stream implementation -- - -### *fsTempstore*.removeFile(fileObj)  Server ### - -*This method __removeFile__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - -This function removes the file from tempstorage - it cares not if file is -already removed or not found, goal is reached anyway. - -> ```FS.TempStore.removeFile = function(fileObj) { ...``` [tempStore.js:169](tempStore.js#L169) - - -- - -### *fsTempstore*.createWriteStream(fileObj, [options])  Server ### - -*This method __createWriteStream__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - - File to store in temporary storage - -* __options__ *{[Number ](#Number )|[ String](# String)}* (Optional) - -__Returns__ *{Stream}* -Writeable stream - - -`options` of different types mean differnt things: -`undefined` We store the file in one part -(Normal server-side api usage)* -`Number` the number is the part number total -(multipart uploads will use this api)* -`String` the string is the name of the `store` that wants to store file data -(stores that want to sync their data to the rest of the files stores will use this)* - -> Note: fileObj must be mounted on a `FS.Collection`, it makes no sense to store otherwise - -> ```FS.TempStore.createWriteStream = function(fileObj, options) { ...``` [tempStore.js:217](tempStore.js#L217) - - -- - -### *fsTempstore*.createReadStream(fileObj)  Server ### - -*This method __createReadStream__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - - The file to read - - -__Returns__ *{Stream}* -Returns readable stream - - - -> ```FS.TempStore.createReadStream = function(fileObj) { ...``` [tempStore.js:313](tempStore.js#L313) - - diff --git a/packages/wekan-cfs-temp-store/internal.api.md b/packages/wekan-cfs-temp-store/internal.api.md deleted file mode 100644 index 4b6e1f6d5..000000000 --- a/packages/wekan-cfs-temp-store/internal.api.md +++ /dev/null @@ -1,225 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["tempStore.js"](tempStore.js) Where: {server}__ - -*** - -##Temporary Storage - -Temporary storage is used for chunked uploads until all chunks are received -and all copies have been made or given up. In some cases, the original file -is stored only in temporary storage (for example, if all copies do some -manipulation in beforeSave). This is why we use the temporary file as the -basis for each saved copy, and then remove it after all copies are saved. - -Every chunk is saved as an individual temporary file. This is safer than -attempting to write multiple incoming chunks to different positions in a -single temporary file, which can lead to write conflicts. - -Using temp files also allows us to easily resume uploads, even if the server -restarts, and to keep the working memory clear. -The FS.TempStore emits events that others are able to listen to -- - -### *fs*.TempStore {object}  Server ### - -*This property __TempStore__ is defined in `FS`* -it's an event emitter* - -> ```FS.TempStore = new EventEmitter();``` [tempStore.js:28](tempStore.js#L28) - - -- - -### *fsTempstore*.Storage {StorageAdapter}  Server ### - -*This property is private* -*This property __Storage__ is defined in `FS.TempStore`* - -This property is set to either `FS.Store.FileSystem` or `FS.Store.GridFS` - -__When and why:__ -We normally default to `cfs-filesystem` unless its not installed. *(we default to gridfs if installed)* -But if `cfs-gridfs` and `cfs-worker` is installed we default to `cfs-gridfs` - -If `cfs-gridfs` and `cfs-filesystem` is not installed we log a warning. -the user can set `FS.TempStore.Storage` them selfs eg.: -```js -// Its important to set `internal: true` this lets the SA know that we -// are using this internally and it will give us direct SA api -FS.TempStore.Storage = new FS.Store.GridFS('_tempstore', { internal: true }); -``` - -> Note: This is considered as `advanced` use, its not a common pattern. - -> ```FS.TempStore.Storage = null;``` [tempStore.js:54](tempStore.js#L54) - - - -- -We will not mount a storage adapter until needed. This allows us to check for the -existance of FS.FileWorker, which is loaded after this package because it -depends on this package. - -- -XXX: TODO -FS.TempStore.on('stored', function(fileObj, chunkCount, result) { -This should work if we pass on result from the SA on stored event... -fileObj.update({ $set: { chunkSum: 1, chunkCount: chunkCount, size: result.size } }); -}); -Stream implementation -- - -### _chunkPath([n])  Server ### - -*This method is private* - -__Arguments__ - -* __n__ *{Number}* (Optional) - - Chunk number - - -__Returns__ *{String}* -Chunk naming convention - - -> ```_chunkPath = function(n) { ...``` [tempStore.js:104](tempStore.js#L104) - - -- - -### _fileReference(fileObj, chunk)  Server ### - -*This method is private* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* -* __chunk__ *{Number}* - -__Returns__ *{String}* -Generated SA specific fileKey for the chunk - - -Note: Calling function should call mountStorage() first, and -make sure that fileObj is mounted. - -> ```_fileReference = function(fileObj, chunk, existing) { ...``` [tempStore.js:118](tempStore.js#L118) - - -- - -### *fsTempstore*.exists(File)  Server ### - -*This method __exists__ is defined in `FS.TempStore`* - -__Arguments__ - -* __File__ *{[FS.File](#FS.File)}* - - object - - -__Returns__ *{Boolean}* -Is this file, or parts of it, currently stored in the TempStore - - -> ```FS.TempStore.exists = function(fileObj) { ...``` [tempStore.js:145](tempStore.js#L145) - - -- - -### *fsTempstore*.listParts(fileObj)  Server ### - -*This method __listParts__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - -__Returns__ *{Object}* -of parts already stored - -__TODO__ -``` -* This is not yet implemented, milestone 1.1.0 -``` - - -> ```FS.TempStore.listParts = function(fileObj) { ...``` [tempStore.js:156](tempStore.js#L156) - - -- - -### *fsTempstore*.removeFile(fileObj)  Server ### - -*This method __removeFile__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - -This function removes the file from tempstorage - it cares not if file is -already removed or not found, goal is reached anyway. - -> ```FS.TempStore.removeFile = function(fileObj) { ...``` [tempStore.js:169](tempStore.js#L169) - - -- - -### *fsTempstore*.createWriteStream(fileObj, [options])  Server ### - -*This method __createWriteStream__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - - File to store in temporary storage - -* __options__ *{[Number ](#Number )|[ String](# String)}* (Optional) - -__Returns__ *{Stream}* -Writeable stream - - -`options` of different types mean differnt things: -`undefined` We store the file in one part -(Normal server-side api usage)* -`Number` the number is the part number total -(multipart uploads will use this api)* -`String` the string is the name of the `store` that wants to store file data -(stores that want to sync their data to the rest of the files stores will use this)* - -> Note: fileObj must be mounted on a `FS.Collection`, it makes no sense to store otherwise - -> ```FS.TempStore.createWriteStream = function(fileObj, options) { ...``` [tempStore.js:217](tempStore.js#L217) - - -- - -### *fsTempstore*.createReadStream(fileObj)  Server ### - -*This method __createReadStream__ is defined in `FS.TempStore`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - - The file to read - - -__Returns__ *{Stream}* -Returns readable stream - - - -> ```FS.TempStore.createReadStream = function(fileObj) { ...``` [tempStore.js:313](tempStore.js#L313) - - diff --git a/packages/wekan-cfs-temp-store/package.js b/packages/wekan-cfs-temp-store/package.js deleted file mode 100644 index 61487fed9..000000000 --- a/packages/wekan-cfs-temp-store/package.js +++ /dev/null @@ -1,32 +0,0 @@ - Package.describe({ - git: 'https://github.com/zcfs/Meteor-cfs-tempstore.git', - name: 'wekan-cfs-tempstore', - version: '0.1.6', - summary: 'CollectionFS, temporary storage' -}); - -Npm.depends({ - 'combined-stream': '0.0.4' -}); - -Package.onUse(function(api) { - api.use(['wekan-cfs-base-package@0.0.30', 'wekan-cfs-file@0.1.16', 'ecmascript@0.1.0']); - - api.use('wekan-cfs-filesystem@0.1.2', { weak: true }); - api.use('wekan-cfs-gridfs@0.0.30', { weak: true }); - - api.use('mongo@1.0.0'); - - api.addFiles([ - 'tempStore.js' - ], 'server'); -}); - -// Package.on_test(function (api) { -// api.use('collectionfs'); -// api.use('test-helpers', 'server'); -// api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', -// 'random', 'deps']); - -// api.addFiles('tests/server-tests.js', 'server'); -// }); diff --git a/packages/wekan-cfs-temp-store/tempStore.js b/packages/wekan-cfs-temp-store/tempStore.js deleted file mode 100644 index 3823737f4..000000000 --- a/packages/wekan-cfs-temp-store/tempStore.js +++ /dev/null @@ -1,395 +0,0 @@ -// ##Temporary Storage -// -// Temporary storage is used for chunked uploads until all chunks are received -// and all copies have been made or given up. In some cases, the original file -// is stored only in temporary storage (for example, if all copies do some -// manipulation in beforeSave). This is why we use the temporary file as the -// basis for each saved copy, and then remove it after all copies are saved. -// -// Every chunk is saved as an individual temporary file. This is safer than -// attempting to write multiple incoming chunks to different positions in a -// single temporary file, which can lead to write conflicts. -// -// Using temp files also allows us to easily resume uploads, even if the server -// restarts, and to keep the working memory clear. - -// The FS.TempStore emits events that others are able to listen to -var EventEmitter = Npm.require('events').EventEmitter; - -// We have a special stream concating all chunk files into one readable stream -var CombinedStream = Npm.require('combined-stream'); - -/** @namespace FS.TempStore - * @property FS.TempStore - * @type {object} - * @public - * @summary An event emitter - */ -FS.TempStore = new EventEmitter(); - -// Create a tracker collection for keeping track of all chunks for any files that are currently in the temp store -var tracker = FS.TempStore.Tracker = new Mongo.Collection('cfs._tempstore.chunks'); - -/** - * @property FS.TempStore.Storage - * @type {StorageAdapter} - * @namespace FS.TempStore - * @private - * @summary This property is set to either `FS.Store.FileSystem` or `FS.Store.GridFS` - * - * __When and why:__ - * We normally default to `cfs-filesystem` unless its not installed. *(we default to gridfs if installed)* - * But if `cfs-gridfs` and `cfs-worker` is installed we default to `cfs-gridfs` - * - * If `cfs-gridfs` and `cfs-filesystem` is not installed we log a warning. - * the user can set `FS.TempStore.Storage` them selfs eg.: - * ```js - * // Its important to set `internal: true` this lets the SA know that we - * // are using this internally and it will give us direct SA api - * FS.TempStore.Storage = new FS.Store.GridFS('_tempstore', { internal: true }); - * ``` - * - * > Note: This is considered as `advanced` use, its not a common pattern. - */ -FS.TempStore.Storage = null; - -// We will not mount a storage adapter until needed. This allows us to check for the -// existance of FS.FileWorker, which is loaded after this package because it -// depends on this package. -function mountStorage() { - - if (FS.TempStore.Storage) return; - - // XXX: We could replace this test, testing the FS scope for grifFS etc. - // This is on the todo later when we get "stable" - if (Package["wekan-cfs-gridfs"] && (Package["wekan-cfs-worker"] || !Package["wekan-cfs-filesystem"])) { - // If the file worker is installed we would prefer to use the gridfs sa - // for scalability. We also default to gridfs if filesystem is not found - - // Use the gridfs - FS.TempStore.Storage = new FS.Store.GridFS('_tempstore', { internal: true }); - } else if (Package["wekan-cfs-filesystem"]) { - - // use the Filesystem - FS.TempStore.Storage = new FS.Store.FileSystem('_tempstore', { internal: true }); - } else { - throw new Error('FS.TempStore.Storage is not set: Install wekan-cfs-filesystem or wekan-cfs-gridfs or set it manually'); - } - - FS.debug && console.log('TempStore is mounted on', FS.TempStore.Storage.typeName); -} - -function mountFile(fileObj, name) { - if (!fileObj.isMounted()) { - throw new Error(name + ' cannot work with unmounted file'); - } -} - -// We update the fileObj on progress -FS.TempStore.on('progress', function(fileObj, chunkNum, count, total, result) { - FS.debug && console.log('TempStore progress: Received ' + count + ' of ' + total + ' chunks for ' + fileObj.name()); -}); - -// XXX: TODO -// FS.TempStore.on('stored', function(fileObj, chunkCount, result) { -// // This should work if we pass on result from the SA on stored event... -// fileObj.update({ $set: { chunkSum: 1, chunkCount: chunkCount, size: result.size } }); -// }); - -// Stream implementation - -/** - * @method _chunkPath - * @private - * @param {Number} [n] Chunk number - * @returns {String} Chunk naming convention - */ -_chunkPath = function(n) { - return (n || 0) + '.chunk'; -}; - -/** - * @method _fileReference - * @param {FS.File} fileObj - * @param {Number} chunk - * @private - * @returns {String} Generated SA specific fileKey for the chunk - * - * Note: Calling function should call mountStorage() first, and - * make sure that fileObj is mounted. - */ -_fileReference = function(fileObj, chunk, existing) { - // Maybe it's a chunk we've already saved - existing = existing || tracker.findOne({fileId: fileObj._id, collectionName: fileObj.collectionName}); - - // Make a temporary fileObj just for fileKey generation - var tempFileObj = new FS.File({ - collectionName: fileObj.collectionName, - _id: fileObj._id, - original: { - name: _chunkPath(chunk) - }, - copies: { - _tempstore: { - key: existing && existing.keys[chunk] - } - } - }); - - // Return a fitting fileKey SA specific - return FS.TempStore.Storage.adapter.fileKey(tempFileObj); -}; - -/** - * @method FS.TempStore.exists - * @param {FS.File} File object - * @returns {Boolean} Is this file, or parts of it, currently stored in the TempStore - */ -FS.TempStore.exists = function(fileObj) { - var existing = tracker.findOne({fileId: fileObj._id, collectionName: fileObj.collectionName}); - return !!existing; -}; - -/** - * @method FS.TempStore.listParts - * @param {FS.File} fileObj - * @returns {Object} of parts already stored - * @todo This is not yet implemented, milestone 1.1.0 - */ -FS.TempStore.listParts = function fsTempStoreListParts(fileObj) { - var self = this; - console.warn('This function is not correctly implemented using SA in TempStore'); - //XXX This function might be necessary for resume. Not currently supported. -}; - -/** - * @method FS.TempStore.removeFile - * @public - * @param {FS.File} fileObj - * This function removes the file from tempstorage - it cares not if file is - * already removed or not found, goal is reached anyway. - */ -FS.TempStore.removeFile = function fsTempStoreRemoveFile(fileObj) { - var self = this; - - // Ensure that we have a storage adapter mounted; if not, throw an error. - mountStorage(); - - // If fileObj is not mounted or can't be, throw an error - mountFile(fileObj, 'FS.TempStore.removeFile'); - - // Emit event - self.emit('remove', fileObj); - - var chunkInfo = tracker.findOne({ - fileId: fileObj._id, - collectionName: fileObj.collectionName - }); - - if (chunkInfo) { - - // Unlink each file - FS.Utility.each(chunkInfo.keys || {}, function (key, chunk) { - var fileKey = _fileReference(fileObj, chunk, chunkInfo); - FS.TempStore.Storage.adapter.remove(fileKey, FS.Utility.noop); - }); - - // Remove fileObj from tracker collection, too - tracker.remove({_id: chunkInfo._id}); - - } -}; - -/** - * @method FS.TempStore.removeAll - * @public - * @summary This function removes all files from tempstorage - it cares not if file is - * already removed or not found, goal is reached anyway. - */ -FS.TempStore.removeAll = function fsTempStoreRemoveAll() { - var self = this; - - // Ensure that we have a storage adapter mounted; if not, throw an error. - mountStorage(); - - tracker.find().forEach(function (chunkInfo) { - // Unlink each file - FS.Utility.each(chunkInfo.keys || {}, function (key, chunk) { - var fileKey = _fileReference({_id: chunkInfo.fileId, collectionName: chunkInfo.collectionName}, chunk, chunkInfo); - FS.TempStore.Storage.adapter.remove(fileKey, FS.Utility.noop); - }); - - // Remove from tracker collection, too - tracker.remove({_id: chunkInfo._id}); - }); -}; - -/** - * @method FS.TempStore.createWriteStream - * @public - * @param {FS.File} fileObj File to store in temporary storage - * @param {Number | String} [options] - * @returns {Stream} Writeable stream - * - * `options` of different types mean differnt things: - * * `undefined` We store the file in one part - * *(Normal server-side api usage)* - * * `Number` the number is the part number total - * *(multipart uploads will use this api)* - * * `String` the string is the name of the `store` that wants to store file data - * *(stores that want to sync their data to the rest of the files stores will use this)* - * - * > Note: fileObj must be mounted on a `FS.Collection`, it makes no sense to store otherwise - */ -FS.TempStore.createWriteStream = function(fileObj, options) { - var self = this; - - // Ensure that we have a storage adapter mounted; if not, throw an error. - mountStorage(); - - // If fileObj is not mounted or can't be, throw an error - mountFile(fileObj, 'FS.TempStore.createWriteStream'); - - // Cache the selector for use multiple times below - var selector = {fileId: fileObj._id, collectionName: fileObj.collectionName}; - - // TODO, should pass in chunkSum so we don't need to use FS.File for it - var chunkSum = fileObj.chunkSum || 1; - - // Add fileObj to tracker collection - tracker.upsert(selector, {$setOnInsert: {keys: {}}}); - - // Determine how we're using the writeStream - var isOnePart = false, isMultiPart = false, isStoreSync = false, chunkNum = 0; - if (options === +options) { - isMultiPart = true; - chunkNum = options; - } else if (options === ''+options) { - isStoreSync = true; - } else { - isOnePart = true; - } - - // XXX: it should be possible for a store to sync by storing data into the - // tempstore - this could be done nicely by setting the store name as string - // in the chunk variable? - // This store name could be passed on the the fileworker via the uploaded - // event - // So the uploaded event can return: - // undefined - if data is stored into and should sync out to all storage adapters - // number - if a chunk has been uploaded - // string - if a storage adapter wants to sync its data to the other SA's - - // Find a nice location for the chunk data - var fileKey = _fileReference(fileObj, chunkNum); - - // Create the stream as Meteor safe stream - var writeStream = FS.TempStore.Storage.adapter.createWriteStream(fileKey); - - // When the stream closes we update the chunkCount - writeStream.safeOn('stored', function(result) { - // Save key in tracker document - var setObj = {}; - setObj['keys.' + chunkNum] = result.fileKey; - tracker.update(selector, {$set: setObj}); - - var temp = tracker.findOne(selector); - - if (!temp) { - FS.debug && console.log('NOT FOUND FROM TEMPSTORE => EXIT (REMOVED)'); - return; - } - - // Get updated chunkCount - var chunkCount = FS.Utility.size(temp.keys); - - // Progress - self.emit('progress', fileObj, chunkNum, chunkCount, chunkSum, result); - - var modifier = { $set: {} }; - if (!fileObj.instance_id) { - modifier.$set.instance_id = process.env.COLLECTIONFS_ENV_NAME_UNIQUE_ID ? process.env[process.env.COLLECTIONFS_ENV_NAME_UNIQUE_ID] : process.env.METEOR_PARENT_PID; - } - - // If upload is completed - if (chunkCount === chunkSum) { - // We no longer need the chunk info - modifier.$unset = {chunkCount: 1, chunkSum: 1, chunkSize: 1}; - - // Check if the file has been uploaded before - if (typeof fileObj.uploadedAt === 'undefined') { - // We set the uploadedAt date - modifier.$set.uploadedAt = new Date(); - } else { - // We have been uploaded so an event were file data is updated is - // called synchronizing - so this must be a synchronizedAt? - modifier.$set.synchronizedAt = new Date(); - } - - // Update the fileObject - fileObj.update(modifier); - - // Fire ending events - var eventName = isStoreSync ? 'synchronized' : 'stored'; - self.emit(eventName, fileObj, result); - - // XXX is emitting "ready" necessary? - self.emit('ready', fileObj, chunkCount, result); - } else { - // Update the chunkCount on the fileObject - modifier.$set.chunkCount = chunkCount; - fileObj.update(modifier); - } - }); - - // Emit errors - writeStream.on('error', function (error) { - FS.debug && console.log('TempStore writeStream error:', error); - self.emit('error', error, fileObj); - }); - - return writeStream; -}; - -/** - * @method FS.TempStore.createReadStream - * @public - * @param {FS.File} fileObj The file to read - * @return {Stream} Returns readable stream - * - */ -FS.TempStore.createReadStream = function(fileObj) { - // Ensure that we have a storage adapter mounted; if not, throw an error. - mountStorage(); - - // If fileObj is not mounted or can't be, throw an error - mountFile(fileObj, 'FS.TempStore.createReadStream'); - - FS.debug && console.log('FS.TempStore creating read stream for ' + fileObj._id); - - // Determine how many total chunks there are from the tracker collection - var chunkInfo = tracker.findOne({fileId: fileObj._id, collectionName: fileObj.collectionName}) || {}; - var totalChunks = FS.Utility.size(chunkInfo.keys); - - function getNextStreamFunc(chunk) { - return Meteor.bindEnvironment(function(next) { - var fileKey = _fileReference(fileObj, chunk); - var chunkReadStream = FS.TempStore.Storage.adapter.createReadStream(fileKey); - next(chunkReadStream); - }, function (error) { - throw error; - }); - } - - // Make a combined stream - var combinedStream = CombinedStream.create(); - - // Add each chunk stream to the combined stream when the previous chunk stream ends - var currentChunk = 0; - for (var chunk = 0; chunk < totalChunks; chunk++) { - combinedStream.append(getNextStreamFunc(chunk)); - } - - // Return the combined stream - return combinedStream; -}; diff --git a/packages/wekan-cfs-temp-store/tests/server-tests.js b/packages/wekan-cfs-temp-store/tests/server-tests.js deleted file mode 100644 index 242aa89ca..000000000 --- a/packages/wekan-cfs-temp-store/tests/server-tests.js +++ /dev/null @@ -1,39 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-tempstore - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -/* - * This is a server-only package so only server tests are needed. - * Need to test each API method: - * FS.TempStore.saveChunk - * FS.TempStore.getDataForFile - * FS.TempStore.getDataForFileSync - * FS.TempStore.deleteChunks - * FS.TempStore.ensureForFile - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-upload-http/.travis.yml b/packages/wekan-cfs-upload-http/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-upload-http/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-upload-http/LICENSE.md b/packages/wekan-cfs-upload-http/LICENSE.md deleted file mode 100644 index b8d7fab60..000000000 --- a/packages/wekan-cfs-upload-http/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2014 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-upload-http/README.md b/packages/wekan-cfs-upload-http/README.md deleted file mode 100644 index 855f50585..000000000 --- a/packages/wekan-cfs-upload-http/README.md +++ /dev/null @@ -1,8 +0,0 @@ -wekan-cfs-upload-http -========================= - -This is a Meteor package that provides HTTP uploads for -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. \ No newline at end of file diff --git a/packages/wekan-cfs-upload-http/api.md b/packages/wekan-cfs-upload-http/api.md deleted file mode 100644 index 674502a6f..000000000 --- a/packages/wekan-cfs-upload-http/api.md +++ /dev/null @@ -1,24 +0,0 @@ -## wekan-cfs-upload-http Public API ## - -CollectionFS, HTTP File Upload - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -2MB default upload chunk size -Can be overridden by user with FS.config.uploadChunkSize or per FS.Collection in collection options -- - -### *fsFile*.resume(ref)  Client ### - -*This method __resume__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __ref__ *{[File](#File)|[Blob](#Blob)|Buffer}* - - -> This function is not yet implemented for server - -> ```FS.File.prototype.resume = function(ref) { ...``` [upload-http-client.js:257](upload-http-client.js#L257) - - diff --git a/packages/wekan-cfs-upload-http/internal.api.md b/packages/wekan-cfs-upload-http/internal.api.md deleted file mode 100644 index dd5a57f66..000000000 --- a/packages/wekan-cfs-upload-http/internal.api.md +++ /dev/null @@ -1,160 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["upload-http-client.js"](upload-http-client.js) Where: {client}__ - -*** - -2MB default upload chunk size -Can be overridden by user with FS.config.uploadChunkSize or per FS.Collection in collection options -- - -### _taskHandler(task, next)  Client ### - -*This method is private* - -__Arguments__ - -* __task__ *{Object}* -* __next__ *{Function}* - -__Returns__ *{undefined}* - - -> ```var _taskHandler = function(task, next) { ...``` [upload-http-client.js:15](upload-http-client.js#L15) - - -- - -### _errorHandler(data, addTask)  Client ### - -*This method is private* - -__Arguments__ - -* __data__ *{Object}* -* __addTask__ *{Function}* - -__Returns__ *{undefined}* - - -> ```var _errorHandler = function(data, addTask, failures) { ...``` [upload-http-client.js:49](upload-http-client.js#L49) - - -- - -### new UploadTransferQueue([options])  Client ### - - -__Arguments__ - -* __options__ *{Object}* (Optional) - -> ```UploadTransferQueue = function(options) { ...``` [upload-http-client.js:60](upload-http-client.js#L60) - - -- - -### *uploadtransferqueue*.isUploadingFile(fileObj)  Client ### - -*This method __isUploadingFile__ is defined in `UploadTransferQueue`* - -__Arguments__ - -* __fileObj__ *{[FS.File](#FS.File)}* - - File to check if uploading - - -__Returns__ *{Boolean}* -True if the file is uploading - -__TODO__ -``` -* Maybe have a similar function for accessing the file upload queue? -``` - - - -> ```self.isUploadingFile = function(fileObj) { ...``` [upload-http-client.js:90](upload-http-client.js#L90) - - -- - -### *uploadtransferqueue*.resumeUploadingFile(File)  Client ### - -*This method __resumeUploadingFile__ is defined in `UploadTransferQueue`* - -__Arguments__ - -* __File__ *{[FS.File](#FS.File)}* - - to resume uploading - - -__TODO__ -``` -* Not sure if this is the best way to handle resumes -``` - -> ```self.resumeUploadingFile = function(fileObj) { ...``` [upload-http-client.js:99](upload-http-client.js#L99) - - -- - -### *uploadtransferqueue*.uploadFile(File)  Client ### - -*This method __uploadFile__ is defined in `UploadTransferQueue`* - -__Arguments__ - -* __File__ *{[FS.File](#FS.File)}* - - to upload - - -__TODO__ -``` -* Check that a file can only be added once - maybe a visual helper on the FS.File? -* Have an initial request to the server getting uploaded chunks for resume -``` - -> ```self.uploadFile = function(fileObj) { ...``` [upload-http-client.js:120](upload-http-client.js#L120) - - -- - -### *fsHttp*.uploadQueue UploadTransferQueue  Client ### - -*This property __uploadQueue__ is defined in `FS.HTTP`* - - -There is a single uploads transfer queue per client (not per CFS) - -> ```FS.HTTP.uploadQueue = new UploadTransferQueue();``` [upload-http-client.js:243](upload-http-client.js#L243) - - -- - -### *fsFile*.resume(ref)  Client ### - -*This method __resume__ is defined in `prototype` of `FS.File`* - -__Arguments__ - -* __ref__ *{[File](#File)|[Blob](#Blob)|Buffer}* - -__TODO__ -``` -* WIP, Not yet implemented for server -``` - - -> This function is not yet implemented for server - -> ```FS.File.prototype.resume = function(ref) { ...``` [upload-http-client.js:257](upload-http-client.js#L257) - - diff --git a/packages/wekan-cfs-upload-http/package.js b/packages/wekan-cfs-upload-http/package.js deleted file mode 100644 index ef76ba94c..000000000 --- a/packages/wekan-cfs-upload-http/package.js +++ /dev/null @@ -1,37 +0,0 @@ -Package.describe({ - name: 'wekan-cfs-upload-http', - version: '0.0.21', - summary: 'CollectionFS, HTTP File Upload', -}); - -Package.onUse(function(api) { - api.versionsFrom('1.0'); - - api.use([ - 'wekan-cfs-base-package@0.0.30', - 'wekan-cfs-tempstore@0.1.4', - 'wekan-cfs-file@0.1.16', - 'wekan-cfs-access-point@0.1.49', - 'wekan-cfs-power-queue@0.9.11', - 'wekan-cfs-reactive-list@0.0.9' - ]); - - api.addFiles([ - 'upload-http-common.js', - 'upload-http-client.js' - ], 'client'); - - api.addFiles([ - 'upload-http-common.js' - ], 'server'); -}); - -// Package.onTest(function (api) { -// api.use('collectionfs'); -// api.use('test-helpers', 'server'); -// api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', -// 'random', 'deps']); - -// api.addFiles('tests/server-tests.js', 'server'); -// api.addFiles('tests/client-tests.js', 'client'); -// }); diff --git a/packages/wekan-cfs-upload-http/tests/client-tests.js b/packages/wekan-cfs-upload-http/tests/client-tests.js deleted file mode 100644 index 53ccc6239..000000000 --- a/packages/wekan-cfs-upload-http/tests/client-tests.js +++ /dev/null @@ -1,27 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-upload-http - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-upload-http/tests/server-tests.js b/packages/wekan-cfs-upload-http/tests/server-tests.js deleted file mode 100644 index 7fb4a7f5d..000000000 --- a/packages/wekan-cfs-upload-http/tests/server-tests.js +++ /dev/null @@ -1,27 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-upload-http - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); -}); - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-upload-http/upload-http-client.js b/packages/wekan-cfs-upload-http/upload-http-client.js deleted file mode 100644 index 6ac2ff645..000000000 --- a/packages/wekan-cfs-upload-http/upload-http-client.js +++ /dev/null @@ -1,260 +0,0 @@ -/* - * HTTP Upload Transfer Queue - */ - -// 2MB default upload chunk size -// Can be overridden by user with FS.config.uploadChunkSize or per FS.Collection in collection options -var defaultChunkSize = 2 * 1024 * 1024; - -/** - * @private - * @param {Object} task - * @param {Function} next - * @return {undefined} - */ -var _taskHandler = function(task, next) { - FS.debug && console.log("uploading chunk " + task.chunk + ", bytes " + task.start + " to " + Math.min(task.end, task.fileObj.size()) + " of " + task.fileObj.size()); - task.fileObj.data.getBinary(task.start, task.end, function gotBinaryCallback(err, data) { - if (err) { - next(new Meteor.Error(err.error, err.message)); - } else { - - FS.debug && console.log('PUT to URL', task.url, task.urlParams); - - HTTP.call("PUT", task.url, { - params: FS.Utility.extend({chunk: task.chunk}, task.urlParams), - content: data, - headers: { - 'Content-Type': task.fileObj.type() - } - }, function(error, result) { - task = null; - if (error) { - next(new Meteor.Error(error.error, error.message)); - } else { - next(); - } - }); - - } - }); -}; - -/** - * @private - * @param {Object} data - * @param {Function} addTask - * @return {undefined} - */ -var _errorHandler = function(data, addTask, failures) { - // If file upload fails - // TODO We should retry a few times and then emit error? - // data.fileObj.emit("error", error); -}; - -/** @method UploadTransferQueue - * @namespace UploadTransferQueue - * @constructor - * @param {Object} [options] - */ -UploadTransferQueue = function(options) { - // Rig options - options = options || {}; - - // Init the power queue - var self = new PowerQueue({ - name: 'HTTPUploadTransferQueue', - // spinalQueue: ReactiveList, - maxProcessing: 1, - maxFailures: 5, - jumpOnFailure: true, - autostart: true, - isPaused: false, - filo: false, - debug: FS.debug - }); - - // Keep track of uploaded files via this queue - self.files = {}; - - // cancel maps onto queue reset - self.cancel = self.reset; - - /** - * @method UploadTransferQueue.isUploadingFile - * @param {FS.File} fileObj File to check if uploading - * @returns {Boolean} True if the file is uploading - * - * @todo Maybe have a similar function for accessing the file upload queue? - */ - self.isUploadingFile = function(fileObj) { - // Check if file is already in queue - return !!(fileObj && fileObj._id && fileObj.collectionName && (self.files[fileObj.collectionName] || {})[fileObj._id]); - }; - - /** @method UploadTransferQueue.resumeUploadingFile - * @param {FS.File} File to resume uploading - * @todo Not sure if this is the best way to handle resumes - */ - self.resumeUploadingFile = function(fileObj) { - // Make sure we are handed a FS.File - if (!(fileObj instanceof FS.File)) { - throw new Error('Transfer queue expects a FS.File'); - } - - if (fileObj.isMounted()) { - // This might still be true, preventing upload, if - // there was a server restart without client restart. - self.files[fileObj.collectionName] = self.files[fileObj.collectionName] || {}; - self.files[fileObj.collectionName][fileObj._id] = false; - // Kick off normal upload - self.uploadFile(fileObj); - } - }; - - /** @method UploadTransferQueue.uploadFile - * @param {FS.File} File to upload - * @todo Check that a file can only be added once - maybe a visual helper on the FS.File? - * @todo Have an initial request to the server getting uploaded chunks for resume - */ - self.uploadFile = function(fileObj) { - FS.debug && console.log("HTTP uploadFile"); - - // Make sure we are handed a FS.File - if (!(fileObj instanceof FS.File)) { - throw new Error('Transfer queue expects a FS.File'); - } - - // Make sure that we have size as number - if (typeof fileObj.size() !== 'number') { - throw new Error('TransferQueue upload failed: fileObj size not set'); - } - - // We don't add the file if it's already in transfer or if already uploaded - if (self.isUploadingFile(fileObj) || fileObj.isUploaded()) { - return; - } - - // Make sure the file object is mounted on a collection - if (fileObj.isMounted()) { - - var collectionName = fileObj.collectionName; - var id = fileObj._id; - - // Set the chunkSize to match the collection options, or global config, or default - fileObj.chunkSize = fileObj.collection.options.chunkSize || FS.config.uploadChunkSize || defaultChunkSize; - // Set counter for uploaded chunks - fileObj.chunkCount = 0; - // Calc the number of chunks - fileObj.chunkSum = Math.ceil(fileObj.size() / fileObj.chunkSize); - - if (fileObj.chunkSum === 0) - return; - - // Update the filerecord - // TODO eventually we should be able to do this without storing any chunk info in the filerecord - fileObj.update({$set: {chunkSize: fileObj.chunkSize, chunkCount: fileObj.chunkCount, chunkSum: fileObj.chunkSum}}); - - // Create a sub queue - var chunkQueue = new PowerQueue({ - onEnded: function oneChunkQueueEnded() { - // Remove from list of files being uploaded - self.files[collectionName][id] = false; - // XXX It might be possible for this to be called even though there were errors uploading? - fileObj.emit("uploaded"); - }, - spinalQueue: ReactiveList, - maxProcessing: 1, - maxFailures: 5, - jumpOnFailure: true, - autostart: false, - isPaused: false, - filo: false - }); - - // Rig the custom task handler - chunkQueue.taskHandler = _taskHandler; - - // Rig the error handler - chunkQueue.errorHandler = _errorHandler; - - // Set flag that this file is being transfered - self.files[collectionName] = self.files[collectionName] || {}; - self.files[collectionName][id] = true; - - // Construct URL - var url = FS.HTTP.uploadUrl + '/' + collectionName; - if (id) { - url += '/' + id; - } - - // TODO: Could we somehow figure out if the collection requires login? - var authToken = ''; - if (typeof Accounts !== "undefined") { - var authObject = { - authToken: Accounts._storedLoginToken() || '', - }; - - // Set the authToken - var authString = JSON.stringify(authObject); - authToken = FS.Utility.btoa(authString); - } - - // Construct query string - var urlParams = { - filename: fileObj.name() - }; - if (authToken !== '') { - urlParams.token = authToken; - } - - // Add chunk upload tasks - for (var chunk = 0, start; chunk < fileObj.chunkSum; chunk++) { - start = chunk * fileObj.chunkSize; - // Create and add the task - // XXX should we somehow make sure we haven't uploaded this chunk already, in - // case we are resuming? - chunkQueue.add({ - chunk: chunk, - name: fileObj.name(), - url: url, - urlParams: urlParams, - fileObj: fileObj, - start: start, - end: (chunk + 1) * fileObj.chunkSize - }); - } - - // Add the queue to the main upload queue - self.add(chunkQueue); - } - - }; - - return self; -}; - -/** - * @namespace FS - * @type UploadTransferQueue - * - * There is a single uploads transfer queue per client (not per CFS) - */ -FS.HTTP.uploadQueue = new UploadTransferQueue(); - -/* - * FS.File extensions - */ - -/** - * @method FS.File.prototype.resume - * @public - * @param {File|Blob|Buffer} ref - * @todo WIP, Not yet implemented for server - * - * > This function is not yet implemented for server - */ -FS.File.prototype.resume = function(ref) { - var self = this; - FS.uploadQueue.resumeUploadingFile(self); -}; diff --git a/packages/wekan-cfs-upload-http/upload-http-common.js b/packages/wekan-cfs-upload-http/upload-http-common.js deleted file mode 100644 index 4c630a385..000000000 --- a/packages/wekan-cfs-upload-http/upload-http-common.js +++ /dev/null @@ -1 +0,0 @@ -FS.HTTP = FS.HTTP || {}; diff --git a/packages/wekan-cfs-worker/.travis.yml b/packages/wekan-cfs-worker/.travis.yml deleted file mode 100644 index 6a4640033..000000000 --- a/packages/wekan-cfs-worker/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_install: - - "curl -L http://git.io/s0Zu-w | /bin/sh" \ No newline at end of file diff --git a/packages/wekan-cfs-worker/CHANGELOG.md b/packages/wekan-cfs-worker/CHANGELOG.md deleted file mode 100644 index 84d63d329..000000000 --- a/packages/wekan-cfs-worker/CHANGELOG.md +++ /dev/null @@ -1,123 +0,0 @@ -# Changelog - -## vCurrent -## [v0.1.2] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.1.2) -#### 17/12/14 by Morten Henriksen -## [v0.1.1] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.1.1) -#### 17/12/14 by Morten Henriksen -- Bump to version 0.1.1 - -- mbr update, remove versions.json - -## [v0.1.0] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.1.0) -#### 17/12/14 by Morten Henriksen -- mbr update versions and fix warnings - -- *Merged pull-request:* "Remove the unused function makeSafeCallback()." [#4](https://github.com/zcfs/Meteor-cfs-worker/issues/4) ([DouglasUrner](https://github.com/DouglasUrner)) - -- Remove the unused function makeSafeCallback(). - -- *Merged pull-request:* "Minor formatting edit." [#2](https://github.com/zcfs/Meteor-cfs-worker/issues/2) ([DouglasUrner](https://github.com/DouglasUrner)) - -- Minor formatting edit. - -- 0.9.1 support - -Patches by GitHub user [@DouglasUrner](https://github.com/DouglasUrner). - -## [v0.0.20] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.20) -#### 28/08/14 by Morten Henriksen -- Meteor Package System Update - -## [v0.0.19] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.19) -#### 27/08/14 by Eric Dobbertin -## [v0.0.18] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.18) -#### 27/08/14 by Eric Dobbertin -- Merge branch 'master' of https://github.com/zcfs/Meteor-cfs-worker - -- change package name to lowercase - -## [v0.0.17] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.17) -#### 09/08/14 by Eric Dobbertin -- *Merged pull-request:* "Fixed bug preventing temp chunks deletion" [#1](https://github.com/zcfs/Meteor-cfs-worker/issues/1) ([GuillaumeZuff](https://github.com/GuillaumeZuff)) - -- Fixed bug preventing temp chunks deletion - -Patches by GitHub user [@GuillaumeZuff](https://github.com/GuillaumeZuff). - -## [v0.0.16] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.16) -#### 06/04/14 by Eric Dobbertin -- use uploadedAt so that we can remove chunk info when it's no longer needed - -## [v0.0.15] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.15) -#### 05/04/14 by Morten Henriksen -## [v0.0.14] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.14) -#### 31/03/14 by Eric Dobbertin -- use latest releases - -## [v0.0.13] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.13) -#### 29/03/14 by Morten Henriksen -- remove underscore deps - -## [v0.0.12] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.12) -#### 29/03/14 by Morten Henriksen -- Refactoring and clean ups - -## [v0.0.11] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.11) -#### 23/03/14 by Morten Henriksen -- Rollback to specific git dependency - -- use collectionFS travis version force update - -## [v0.0.10] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.10) -#### 22/03/14 by Morten Henriksen -- try to fix travis test by using general package references - -## [v0.0.9] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.9) -#### 22/03/14 by Morten Henriksen -- out factor fileobj update when file is stored - -- clean up and use the correct end event for streams - -- reference released collectionFS pkg - -## [v0.0.8] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.8) -#### 21/03/14 by Morten Henriksen -## [v0.0.7] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.7) -#### 18/03/14 by Eric Dobbertin -- Remove from temp store when removed from collection - -## [v0.0.6] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.6) -#### 18/03/14 by Morten Henriksen -- fix refactor name for removeFile - -- add back code for running beforeSave function, with stream support (just getting it working for now, can be switched to transform streams later) - -- changed method name - -- minor changes using chunks in file record - -- Add streaming WIP - -## [v0.0.5] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.5) -#### 07/03/14 by Eric Dobbertin -- should be installing devel - -- small change because tempstore no longer tracks chunks in the file object - -## [v0.0.4] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.4) -#### 03/03/14 by Eric Dobbertin -- moved beforeSave out of SA and into here - -- move saveCopy here, out of fs.collection - -- just package and doc tweaks - -## [v0.0.3] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.3) -#### 15/02/14 by Morten Henriksen -## [v0.0.2] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.2) -#### 13/02/14 by Morten Henriksen -## [v0.0.1] (https://github.com/zcfs/Meteor-cfs-worker/tree/v0.0.1) -#### 13/02/14 by Morten Henriksen -- init commit - diff --git a/packages/wekan-cfs-worker/LICENSE.md b/packages/wekan-cfs-worker/LICENSE.md deleted file mode 100644 index 1a3820821..000000000 --- a/packages/wekan-cfs-worker/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 [@raix](https://github.com/raix) and [@aldeed](https://github.com/aldeed), aka Morten N.O. Nørgaard Henriksen, mh@gi-software.com - -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. diff --git a/packages/wekan-cfs-worker/README.md b/packages/wekan-cfs-worker/README.md deleted file mode 100644 index f45ef8df6..000000000 --- a/packages/wekan-cfs-worker/README.md +++ /dev/null @@ -1,8 +0,0 @@ -wekan-cfs-worker -========================= - -This is a Meteor package used by -[CollectionFS](https://github.com/zcfs/Meteor-CollectionFS). - -You don't need to manually add this package to your app. It is added when you -add the `wekan-cfs-standard-packages` package. \ No newline at end of file diff --git a/packages/wekan-cfs-worker/api.md b/packages/wekan-cfs-worker/api.md deleted file mode 100644 index cab1605d5..000000000 --- a/packages/wekan-cfs-worker/api.md +++ /dev/null @@ -1,38 +0,0 @@ -## cfs-worker Public API ## - -CollectionFS, file worker - handles file copies/versions - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -TODO: Use power queue to handle throttling etc. -Use observe to monitor changes and have it create tasks for the power queue -to perform. -- - -### *fs*.FileWorker Object  Server ### - -*This property __FileWorker__ is defined in `FS`* - - -> ```FS.FileWorker = { ...``` [fileWorker.js:9](fileWorker.js#L9) - - -- - -### *fsFileworker*.observe(fsCollection)  Server ### - -*This method __observe__ is defined in `FS.FileWorker`* - -__Arguments__ - -* __fsCollection__ *{[FS.Collection](#FS.Collection)}* - -__Returns__ *{undefined}* - - -Sets up observes on the fsCollection to store file copies and delete -temp files at the appropriate times. - -> ```FS.FileWorker.observe = function(fsCollection) { ...``` [fileWorker.js:20](fileWorker.js#L20) - - diff --git a/packages/wekan-cfs-worker/fileWorker.js b/packages/wekan-cfs-worker/fileWorker.js deleted file mode 100644 index 8d40da3e8..000000000 --- a/packages/wekan-cfs-worker/fileWorker.js +++ /dev/null @@ -1,185 +0,0 @@ -//// TODO: Use power queue to handle throttling etc. -//// Use observe to monitor changes and have it create tasks for the power queue -//// to perform. - -/** - * @public - * @type Object - */ -FS.FileWorker = {}; - -/** - * @method FS.FileWorker.observe - * @public - * @param {FS.Collection} fsCollection - * @returns {undefined} - * - * Sets up observes on the fsCollection to store file copies and delete - * temp files at the appropriate times. - */ -FS.FileWorker.observe = function(fsCollection) { - - // Initiate observe for finding newly uploaded/added files that need to be stored - // per store. - FS.Utility.each(fsCollection.options.stores, function(store) { - var storeName = store.name; - fsCollection.files.find(getReadyQuery(storeName), { - fields: { - copies: 0 - } - }).observe({ - added: function(fsFile) { - // added will catch fresh files - FS.debug && console.log("FileWorker ADDED - calling saveCopy", storeName, "for", fsFile._id); - saveCopy(fsFile, storeName); - }, - changed: function(fsFile) { - // changed will catch failures and retry them - FS.debug && console.log("FileWorker CHANGED - calling saveCopy", storeName, "for", fsFile._id); - saveCopy(fsFile, storeName); - } - }); - }); - - // Initiate observe for finding files that have been stored so we can delete - // any temp files - fsCollection.files.find(getDoneQuery(fsCollection.options.stores)).observe({ - added: function(fsFile) { - FS.debug && console.log("FileWorker ADDED - calling deleteChunks for", fsFile._id); - try { - FS.TempStore.removeFile(fsFile); - } catch(err) { - console.error(err); - } - } - }); - - // Initiate observe for catching files that have been removed and - // removing the data from all stores as well - fsCollection.files.find().observe({ - removed: function(fsFile) { - FS.debug && console.log('FileWorker REMOVED - removing all stored data for', fsFile._id); - //remove from temp store - FS.TempStore.removeFile(fsFile); - //delete from all stores - FS.Utility.each(fsCollection.options.stores, function(storage) { - storage.adapter.remove(fsFile); - }); - } - }); -}; - -/** - * @method getReadyQuery - * @private - * @param {string} storeName - The name of the store to observe - * - * Returns a selector that will be used to identify files that - * have been uploaded but have not yet been stored to the - * specified store. - * - * { - * uploadedAt: {$exists: true}, - * 'copies.storeName`: null, - * 'failures.copies.storeName.doneTrying': {$ne: true} - * } - */ -function getReadyQuery(storeName) { - var selector = {uploadedAt: {$exists: true}}; - selector['copies.' + storeName] = null; - selector['failures.copies.' + storeName + '.doneTrying'] = {$ne: true}; - return selector; -} - -/** - * @method getDoneQuery - * @private - * @param {Array} stores - The stores array from the FS.Collection options - * - * Returns a selector that will be used to identify files where all - * stores have successfully save or have failed the - * max number of times but still have chunks. The resulting selector - * should be something like this: - * - * { - * $and: [ - * {chunks: {$exists: true}}, - * { - * $or: [ - * { - * $and: [ - * { - * 'copies.storeName': {$ne: null} - * }, - * { - * 'copies.storeName': {$ne: false} - * } - * ] - * }, - * { - * 'failures.copies.storeName.doneTrying': true - * } - * ] - * }, - * REPEATED FOR EACH STORE - * ] - * } - * - */ -function getDoneQuery(stores) { - var selector = { - $and: [{chunks: {$exists: true}}] - }; - - // Add conditions for all defined stores - FS.Utility.each(stores, function(store) { - var storeName = store.name; - var copyCond = {$or: [{$and: []}]}; - var tempCond = {}; - tempCond["copies." + storeName] = {$ne: null}; - copyCond.$or[0].$and.push(tempCond); - tempCond = {}; - tempCond["copies." + storeName] = {$ne: false}; - copyCond.$or[0].$and.push(tempCond); - tempCond = {}; - tempCond['failures.copies.' + storeName + '.doneTrying'] = true; - copyCond.$or.push(tempCond); - selector.$and.push(copyCond); - }) - - return selector; -} - -/** - * @method saveCopy - * @private - * @param {FS.File} fsFile - * @param {string} storeName - * @param {Object} options - * @param {Boolean} [options.overwrite=false] - Force save to the specified store? - * @returns {undefined} - * - * Saves to the specified store. If the - * `overwrite` option is `true`, will save to the store even if we already - * have, potentially overwriting any previously saved data. Synchronous. - */ -function saveCopy(fsFile, storeName, options) { - options = options || {}; - - var storage = FS.StorageAdapter(storeName); - if (!storage) { - throw new Error('No store named "' + storeName + '" exists'); - } - - FS.debug && console.log('saving to store ' + storeName); - - try { - var writeStream = storage.adapter.createWriteStream(fsFile); - var readStream = FS.TempStore.createReadStream(fsFile); - - // Pipe the temp data into the storage adapter - readStream.pipe(writeStream); - } catch(err) { - console.error(err); - } -} diff --git a/packages/wekan-cfs-worker/internal.api.md b/packages/wekan-cfs-worker/internal.api.md deleted file mode 100644 index 92cce610b..000000000 --- a/packages/wekan-cfs-worker/internal.api.md +++ /dev/null @@ -1,143 +0,0 @@ -## Public and Private API ## - -_API documentation automatically generated by [docmeteor](https://github.com/raix/docmeteor)._ - -*** - -__File: ["fileWorker.js"](fileWorker.js) Where: {server}__ - -*** - -TODO: Use power queue to handle throttling etc. -Use observe to monitor changes and have it create tasks for the power queue -to perform. - -- - -### *fs*.FileWorker Object  Server ### - -*This property __FileWorker__ is defined in `FS`* - - -> ```FS.FileWorker = { ...``` [fileWorker.js:9](fileWorker.js#L9) - - -- - -### *fsFileworker*.observe(fsCollection)  Server ### - -*This method __observe__ is defined in `FS.FileWorker`* - -__Arguments__ - -* __fsCollection__ *{[FS.Collection](#FS.Collection)}* - -__Returns__ *{undefined}* - - -Sets up observes on the fsCollection to store file copies and delete -temp files at the appropriate times. - -> ```FS.FileWorker.observe = function(fsCollection) { ...``` [fileWorker.js:20](fileWorker.js#L20) - - -- - -### getReadyQuery(storeName)  undefined ### - -*This method is private* - -__Arguments__ - -* __storeName__ *{string}* - - The name of the store to observe - - - -Returns a selector that will be used to identify files that -have been uploaded but have not yet been stored to the -specified store. - -{ -$where: "this.chunkSum === this.chunkCount", -'copies.storeName`: null, -'failures.copies.storeName.doneTrying': {$ne: true} -} - -> ```function getReadyQuery(storeName) { ...``` [fileWorker.js:83](fileWorker.js#L83) - - -- - -### getDoneQuery(stores)  undefined ### - -*This method is private* - -__Arguments__ - -* __stores__ *{Object}* - - The stores object from the FS.Collection options - - - -Returns a selector that will be used to identify files where all -stores have successfully save or have failed the -max number of times but still have chunks. The resulting selector -should be something like this: - -{ -$and: [ -{chunks: {$exists: true}}, -{ -$or: [ -{ -$and: [ -{ -'copies.storeName': {$ne: null} -}, -{ -'copies.storeName': {$ne: false} -} -] -}, -{ -'failures.copies.storeName.doneTrying': true -} -] -}, -REPEATED FOR EACH STORE -] -} - - -> ```function getDoneQuery(stores) { ...``` [fileWorker.js:129](fileWorker.js#L129) - - -- - -### saveCopy(fsFile, storeName, options)  Server ### - -*This method is private* - -__Arguments__ - -* __fsFile__ *{[FS.File](#FS.File)}* -* __storeName__ *{string}* -* __options__ *{Object}* - * __overwrite__ *{Boolean}* (Optional, Default = false) - - Force save to the specified store? - - -__Returns__ *{undefined}* - - -Saves to the specified store. If the -`overwrite` option is `true`, will save to the store even if we already -have, potentially overwriting any previously saved data. Synchronous. - -> ```var makeSafeCallback = function (callback) { ...``` [fileWorker.js:168](fileWorker.js#L168) - - diff --git a/packages/wekan-cfs-worker/package.js b/packages/wekan-cfs-worker/package.js deleted file mode 100644 index e8bc72058..000000000 --- a/packages/wekan-cfs-worker/package.js +++ /dev/null @@ -1,34 +0,0 @@ -Package.describe({ - git: 'https://github.com/zcfs/Meteor-cfs-worker.git', - name: 'wekan-cfs-worker', - version: '0.1.5', - summary: 'CollectionFS, file worker - handles file copies/versions' -}); - -Package.onUse(function(api) { - api.use([ - 'wekan-cfs-base-package@0.0.30', - 'wekan-cfs-tempstore@0.1.6', - 'wekan-cfs-storage-adapter@0.2.1' - ]); - - api.use([ - 'livedata@1.0.0', - 'mongo-livedata@1.0.0', - 'wekan-cfs-power-queue@0.9.11' - ]); - - api.addFiles([ - 'fileWorker.js' - ], 'server'); -}); - -// Package.on_test(function (api) { -// api.use('wekan-cfs-standard-packages@0.0.0'); - -// api.use('test-helpers', 'server'); -// api.use(['tinytest', 'underscore', 'ejson', 'ordered-dict', 'random']); - -// api.addFiles('tests/client-tests.js', 'client'); -// api.addFiles('tests/server-tests.js', 'server'); -// }); diff --git a/packages/wekan-cfs-worker/tests/client-tests.js b/packages/wekan-cfs-worker/tests/client-tests.js deleted file mode 100644 index 49a100846..000000000 --- a/packages/wekan-cfs-worker/tests/client-tests.js +++ /dev/null @@ -1,44 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-worker - client - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Client Tests - * - * construct FS.File with no arguments - * construct FS.File passing in File - * construct FS.File passing in Blob - * load blob into FS.File and then call FS.File.toDataUrl - * call FS.File.setDataFromBinary, then FS.File.getBlob(); make sure correct data is returned - * load blob into FS.File and then call FS.File.getBinary() with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * load blob into FS.File and make sure FS.File.saveLocal initiates a download (possibly can't do automatically) - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-cfs-worker/tests/server-tests.js b/packages/wekan-cfs-worker/tests/server-tests.js deleted file mode 100644 index 713ebc07c..000000000 --- a/packages/wekan-cfs-worker/tests/server-tests.js +++ /dev/null @@ -1,49 +0,0 @@ -function equals(a, b) { - return !!(EJSON.stringify(a) === EJSON.stringify(b)); -} - -Tinytest.add('cfs-worker - server - test environment', function(test) { - test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection'); - test.isTrue(typeof CFSErrorType !== 'undefined', 'test environment not initialized CFSErrorType'); -}); - -/* - * FS.File Server Tests - * - * construct FS.File with no arguments - * load data with FS.File.setDataFromBuffer - * load data with FS.File.setDataFromBinary - * load data and then call FS.File.toDataUrl with and without callback - * load buffer into FS.File and then call FS.File.getBinary with and without start/end; make sure correct data is returned - * construct FS.File, set FS.File.collectionName to a CFS name, and then test FS.File.update/remove/get/put/del/url - * (call these with and without callback to test sync vs. async) - * set FS.File.name to a filename and test that FS.File.getExtension() returns the extension - * - * - * FS.Collection Server Tests - * - * Make sure options.filter is respected - * - * - */ - - -//Test API: -//test.isFalse(v, msg) -//test.isTrue(v, msg) -//test.equalactual, expected, message, not -//test.length(obj, len) -//test.include(s, v) -//test.isNaN(v, msg) -//test.isUndefined(v, msg) -//test.isNotNull -//test.isNull -//test.throws(func) -//test.instanceOf(obj, klass) -//test.notEqual(actual, expected, message) -//test.runId() -//test.exception(exception) -//test.expect_fail() -//test.ok(doc) -//test.fail(doc) -//test.equal(a, b, msg) diff --git a/packages/wekan-ldap/LICENSE b/packages/wekan-ldap/LICENSE deleted file mode 100644 index c2d691582..000000000 --- a/packages/wekan-ldap/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2019 The Wekan Team - -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. diff --git a/packages/wekan-ldap/README.md b/packages/wekan-ldap/README.md deleted file mode 100644 index 4f41d0238..000000000 --- a/packages/wekan-ldap/README.md +++ /dev/null @@ -1,130 +0,0 @@ -# meteor-ldap - -This packages is based on the RocketChat ldap login package - -# settings definition - -LDAP_Enable: Self explanatory - -LDAP_Port: The port of the LDAP server - -LDAP_Host: The host server for the LDAP server - -LDAP_BaseDN: The base DN for the LDAP Tree - -LDAP_Login_Fallback: Fallback on the default authentication method - -LDAP_Reconnect: Reconnect to the server if the connection is lost - -LDAP_Timeout: self explanatory - -LDAP_Idle_Timeout: self explanatory - -LDAP_Connect_Timeout: self explanatory - -LDAP_Authentication: If the LDAP needs a user account to search - -LDAP_Authentication_UserDN: The search user DN - -LDAP_Authentication_Password: The password for the search user - -LDAP_Internal_Log_Level: The logging level for the module - -LDAP_Background_Sync: If the sync of the users should be done in the -background - -LDAP_Background_Sync_Interval: At which interval does the background task sync - -LDAP_Encryption: If using LDAPS, set it to 'ssl', else it will use 'ldap://' - -LDAP_CA_Cert: The certification for the LDAPS server - -LDAP_Reject_Unauthorized: Reject Unauthorized Certificate - -LDAP_User_Search_Filter: - -LDAP_User_Search_Scope: - -LDAP_User_Search_Field: Which field is used to find the user - -LDAP_Search_Page_Size: - -LDAP_Search_Size_Limit: - -LDAP_Group_Filter_Enable: enable group filtering - -LDAP_Group_Filter_ObjectClass: The object class for filtering - -LDAP_Group_Filter_Group_Id_Attribute: - -LDAP_Group_Filter_Group_Member_Attribute: - -LDAP_Group_Filter_Group_Member_Format: - -LDAP_Group_Filter_Group_Name: - -LDAP_Unique_Identifier_Field: This field is sometimes class GUID ( Globally Unique Identifier) - -UTF8_Names_Slugify: Convert the username to utf8 - -LDAP_Username_Field: Which field contains the ldap username - -LDAP_Fullname_Field: Which field contains the ldap full name - -LDAP_Email_Match_Enable: Allow existing account matching by e-mail address when username does not match - -LDAP_Email_Match_Require: Require existing account matching by e-mail address when username does match - -LDAP_Email_Match_Verified: Require existing account email address to be verified for matching - -LDAP_Email_Field: Which field contains the LDAP e-mail address - -LDAP_Sync_User_Data: - -LDAP_Sync_User_Data_FieldMap: - -Accounts_CustomFields: - -LDAP_Default_Domain: The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_Sync_User_Data_FieldMap - - - - -# example settings.json -``` -{ - "LDAP_Port": 389, - "LDAP_Host": "localhost", - "LDAP_BaseDN": "ou=user,dc=example,dc=org", - "LDAP_Login_Fallback": false, - "LDAP_Reconnect": true, - "LDAP_Timeout": 10000, - "LDAP_Idle_Timeout": 10000, - "LDAP_Connect_Timeout": 10000, - "LDAP_Authentication": true, - "LDAP_Authentication_UserDN": "cn=admin,dc=example,dc=org", - "LDAP_Authentication_Password": "admin", - "LDAP_Internal_Log_Level": "debug", - "LDAP_Background_Sync": false, - "LDAP_Background_Sync_Interval": "100", - "LDAP_Encryption": false, - "LDAP_Reject_Unauthorized": false, - "LDAP_Group_Filter_Enable": false, - "LDAP_Search_Page_Size": 0, - "LDAP_Search_Size_Limit": 0, - "LDAP_User_Search_Filter": "", - "LDAP_User_Search_Field": "uid", - "LDAP_User_Search_Scope": "", - "LDAP_Unique_Identifier_Field": "guid", - "LDAP_Username_Field": "uid", - "LDAP_Fullname_Field": "cn", - "LDAP_Email_Match_Enable": true, - "LDAP_Email_Match_Require": false, - "LDAP_Email_Match_Verified": false, - "LDAP_Email_Field": "mail", - "LDAP_Sync_User_Data": false, - "LDAP_Sync_User_Data_FieldMap": "{\"cn\":\"name\", \"mail\":\"email\"}", - "LDAP_Merge_Existing_Users": true, - "UTF8_Names_Slugify": true -} -``` diff --git a/packages/wekan-ldap/client/loginHelper.js b/packages/wekan-ldap/client/loginHelper.js deleted file mode 100644 index 48a290c18..000000000 --- a/packages/wekan-ldap/client/loginHelper.js +++ /dev/null @@ -1,52 +0,0 @@ -// Pass in username, password as normal -// customLdapOptions should be passed in if you want to override LDAP_DEFAULTS -// on any particular call (if you have multiple ldap servers you'd like to connect to) -// You'll likely want to set the dn value here {dn: "..."} -Meteor.loginWithLDAP = function(username, password, customLdapOptions, callback) { - // Retrieve arguments as array - const args = []; - for (let i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - // Pull username and password - username = args.shift(); - password = args.shift(); - - // Check if last argument is a function - // if it is, pop it off and set callback to it - if (typeof args[args.length-1] === 'function') { - callback = args.pop(); - } else { - callback = null; - } - - // if args still holds options item, grab it - if (args.length > 0) { - customLdapOptions = args.shift(); - } else { - customLdapOptions = {}; - } - - // Set up loginRequest object - const loginRequest = { - ldap: true, - username, - ldapPass: password, - ldapOptions: customLdapOptions, - }; - - Accounts.callLoginMethod({ - // Call login method with ldap = true - // This will hook into our login handler for ldap - methodArguments: [loginRequest], - userCallback(error/*, result*/) { - if (error) { - if (callback) { - callback(error); - } - } else if (callback) { - callback(); - } - }, - }); -}; diff --git a/packages/wekan-ldap/package.js b/packages/wekan-ldap/package.js deleted file mode 100644 index b7b4a5d1c..000000000 --- a/packages/wekan-ldap/package.js +++ /dev/null @@ -1,28 +0,0 @@ -Package.describe({ - name: 'wekan-ldap', - version: '0.0.2', - // Brief, one-line summary of the package. - summary: 'Basic meteor login with ldap', - // URL to the Git repository containing the source code for this package. - git: 'https://github.com/wekan/wekan-ldap', - // By default, Meteor will default to using README.md for documentation. - // To avoid submitting documentation, set this field to null. - documentation: 'README.md' -}); - - -Package.onUse(function(api) { - api.versionsFrom('1.0.3.1'); - api.use('yasaricli:slugify@0.0.5'); - api.use('ecmascript@0.9.0'); - api.use('underscore'); - api.use('sha'); - api.use('templating', 'client'); - - api.use('accounts-base', 'server'); - api.use('accounts-password', 'server'); - api.use('percolate:synced-cron', 'server'); - api.addFiles('client/loginHelper.js', 'client'); - - api.mainModule('server/index.js', 'server'); -}); diff --git a/packages/wekan-ldap/server/index.js b/packages/wekan-ldap/server/index.js deleted file mode 100644 index e3ff85a10..000000000 --- a/packages/wekan-ldap/server/index.js +++ /dev/null @@ -1 +0,0 @@ -import './loginHandler'; diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js deleted file mode 100644 index 11b629406..000000000 --- a/packages/wekan-ldap/server/ldap.js +++ /dev/null @@ -1,593 +0,0 @@ -import ldapjs from 'ldapjs'; -import util from 'util'; -import Bunyan from 'bunyan'; -import {log_debug, log_info, log_warn, log_error} from './logger'; - - -export default class LDAP { - constructor() { - this.ldapjs = ldapjs; - - this.connected = false; - - this.options = { - host : this.constructor.settings_get('LDAP_HOST'), - port : this.constructor.settings_get('LDAP_PORT'), - Reconnect : this.constructor.settings_get('LDAP_RECONNECT'), - timeout : this.constructor.settings_get('LDAP_TIMEOUT'), - connect_timeout : this.constructor.settings_get('LDAP_CONNECT_TIMEOUT'), - idle_timeout : this.constructor.settings_get('LDAP_IDLE_TIMEOUT'), - encryption : this.constructor.settings_get('LDAP_ENCRYPTION'), - ca_cert : this.constructor.settings_get('LDAP_CA_CERT'), - reject_unauthorized : this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') !== undefined ? this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') : true, - Authentication : this.constructor.settings_get('LDAP_AUTHENTIFICATION'), - Authentication_UserDN : this.constructor.settings_get('LDAP_AUTHENTIFICATION_USERDN'), - Authentication_Password : this.constructor.settings_get('LDAP_AUTHENTIFICATION_PASSWORD'), - Authentication_Fallback : this.constructor.settings_get('LDAP_LOGIN_FALLBACK'), - BaseDN : this.constructor.settings_get('LDAP_BASEDN'), - Internal_Log_Level : this.constructor.settings_get('INTERNAL_LOG_LEVEL'), - User_Authentication : this.constructor.settings_get('LDAP_USER_AUTHENTICATION'), - User_Authentication_Field : this.constructor.settings_get('LDAP_USER_AUTHENTICATION_FIELD'), - User_Attributes : this.constructor.settings_get('LDAP_USER_ATTRIBUTES'), - User_Search_Filter : this.constructor.settings_get('LDAP_USER_SEARCH_FILTER'), - User_Search_Scope : this.constructor.settings_get('LDAP_USER_SEARCH_SCOPE'), - User_Search_Field : this.constructor.settings_get('LDAP_USER_SEARCH_FIELD'), - Search_Page_Size : this.constructor.settings_get('LDAP_SEARCH_PAGE_SIZE'), - Search_Size_Limit : this.constructor.settings_get('LDAP_SEARCH_SIZE_LIMIT'), - group_filter_enabled : this.constructor.settings_get('LDAP_GROUP_FILTER_ENABLE'), - group_filter_object_class : this.constructor.settings_get('LDAP_GROUP_FILTER_OBJECTCLASS'), - group_filter_group_id_attribute : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE'), - group_filter_group_member_attribute: this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE'), - group_filter_group_member_format : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT'), - group_filter_group_name : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_NAME'), - AD_Simple_Auth : this.constructor.settings_get('LDAP_AD_SIMPLE_AUTH'), - Default_Domain : this.constructor.settings_get('LDAP_DEFAULT_DOMAIN'), - }; - } - - static settings_get(name, ...args) { - let value = process.env[name]; - if (value !== undefined) { - if (value === 'true' || value === 'false') { - value = JSON.parse(value); - } else if (value !== '' && !isNaN(value)) { - value = Number(value); - } - return value; - } else { - log_warn(`Lookup for unset variable: ${name}`); - } - } - - connectSync(...args) { - if (!this._connectSync) { - this._connectSync = Meteor.wrapAsync(this.connectAsync, this); - } - return this._connectSync(...args); - } - - searchAllSync(...args) { - - if (!this._searchAllSync) { - this._searchAllSync = Meteor.wrapAsync(this.searchAllAsync, this); - } - return this._searchAllSync(...args); - } - - connectAsync(callback) { - log_info('Init setup'); - - let replied = false; - - const connectionOptions = { - url : `${this.options.host}:${this.options.port}`, - timeout : this.options.timeout, - connectTimeout: this.options.connect_timeout, - idleTimeout : this.options.idle_timeout, - reconnect : this.options.Reconnect, - }; - - if (this.options.Internal_Log_Level !== 'disabled') { - connectionOptions.log = new Bunyan({ - name : 'ldapjs', - component: 'client', - stream : process.stderr, - level : this.options.Internal_Log_Level, - }); - } - - const tlsOptions = { - rejectUnauthorized: this.options.reject_unauthorized, - }; - - if (this.options.ca_cert && this.options.ca_cert !== '') { - // Split CA cert into array of strings - const chainLines = this.constructor.settings_get('LDAP_CA_CERT').replace(/\\n/g,'\n').split('\n'); - let cert = []; - const ca = []; - chainLines.forEach((line) => { - cert.push(line); - if (line.match(/-END CERTIFICATE-/)) { - ca.push(cert.join('\n')); - cert = []; - } - }); - tlsOptions.ca = ca; - } - - if (this.options.encryption === 'ssl') { - connectionOptions.url = `ldaps://${connectionOptions.url}`; - connectionOptions.tlsOptions = tlsOptions; - } else { - connectionOptions.url = `ldap://${connectionOptions.url}`; - } - - log_info('Connecting', connectionOptions.url); - log_debug(`connectionOptions${util.inspect(connectionOptions)}`); - - this.client = ldapjs.createClient(connectionOptions); - - this.bindSync = Meteor.wrapAsync(this.client.bind, this.client); - - this.client.on('error', (error) => { - log_error('connection', error); - if (replied === false) { - replied = true; - callback(error, null); - } - }); - - this.client.on('idle', () => { - log_info('Idle'); - this.disconnect(); - }); - - this.client.on('close', () => { - log_info('Closed'); - }); - - if (this.options.encryption === 'tls') { - // Set host parameter for tls.connect which is used by ldapjs starttls. This shouldn't be needed in newer nodejs versions (e.g v5.6.0). - // https://github.com/RocketChat/Rocket.Chat/issues/2035 - // https://github.com/mcavage/node-ldapjs/issues/349 - tlsOptions.host = this.options.host; - - log_info('Starting TLS'); - log_debug('tlsOptions', tlsOptions); - - this.client.starttls(tlsOptions, null, (error, response) => { - if (error) { - log_error('TLS connection', error); - if (replied === false) { - replied = true; - callback(error, null); - } - return; - } - - log_info('TLS connected'); - this.connected = true; - if (replied === false) { - replied = true; - callback(null, response); - } - }); - } else { - this.client.on('connect', (response) => { - log_info('LDAP connected'); - this.connected = true; - if (replied === false) { - replied = true; - callback(null, response); - } - }); - } - - setTimeout(() => { - if (replied === false) { - log_error('connection time out', connectionOptions.connectTimeout); - replied = true; - callback(new Error('Timeout')); - } - }, connectionOptions.connectTimeout); - } - - getUserFilter(username) { - const filter = []; - - if (this.options.User_Search_Filter !== '') { - if (this.options.User_Search_Filter[0] === '(') { - filter.push(`${this.options.User_Search_Filter}`); - } else { - filter.push(`(${this.options.User_Search_Filter})`); - } - } - - const usernameFilter = this.options.User_Search_Field.split(',').map((item) => `(${item}=${username})`); - - if (usernameFilter.length === 0) { - log_error('LDAP_LDAP_User_Search_Field not defined'); - } else if (usernameFilter.length === 1) { - filter.push(`${usernameFilter[0]}`); - } else { - filter.push(`(|${usernameFilter.join('')})`); - } - - return `(&${filter.join('')})`; - } - - bindUserIfNecessary(username, password) { - - if (this.domainBinded === true) { - return; - } - - if (!this.options.User_Authentication) { - return; - } - - /* if SimpleAuth is configured, the BaseDN is not needed */ - if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); - - var userDn = ""; - if (this.options.AD_Simple_Auth === true || this.options.AD_Simple_Auth === 'true') { - userDn = `${username}@${this.options.Default_Domain}`; - } else { - userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; - } - - log_info('Binding with User', userDn); - - this.bindSync(userDn, password); - this.domainBinded = true; - } - - bindIfNecessary() { - if (this.domainBinded === true) { - return; - } - - if (this.options.Authentication !== true) { - return; - } - - log_info('Binding UserDN', this.options.Authentication_UserDN); - - this.bindSync(this.options.Authentication_UserDN, this.options.Authentication_Password); - this.domainBinded = true; - } - - searchUsersSync(username, page) { - this.bindIfNecessary(); - const searchOptions = { - filter : this.getUserFilter(username), - scope : this.options.User_Search_Scope || 'sub', - sizeLimit: this.options.Search_Size_Limit, - }; - - if (!!this.options.User_Attributes) searchOptions.attributes = this.options.User_Attributes.split(','); - - if (this.options.Search_Page_Size > 0) { - searchOptions.paged = { - pageSize : this.options.Search_Page_Size, - pagePause: !!page, - }; - } - - log_info('Searching user', username); - log_debug('searchOptions', searchOptions); - log_debug('BaseDN', this.options.BaseDN); - - if (page) { - return this.searchAllPaged(this.options.BaseDN, searchOptions, page); - } - - return this.searchAllSync(this.options.BaseDN, searchOptions); - } - - getUserByIdSync(id, attribute) { - this.bindIfNecessary(); - - const Unique_Identifier_Field = this.constructor.settings_get('LDAP_UNIQUE_IDENTIFIER_FIELD').split(','); - - let filter; - - if (attribute) { - filter = new this.ldapjs.filters.EqualityFilter({ - attribute, - value: Buffer.from(id, 'hex'), - }); - } else { - const filters = []; - Unique_Identifier_Field.forEach((item) => { - filters.push(new this.ldapjs.filters.EqualityFilter({ - attribute: item, - value : Buffer.from(id, 'hex'), - })); - }); - - filter = new this.ldapjs.filters.OrFilter({ filters }); - } - - const searchOptions = { - filter, - scope: 'sub', - }; - - log_info('Searching by id', id); - log_debug('search filter', searchOptions.filter.toString()); - log_debug('BaseDN', this.options.BaseDN); - - const result = this.searchAllSync(this.options.BaseDN, searchOptions); - - if (!Array.isArray(result) || result.length === 0) { - return; - } - - if (result.length > 1) { - log_error('Search by id', id, 'returned', result.length, 'records'); - } - - return result[0]; - } - - getUserByUsernameSync(username) { - this.bindIfNecessary(); - - const searchOptions = { - filter: this.getUserFilter(username), - scope : this.options.User_Search_Scope || 'sub', - }; - - log_info('Searching user', username); - log_debug('searchOptions', searchOptions); - log_debug('BaseDN', this.options.BaseDN); - - const result = this.searchAllSync(this.options.BaseDN, searchOptions); - - if (!Array.isArray(result) || result.length === 0) { - return; - } - - if (result.length > 1) { - log_error('Search by username', username, 'returned', result.length, 'records'); - } - - return result[0]; - } - - getUserGroups(username, ldapUser) { - if (!this.options.group_filter_enabled) { - return true; - } - - const filter = ['(&']; - - if (this.options.group_filter_object_class !== '') { - filter.push(`(objectclass=${this.options.group_filter_object_class})`); - } - - if (this.options.group_filter_group_member_attribute !== '') { - const format_value = ldapUser[this.options.group_filter_group_member_format]; - if (format_value) { - filter.push(`(${this.options.group_filter_group_member_attribute}=${format_value})`); - } - } - - filter.push(')'); - - const searchOptions = { - filter: filter.join('').replace(/#{username}/g, username), - scope : 'sub', - }; - - log_debug('Group list filter LDAP:', searchOptions.filter); - - const result = this.searchAllSync(this.options.BaseDN, searchOptions); - - if (!Array.isArray(result) || result.length === 0) { - return []; - } - - const grp_identifier = this.options.group_filter_group_id_attribute || 'cn'; - const groups = []; - result.map((item) => { - groups.push(item[grp_identifier]); - }); - log_debug(`Groups: ${groups.join(', ')}`); - return groups; - - } - - isUserInGroup(username, ldapUser) { - if (!this.options.group_filter_enabled) { - return true; - } - - const grps = this.getUserGroups(username, ldapUser); - - const filter = ['(&']; - - if (this.options.group_filter_object_class !== '') { - filter.push(`(objectclass=${this.options.group_filter_object_class})`); - } - - if (this.options.group_filter_group_member_attribute !== '') { - const format_value = ldapUser[this.options.group_filter_group_member_format]; - if (format_value) { - filter.push(`(${this.options.group_filter_group_member_attribute}=${format_value})`); - } - } - - if (this.options.group_filter_group_id_attribute !== '') { - filter.push(`(${this.options.group_filter_group_id_attribute}=${this.options.group_filter_group_name})`); - } - filter.push(')'); - - const searchOptions = { - filter: filter.join('').replace(/#{username}/g, username), - scope : 'sub', - }; - - log_debug('Group filter LDAP:', searchOptions.filter); - - const result = this.searchAllSync(this.options.BaseDN, searchOptions); - - if (!Array.isArray(result) || result.length === 0) { - return false; - } - return true; - } - - extractLdapEntryData(entry) { - const values = { - _raw: entry.raw, - }; - - Object.keys(values._raw).forEach((key) => { - const value = values._raw[key]; - - if (!['thumbnailPhoto', 'jpegPhoto'].includes(key)) { - if (value instanceof Buffer) { - values[key] = value.toString(); - } else { - values[key] = value; - } - } - }); - - return values; - } - - searchAllPaged(BaseDN, options, page) { - this.bindIfNecessary(); - - const processPage = ({ entries, title, end, next }) => { - log_info(title); - // Force LDAP idle to wait the record processing - this.client._updateIdle(true); - page(null, entries, { - end, next: () => { - // Reset idle timer - this.client._updateIdle(); - next && next(); - } - }); - }; - - this.client.search(BaseDN, options, (error, res) => { - if (error) { - log_error(error); - page(error); - return; - } - - res.on('error', (error) => { - log_error(error); - page(error); - return; - }); - - let entries = []; - - const internalPageSize = options.paged && options.paged.pageSize > 0 ? options.paged.pageSize * 2 : 500; - - res.on('searchEntry', (entry) => { - entries.push(this.extractLdapEntryData(entry)); - - if (entries.length >= internalPageSize) { - processPage({ - entries, - title: 'Internal Page', - end : false, - }); - entries = []; - } - }); - - res.on('page', (result, next) => { - if (!next) { - this.client._updateIdle(true); - processPage({ - entries, - title: 'Final Page', - end : true, - }); - } else if (entries.length) { - log_info('Page'); - processPage({ - entries, - title: 'Page', - end : false, - next, - }); - entries = []; - } - }); - - res.on('end', () => { - if (entries.length) { - processPage({ - entries, - title: 'Final Page', - end : true, - }); - entries = []; - } - }); - }); - } - - searchAllAsync(BaseDN, options, callback) { - this.bindIfNecessary(); - - this.client.search(BaseDN, options, (error, res) => { - if (error) { - log_error(error); - callback(error); - return; - } - - res.on('error', (error) => { - log_error(error); - callback(error); - return; - }); - - const entries = []; - - res.on('searchEntry', (entry) => { - entries.push(this.extractLdapEntryData(entry)); - }); - - res.on('end', () => { - log_info('Search result count', entries.length); - callback(null, entries); - }); - }); - } - - authSync(dn, password) { - log_info('Authenticating', dn); - - try { - if (password === '') { - throw new Error('Password is not provided'); - } - this.bindSync(dn, password); - log_info('Authenticated', dn); - return true; - } catch (error) { - log_info('Not authenticated', dn); - log_debug('error', error); - return false; - } - } - - disconnect() { - this.connected = false; - this.domainBinded = false; - log_info('Disconecting'); - this.client.unbind(); - } -} diff --git a/packages/wekan-ldap/server/logger.js b/packages/wekan-ldap/server/logger.js deleted file mode 100644 index afd77112e..000000000 --- a/packages/wekan-ldap/server/logger.js +++ /dev/null @@ -1,15 +0,0 @@ -const isLogEnabled = (process.env.LDAP_LOG_ENABLED === 'true'); - - -function log (level, message, data) { - if (isLogEnabled) { - console.log(`[${level}] ${message} ${ data ? JSON.stringify(data, null, 2) : '' }`); - } -} - -function log_debug (...args) { log('DEBUG', ...args); } -function log_info (...args) { log('INFO', ...args); } -function log_warn (...args) { log('WARN', ...args); } -function log_error (...args) { log('ERROR', ...args); } - -export { log, log_debug, log_info, log_warn, log_error }; diff --git a/packages/wekan-ldap/server/loginHandler.js b/packages/wekan-ldap/server/loginHandler.js deleted file mode 100644 index 090ef9da3..000000000 --- a/packages/wekan-ldap/server/loginHandler.js +++ /dev/null @@ -1,252 +0,0 @@ -import {slug, getLdapUsername, getLdapEmail, getLdapUserUniqueID, syncUserData, addLdapUser} from './sync'; -import LDAP from './ldap'; -import { log_debug, log_info, log_warn, log_error } from './logger'; - -function fallbackDefaultAccountSystem(bind, username, password) { - if (typeof username === 'string') { - if (username.indexOf('@') === -1) { - username = {username}; - } else { - username = {email: username}; - } - } - - log_info('Fallback to default account system: ', username ); - - const loginRequest = { - user: username, - password: { - digest: SHA256(password), - algorithm: 'sha-256', - }, - }; - log_debug('Fallback options: ', loginRequest); - - return Accounts._runLoginHandlers(bind, loginRequest); -} - -Accounts.registerLoginHandler('ldap', function(loginRequest) { - if (!loginRequest.ldap || !loginRequest.ldapOptions) { - return undefined; - } - - log_info('Init LDAP login', loginRequest.username); - - if (LDAP.settings_get('LDAP_ENABLE') !== true) { - return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.ldapPass); - } - - const self = this; - const ldap = new LDAP(); - let ldapUser; - - try { - - ldap.connectSync(); - - if (!!LDAP.settings_get('LDAP_USER_AUTHENTICATION')) { - ldap.bindUserIfNecessary(loginRequest.username, loginRequest.ldapPass); - ldapUser = ldap.searchUsersSync(loginRequest.username)[0]; - } else { - - const users = ldap.searchUsersSync(loginRequest.username); - - if (users.length !== 1) { - log_info('Search returned', users.length, 'record(s) for', loginRequest.username); - throw new Error('User not Found'); - } - - if (ldap.isUserInGroup(loginRequest.username, users[0])) { - ldapUser = users[0]; - } else { - throw new Error('User not in a valid group'); - } - - if (ldap.authSync(users[0].dn, loginRequest.ldapPass) !== true) { - ldapUser = null; - log_info('Wrong password for', loginRequest.username) - } - } - - } catch (error) { - log_error(error); - } - - if (!ldapUser) { - if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') === true) { - return fallbackDefaultAccountSystem(self, loginRequest.username, loginRequest.ldapPass); - } - - throw new Meteor.Error('LDAP-login-error', `LDAP Authentication failed with provided username [${ loginRequest.username }]`); - } - - // Look to see if user already exists - - let userQuery; - - const Unique_Identifier_Field = getLdapUserUniqueID(ldapUser); - let user; - // Attempt to find user by unique identifier - - if (Unique_Identifier_Field) { - userQuery = { - 'services.ldap.id': Unique_Identifier_Field.value, - }; - - log_info('Querying user'); - log_debug('userQuery', userQuery); - - user = Meteor.users.findOne(userQuery); - } - - // Attempt to find user by username - - let username; - let email; - - if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { - username = slug(getLdapUsername(ldapUser)); - } else { - username = slug(loginRequest.username); - } - - if(LDAP.settings_get('LDAP_EMAIL_FIELD') !== '') { - email = getLdapEmail(ldapUser); - } - - - if (!user) { - if(email && LDAP.settings_get('LDAP_EMAIL_MATCH_REQUIRE') === true) { - if(LDAP.settings_get('LDAP_EMAIL_MATCH_VERIFIED') === true) { - userQuery = { - '_id' : username, - 'emails.0.address' : email, - 'emails.0.verified' : true - }; - } else { - userQuery = { - '_id' : username, - 'emails.0.address' : email - }; - } - } else { - userQuery = { - username - }; - } - - log_debug('userQuery', userQuery); - - user = Meteor.users.findOne(userQuery); - } - - // Attempt to find user by e-mail address only - - if (!user && email && LDAP.settings_get('LDAP_EMAIL_MATCH_ENABLE') === true) { - - log_info('No user exists with username', username, '- attempting to find by e-mail address instead'); - - if(LDAP.settings_get('LDAP_EMAIL_MATCH_VERIFIED') === true) { - userQuery = { - 'emails.0.address': email, - 'emails.0.verified' : true - }; - } else { - userQuery = { - 'emails.0.address' : email - }; - } - - log_debug('userQuery', userQuery); - - user = Meteor.users.findOne(userQuery); - - } - - // Login user if they exist - if (user) { - if (user.authenticationMethod !== 'ldap' && LDAP.settings_get('LDAP_MERGE_EXISTING_USERS') !== true) { - log_info('User exists without "authenticationMethod : ldap"'); - throw new Meteor.Error('LDAP-login-error', `LDAP Authentication succeded, but there's already a matching Wekan account in MongoDB`); - } - - log_info('Logging user'); - - const stampedToken = Accounts._generateStampedLoginToken(); - const update_data = { - $push: { - 'services.resume.loginTokens': Accounts._hashStampedToken(stampedToken), - }, - }; - - if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) { - log_debug('Updating admin status'); - const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(','); - const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value)); - - user.isAdmin = groups.length > 0; - Meteor.users.update({_id: user._id}, {$set: {isAdmin: user.isAdmin}}); - } - - if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) { - log_debug('Updating Groups/Roles'); - const groups = ldap.getUserGroups(username, ldapUser); - - if( groups.length > 0 ) { - Roles.setUserRoles(user._id, groups ); - log_info(`Updated roles to:${ groups.join(',')}`); - } - } - - Meteor.users.update(user._id, update_data ); - - syncUserData(user, ldapUser); - - if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') === true) { - Accounts.setPassword(user._id, loginRequest.ldapPass, {logout: false}); - } - - return { - userId: user._id, - token: stampedToken.token, - }; - } - - // Create new user - - log_info('User does not exist, creating', username); - - if (LDAP.settings_get('LDAP_USERNAME_FIELD') === '') { - username = undefined; - } - - if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') !== true) { - loginRequest.ldapPass = undefined; - } - - const result = addLdapUser(ldapUser, username, loginRequest.ldapPass); - - if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) { - log_debug('Updating admin status'); - const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(','); - const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value)); - - result.isAdmin = groups.length > 0; - Meteor.users.update({_id: result.userId}, {$set: {isAdmin: result.isAdmin}}); - } - - if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) { - const groups = ldap.getUserGroups(username, ldapUser); - if( groups.length > 0 ) { - Roles.setUserRoles(result.userId, groups ); - log_info(`Set roles to:${ groups.join(',')}`); - } - } - - - if (result instanceof Error) { - throw result; - } - - return result; -}); diff --git a/packages/wekan-ldap/server/sync.js b/packages/wekan-ldap/server/sync.js deleted file mode 100644 index f1b25aea8..000000000 --- a/packages/wekan-ldap/server/sync.js +++ /dev/null @@ -1,469 +0,0 @@ -import _ from 'underscore'; -import SyncedCron from 'meteor/percolate:synced-cron'; -import LDAP from './ldap'; -import { log_debug, log_info, log_warn, log_error } from './logger'; - -Object.defineProperty(Object.prototype, "getLDAPValue", { - value: function (prop) { - const self = this; - for (let key in self) { - if (key.toLowerCase() == prop.toLowerCase()) { - return self[key]; - } - } - }, - - enumerable: false -}); - -export function slug(text) { - if (LDAP.settings_get('LDAP_UTF8_NAMES_SLUGIFY') !== true) { - return text; - } - text = slugify(text, '.'); - return text.replace(/[^0-9a-z-_.]/g, ''); -} - -function templateVarHandler (variable, object) { - - const templateRegex = /#{([\w\-]+)}/gi; - let match = templateRegex.exec(variable); - let tmpVariable = variable; - - if (match == null) { - if (!object.hasOwnProperty(variable)) { - return; - } - return object[variable]; - } else { - while (match != null) { - const tmplVar = match[0]; - const tmplAttrName = match[1]; - - if (!object.hasOwnProperty(tmplAttrName)) { - return; - } - - const attrVal = object[tmplAttrName]; - tmpVariable = tmpVariable.replace(tmplVar, attrVal); - match = templateRegex.exec(variable); - } - return tmpVariable; - } -} - -export function getPropertyValue(obj, key) { - try { - return _.reduce(key.split('.'), (acc, el) => acc[el], obj); - } catch (err) { - return undefined; - } -} - -export function getLdapUsername(ldapUser) { - const usernameField = LDAP.settings_get('LDAP_USERNAME_FIELD'); - - if (usernameField.indexOf('#{') > -1) { - return usernameField.replace(/#{(.+?)}/g, function(match, field) { - return ldapUser.getLDAPValue(field); - }); - } - - return ldapUser.getLDAPValue(usernameField); -} - -export function getLdapEmail(ldapUser) { - const emailField = LDAP.settings_get('LDAP_EMAIL_FIELD'); - - if (emailField.indexOf('#{') > -1) { - return emailField.replace(/#{(.+?)}/g, function(match, field) { - return ldapUser.getLDAPValue(field); - }); - } - - return ldapUser.getLDAPValue(emailField); -} - -export function getLdapFullname(ldapUser) { - const fullnameField = LDAP.settings_get('LDAP_FULLNAME_FIELD'); - if (fullnameField.indexOf('#{') > -1) { - return fullnameField.replace(/#{(.+?)}/g, function(match, field) { - return ldapUser.getLDAPValue(field); - }); - } - return ldapUser.getLDAPValue(fullnameField); -} - -export function getLdapUserUniqueID(ldapUser) { - let Unique_Identifier_Field = LDAP.settings_get('LDAP_UNIQUE_IDENTIFIER_FIELD'); - - if (Unique_Identifier_Field !== '') { - Unique_Identifier_Field = Unique_Identifier_Field.replace(/\s/g, '').split(','); - } else { - Unique_Identifier_Field = []; - } - - let User_Search_Field = LDAP.settings_get('LDAP_USER_SEARCH_FIELD'); - - if (User_Search_Field !== '') { - User_Search_Field = User_Search_Field.replace(/\s/g, '').split(','); - } else { - User_Search_Field = []; - } - - Unique_Identifier_Field = Unique_Identifier_Field.concat(User_Search_Field); - - if (Unique_Identifier_Field.length > 0) { - Unique_Identifier_Field = Unique_Identifier_Field.find((field) => { - return !_.isEmpty(ldapUser._raw.getLDAPValue(field)); - }); - if (Unique_Identifier_Field) { - log_debug(`Identifying user with: ${ Unique_Identifier_Field}`); - Unique_Identifier_Field = { - attribute: Unique_Identifier_Field, - value: ldapUser._raw.getLDAPValue(Unique_Identifier_Field).toString('hex'), - }; - } - return Unique_Identifier_Field; - } -} - -export function getDataToSyncUserData(ldapUser, user) { - const syncUserData = LDAP.settings_get('LDAP_SYNC_USER_DATA'); - const syncUserDataFieldMap = LDAP.settings_get('LDAP_SYNC_USER_DATA_FIELDMAP').trim(); - - const userData = {}; - - if (syncUserData && syncUserDataFieldMap) { - const whitelistedUserFields = ['email', 'name', 'customFields']; - const fieldMap = JSON.parse(syncUserDataFieldMap); - const emailList = []; - _.map(fieldMap, function(userField, ldapField) { - log_debug(`Mapping field ${ldapField} -> ${userField}`); - switch (userField) { - case 'email': - if (!ldapUser.hasOwnProperty(ldapField)) { - log_debug(`user does not have attribute: ${ ldapField }`); - return; - } - - if (_.isObject(ldapUser[ldapField])) { - _.map(ldapUser[ldapField], function(item) { - emailList.push({ address: item, verified: true }); - }); - } else { - emailList.push({ address: ldapUser[ldapField], verified: true }); - } - break; - - default: - const [outerKey, innerKeys] = userField.split(/\.(.+)/); - - if (!_.find(whitelistedUserFields, (el) => el === outerKey)) { - log_debug(`user attribute not whitelisted: ${ userField }`); - return; - } - - if (outerKey === 'customFields') { - let customFieldsMeta; - - try { - customFieldsMeta = JSON.parse(LDAP.settings_get('Accounts_CustomFields')); - } catch (e) { - log_debug('Invalid JSON for Custom Fields'); - return; - } - - if (!getPropertyValue(customFieldsMeta, innerKeys)) { - log_debug(`user attribute does not exist: ${ userField }`); - return; - } - } - - const tmpUserField = getPropertyValue(user, userField); - const tmpLdapField = templateVarHandler(ldapField, ldapUser); - - if (tmpLdapField && tmpUserField !== tmpLdapField) { - // creates the object structure instead of just assigning 'tmpLdapField' to - // 'userData[userField]' in order to avoid the "cannot use the part (...) - // to traverse the element" (MongoDB) error that can happen. Do not handle - // arrays. - // TODO: Find a better solution. - const dKeys = userField.split('.'); - const lastKey = _.last(dKeys); - _.reduce(dKeys, (obj, currKey) => - (currKey === lastKey) - ? obj[currKey] = tmpLdapField - : obj[currKey] = obj[currKey] || {} - , userData); - log_debug(`user.${ userField } changed to: ${ tmpLdapField }`); - } - } - }); - - if (emailList.length > 0) { - if (JSON.stringify(user.emails) !== JSON.stringify(emailList)) { - userData.emails = emailList; - } - } - } - - const uniqueId = getLdapUserUniqueID(ldapUser); - - if (uniqueId && (!user.services || !user.services.ldap || user.services.ldap.id !== uniqueId.value || user.services.ldap.idAttribute !== uniqueId.attribute)) { - userData['services.ldap.id'] = uniqueId.value; - userData['services.ldap.idAttribute'] = uniqueId.attribute; - } - - if (user.authenticationMethod !== 'ldap') { - userData.ldap = true; - } - - if (_.size(userData)) { - return userData; - } -} - - -export function syncUserData(user, ldapUser) { - log_info('Syncing user data'); - log_debug('user', {'email': user.email, '_id': user._id}); - // log_debug('ldapUser', ldapUser.object); - - if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { - const username = slug(getLdapUsername(ldapUser)); - if (user && user._id && username !== user.username) { - log_info('Syncing user username', user.username, '->', username); - Meteor.users.findOne({ _id: user._id }, { $set: { username }}); - } - } - - if (LDAP.settings_get('LDAP_FULLNAME_FIELD') !== '') { - const fullname= getLdapFullname(ldapUser); - log_debug('fullname=',fullname); - if (user && user._id && fullname !== '') { - log_info('Syncing user fullname:', fullname); - Meteor.users.update({ _id: user._id }, { $set: { 'profile.fullname' : fullname, }}); - } - } - - if (LDAP.settings_get('LDAP_EMAIL_FIELD') !== '') { - const email = getLdapEmail(ldapUser); - log_debug('email=', email); - - if (user && user._id && email !== '') { - log_info('Syncing user email:', email); - Meteor.users.update({ - _id: user._id - }, { - $set: { - 'emails.0.address': email, - } - }); - } - } - -} - -export function addLdapUser(ldapUser, username, password) { - const uniqueId = getLdapUserUniqueID(ldapUser); - - const userObject = { - }; - - if (username) { - userObject.username = username; - } - - const userData = getDataToSyncUserData(ldapUser, {}); - - if (userData && userData.emails && userData.emails[0] && userData.emails[0].address) { - if (Array.isArray(userData.emails[0].address)) { - userObject.email = userData.emails[0].address[0]; - } else { - userObject.email = userData.emails[0].address; - } - } else if (ldapUser.mail && ldapUser.mail.indexOf('@') > -1) { - userObject.email = ldapUser.mail; - } else if (LDAP.settings_get('LDAP_DEFAULT_DOMAIN') !== '') { - userObject.email = `${ username || uniqueId.value }@${ LDAP.settings_get('LDAP_DEFAULT_DOMAIN') }`; - } else { - const error = new Meteor.Error('LDAP-login-error', 'LDAP Authentication succeded, there is no email to create an account. Have you tried setting your Default Domain in LDAP Settings?'); - log_error(error); - throw error; - } - - log_debug('New user data', userObject); - - if (password) { - userObject.password = password; - } - - try { - // This creates the account with password service - userObject.ldap = true; - userObject._id = Accounts.createUser(userObject); - - // Add the services.ldap identifiers - Meteor.users.update({ _id: userObject._id }, { - $set: { - 'services.ldap': { id: uniqueId.value }, - 'emails.0.verified': true, - 'authenticationMethod': 'ldap', - }}); - } catch (error) { - log_error('Error creating user', error); - return error; - } - - syncUserData(userObject, ldapUser); - - return { - userId: userObject._id, - }; -} - -export function importNewUsers(ldap) { - if (LDAP.settings_get('LDAP_ENABLE') !== true) { - log_error('Can\'t run LDAP Import, LDAP is disabled'); - return; - } - - if (!ldap) { - ldap = new LDAP(); - ldap.connectSync(); - } - - let count = 0; - ldap.searchUsersSync('*', Meteor.bindEnvironment((error, ldapUsers, {next, end} = {}) => { - if (error) { - throw error; - } - - ldapUsers.forEach((ldapUser) => { - count++; - - const uniqueId = getLdapUserUniqueID(ldapUser); - // Look to see if user already exists - const userQuery = { - 'services.ldap.id': uniqueId.value, - }; - - log_debug('userQuery', userQuery); - - let username; - if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { - username = slug(getLdapUsername(ldapUser)); - } - - // Add user if it was not added before - let user = Meteor.users.findOne(userQuery); - - if (!user && username && LDAP.settings_get('LDAP_MERGE_EXISTING_USERS') === true) { - const userQuery = { - username, - }; - - log_debug('userQuery merge', userQuery); - - user = Meteor.users.findOne(userQuery); - if (user) { - syncUserData(user, ldapUser); - } - } - - if (!user) { - addLdapUser(ldapUser, username); - } - - if (count % 100 === 0) { - log_info('Import running. Users imported until now:', count); - } - }); - - if (end) { - log_info('Import finished. Users imported:', count); - } - - next(count); - })); -} - -function sync() { - if (LDAP.settings_get('LDAP_ENABLE') !== true) { - return; - } - - const ldap = new LDAP(); - - try { - ldap.connectSync(); - - let users; - if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED') === true) { - users = Meteor.users.find({ 'services.ldap': { $exists: true }}); - } - - if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS') === true) { - importNewUsers(ldap); - } - - if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED') === true) { - users.forEach(function(user) { - let ldapUser; - - if (user.services && user.services.ldap && user.services.ldap.id) { - ldapUser = ldap.getUserByIdSync(user.services.ldap.id, user.services.ldap.idAttribute); - } else { - ldapUser = ldap.getUserByUsernameSync(user.username); - } - - if (ldapUser) { - syncUserData(user, ldapUser); - } else { - log_info('Can\'t sync user', user.username); - } - }); - } - } catch (error) { - log_error(error); - return error; - } - return true; -} - -const jobName = 'LDAP_Sync'; - -const addCronJob = _.debounce(Meteor.bindEnvironment(function addCronJobDebounced() { - let sc=SyncedCron.SyncedCron; //Why ?? something must be wrong in the import - if (LDAP.settings_get('LDAP_BACKGROUND_SYNC') !== true) { - log_info('Disabling LDAP Background Sync'); - if (sc.nextScheduledAtDate(jobName)) { - sc.remove(jobName); - } - return; - } - - log_info('Enabling LDAP Background Sync'); - sc.add({ - name: jobName, - schedule: function(parser) { - if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_INTERVAL')) { - return parser.text(LDAP.settings_get('LDAP_BACKGROUND_SYNC_INTERVAL')); - } - else { - return parser.recur().on(0).minute(); - }}, - job: function() { - sync(); - }, - }); - sc.start(); - -}), 500); - -Meteor.startup(() => { - Meteor.defer(() => { - if(LDAP.settings_get('LDAP_BACKGROUND_SYNC')){addCronJob();} - }); -}); diff --git a/packages/wekan-ldap/server/syncUser.js b/packages/wekan-ldap/server/syncUser.js deleted file mode 100644 index 763ea836d..000000000 --- a/packages/wekan-ldap/server/syncUser.js +++ /dev/null @@ -1,29 +0,0 @@ -import {importNewUsers} from './sync'; -import LDAP from './ldap'; - -Meteor.methods({ - ldap_sync_now() { - const user = Meteor.user(); - if (!user) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'ldap_sync_users' }); - } - - //TODO: This needs to be fixed - security issue -> alanning:meteor-roles - //if (!RocketChat.authz.hasRole(user._id, 'admin')) { - // throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'ldap_sync_users' }); - //} - - if (LDAP.settings_get('LDAP_ENABLE') !== true) { - throw new Meteor.Error('LDAP_disabled'); - } - - this.unblock(); - - importNewUsers(); - - return { - message: 'Sync_in_progress', - params: [], - }; - }, -}); diff --git a/packages/wekan-ldap/server/testConnection.js b/packages/wekan-ldap/server/testConnection.js deleted file mode 100644 index 02866ce54..000000000 --- a/packages/wekan-ldap/server/testConnection.js +++ /dev/null @@ -1,39 +0,0 @@ -import LDAP from './ldap'; - -Meteor.methods({ - ldap_test_connection() { - const user = Meteor.user(); - if (!user) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'ldap_test_connection' }); - } - - //TODO: This needs to be fixed - security issue -> alanning:meteor-roles - //if (!RocketChat.authz.hasRole(user._id, 'admin')) { - // throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'ldap_test_connection' }); - //} - - if (LDAP.settings_get(LDAP_ENABLE) !== true) { - throw new Meteor.Error('LDAP_disabled'); - } - - let ldap; - try { - ldap = new LDAP(); - ldap.connectSync(); - } catch (error) { - console.log(error); - throw new Meteor.Error(error.message); - } - - try { - ldap.bindIfNecessary(); - } catch (error) { - throw new Meteor.Error(error.name || error.message); - } - - return { - message: 'Connection_success', - params: [], - }; - }, -}); diff --git a/packages/wekan-oidc/.gitignore b/packages/wekan-oidc/.gitignore deleted file mode 100644 index 5379d4c38..000000000 --- a/packages/wekan-oidc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.versions diff --git a/packages/wekan-oidc/LICENSE.txt b/packages/wekan-oidc/LICENSE.txt deleted file mode 100644 index c7be32647..000000000 --- a/packages/wekan-oidc/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (C) 2016 SWITCH - -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. - diff --git a/packages/wekan-oidc/README.md b/packages/wekan-oidc/README.md deleted file mode 100644 index 8948971c0..000000000 --- a/packages/wekan-oidc/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# salleman:oidc package - -A Meteor implementation of OpenID Connect Login flow - -## Usage and Documentation - -Look at the `salleman:accounts-oidc` package for the documentation about using OpenID Connect with Meteor. diff --git a/packages/wekan-oidc/oidc_client.js b/packages/wekan-oidc/oidc_client.js deleted file mode 100644 index 6da9d9f0e..000000000 --- a/packages/wekan-oidc/oidc_client.js +++ /dev/null @@ -1,67 +0,0 @@ -Oidc = {}; - -// Request OpenID Connect credentials for the user -// @param options {optional} -// @param credentialRequestCompleteCallback {Function} Callback function to call on -// completion. Takes one argument, credentialToken on success, or Error on -// error. -Oidc.requestCredential = function (options, credentialRequestCompleteCallback) { - // support both (options, callback) and (callback). - if (!credentialRequestCompleteCallback && typeof options === 'function') { - credentialRequestCompleteCallback = options; - options = {}; - } - - var config = ServiceConfiguration.configurations.findOne({service: 'oidc'}); - if (!config) { - credentialRequestCompleteCallback && credentialRequestCompleteCallback( - new ServiceConfiguration.ConfigError('Service oidc not configured.')); - return; - } - - var credentialToken = Random.secret(); - var loginStyle = OAuth._loginStyle('oidc', config, options); - - // options - options = options || {}; - options.client_id = config.clientId; - options.response_type = options.response_type || 'code'; - options.redirect_uri = OAuth._redirectUri('oidc', config); - options.state = OAuth._stateParam(loginStyle, credentialToken, options.redirectUrl); - options.scope = config.requestPermissions || 'openid profile email'; - - if (config.loginStyle && config.loginStyle == 'popup') { - options.display = 'popup'; - } - - var loginUrl = config.serverUrl + config.authorizationEndpoint; - // check if the loginUrl already contains a "?" - var first = loginUrl.indexOf('?') === -1; - for (var k in options) { - if (first) { - loginUrl += '?'; - first = false; - } - else { - loginUrl += '&' - } - loginUrl += encodeURIComponent(k) + '=' + encodeURIComponent(options[k]); - } - - //console.log('XXX: loginURL: ' + loginUrl) - - options.popupOptions = options.popupOptions || {}; - var popupOptions = { - width: options.popupOptions.width || 320, - height: options.popupOptions.height || 450 - }; - - OAuth.launchLogin({ - loginService: 'oidc', - loginStyle: loginStyle, - loginUrl: loginUrl, - credentialRequestCompleteCallback: credentialRequestCompleteCallback, - credentialToken: credentialToken, - popupOptions: popupOptions, - }); -}; diff --git a/packages/wekan-oidc/oidc_configure.html b/packages/wekan-oidc/oidc_configure.html deleted file mode 100644 index 49282fc18..000000000 --- a/packages/wekan-oidc/oidc_configure.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/wekan-oidc/oidc_configure.js b/packages/wekan-oidc/oidc_configure.js deleted file mode 100644 index 5eedaa041..000000000 --- a/packages/wekan-oidc/oidc_configure.js +++ /dev/null @@ -1,17 +0,0 @@ -Template.configureLoginServiceDialogForOidc.helpers({ - siteUrl: function () { - return Meteor.absoluteUrl(); - } -}); - -Template.configureLoginServiceDialogForOidc.fields = function () { - return [ - { property: 'clientId', label: 'Client ID'}, - { property: 'secret', label: 'Client Secret'}, - { property: 'serverUrl', label: 'OIDC Server URL'}, - { property: 'authorizationEndpoint', label: 'Authorization Endpoint'}, - { property: 'tokenEndpoint', label: 'Token Endpoint'}, - { property: 'userinfoEndpoint', label: 'Userinfo Endpoint'}, - { property: 'idTokenWhitelistFields', label: 'Id Token Fields'} - ]; -}; diff --git a/packages/wekan-oidc/oidc_server.js b/packages/wekan-oidc/oidc_server.js deleted file mode 100644 index 97f20519b..000000000 --- a/packages/wekan-oidc/oidc_server.js +++ /dev/null @@ -1,252 +0,0 @@ -Oidc = {}; -httpCa = false; - -if (process.env.OAUTH2_CA_CERT !== undefined) { - try { - const fs = Npm.require('fs'); - if (fs.existsSync(process.env.OAUTH2_CA_CERT)) { - httpCa = fs.readFileSync(process.env.OAUTH2_CA_CERT); - } - } catch(e) { - console.log('WARNING: failed loading: ' + process.env.OAUTH2_CA_CERT); - console.log(e); - } -} - -OAuth.registerService('oidc', 2, null, function (query) { - - var debug = process.env.DEBUG || false; - var token = getToken(query); - if (debug) console.log('XXX: register token:', token); - - var accessToken = token.access_token || token.id_token; - var expiresAt = (+new Date) + (1000 * parseInt(token.expires_in, 10)); - - var claimsInAccessToken = (process.env.OAUTH2_ADFS_ENABLED === 'true' || process.env.OAUTH2_ADFS_ENABLED === true) || false; - - var userinfo; - if(claimsInAccessToken) - { - // hack when using custom claims in the accessToken. On premise ADFS - userinfo = getTokenContent(accessToken); - } - else - { - // normal behaviour, getting the claims from UserInfo endpoint. - userinfo = getUserInfo(accessToken); - } - - if (userinfo.ocs) userinfo = userinfo.ocs.data; // Nextcloud hack - if (userinfo.metadata) userinfo = userinfo.metadata // Openshift hack - if (debug) console.log('XXX: userinfo:', userinfo); - - var serviceData = {}; - serviceData.id = userinfo[process.env.OAUTH2_ID_MAP]; // || userinfo["id"]; - serviceData.username = userinfo[process.env.OAUTH2_USERNAME_MAP]; // || userinfo["uid"]; - serviceData.fullname = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"]; - serviceData.accessToken = accessToken; - serviceData.expiresAt = expiresAt; - - // If on Oracle OIM email is empty or null, get info from username - if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED === true) { - if (userinfo[process.env.OAUTH2_EMAIL_MAP]) { - serviceData.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; - } else { - serviceData.email = userinfo[process.env.OAUTH2_USERNAME_MAP]; - } - } - - if (process.env.ORACLE_OIM_ENABLED !== 'true' && process.env.ORACLE_OIM_ENABLED !== true) { - serviceData.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; // || userinfo["email"]; - } - - if (accessToken) { - var tokenContent = getTokenContent(accessToken); - var fields = _.pick(tokenContent, getConfiguration().idTokenWhitelistFields); - _.extend(serviceData, fields); - } - - if (token.refresh_token) - serviceData.refreshToken = token.refresh_token; - if (debug) console.log('XXX: serviceData:', serviceData); - - var profile = {}; - profile.name = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"]; - profile.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; // || userinfo["email"]; - if (debug) console.log('XXX: profile:', profile); - - return { - serviceData: serviceData, - options: { profile: profile } - }; -}); - -var userAgent = "Meteor"; -if (Meteor.release) { - userAgent += "/" + Meteor.release; -} - -if (process.env.ORACLE_OIM_ENABLED !== 'true' && process.env.ORACLE_OIM_ENABLED !== true) { - var getToken = function (query) { - var debug = process.env.DEBUG || false; - var config = getConfiguration(); - if(config.tokenEndpoint.includes('https://')){ - var serverTokenEndpoint = config.tokenEndpoint; - }else{ - var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint; - } - var requestPermissions = config.requestPermissions; - var response; - - try { - var postOptions = { - headers: { - Accept: 'application/json', - "User-Agent": userAgent - }, - params: { - code: query.code, - client_id: config.clientId, - client_secret: OAuth.openSecret(config.secret), - redirect_uri: OAuth._redirectUri('oidc', config), - grant_type: 'authorization_code', - state: query.state - } - }; - if (httpCa) { - postOptions['npmRequestOptions'] = { ca: httpCa }; - } - response = HTTP.post(serverTokenEndpoint, postOptions); - } catch (err) { - throw _.extend(new Error("Failed to get token from OIDC " + serverTokenEndpoint + ": " + err.message), - { response: err.response }); - } - if (response.data.error) { - // if the http response was a json object with an error attribute - throw new Error("Failed to complete handshake with OIDC " + serverTokenEndpoint + ": " + response.data.error); - } else { - if (debug) console.log('XXX: getToken response: ', response.data); - return response.data; - } - }; -} - -if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED === true) { - - var getToken = function (query) { - var debug = (process.env.DEBUG === 'true' || process.env.DEBUG === true) || false; - var config = getConfiguration(); - if(config.tokenEndpoint.includes('https://')){ - var serverTokenEndpoint = config.tokenEndpoint; - }else{ - var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint; - } - var requestPermissions = config.requestPermissions; - var response; - - // OIM needs basic Authentication token in the header - ClientID + SECRET in base64 - var dataToken=null; - var strBasicToken=null; - var strBasicToken64=null; - - dataToken = process.env.OAUTH2_CLIENT_ID + ':' + process.env.OAUTH2_SECRET; - strBasicToken = new Buffer(dataToken); - strBasicToken64 = strBasicToken.toString('base64'); - - // eslint-disable-next-line no-console - if (debug) console.log('Basic Token: ', strBasicToken64); - - try { - var postOptions = { - headers: { - Accept: 'application/json', - "User-Agent": userAgent, - "Authorization": "Basic " + strBasicToken64 - }, - params: { - code: query.code, - client_id: config.clientId, - client_secret: OAuth.openSecret(config.secret), - redirect_uri: OAuth._redirectUri('oidc', config), - grant_type: 'authorization_code', - state: query.state - } - }; - if (httpCa) { - postOptions['npmRequestOptions'] = { ca: httpCa }; - } - response = HTTP.post(serverTokenEndpoint, postOptions); - } catch (err) { - throw _.extend(new Error("Failed to get token from OIDC " + serverTokenEndpoint + ": " + err.message), - { response: err.response }); - } - if (response.data.error) { - // if the http response was a json object with an error attribute - throw new Error("Failed to complete handshake with OIDC " + serverTokenEndpoint + ": " + response.data.error); - } else { - // eslint-disable-next-line no-console - if (debug) console.log('XXX: getToken response: ', response.data); - return response.data; - } - }; -} - -var getUserInfo = function (accessToken) { - var debug = process.env.DEBUG || false; - var config = getConfiguration(); - // Some userinfo endpoints use a different base URL than the authorization or token endpoints. - // This logic allows the end user to override the setting by providing the full URL to userinfo in their config. - if (config.userinfoEndpoint.includes("https://")) { - var serverUserinfoEndpoint = config.userinfoEndpoint; - } else { - var serverUserinfoEndpoint = config.serverUrl + config.userinfoEndpoint; - } - var response; - try { - var getOptions = { - headers: { - "User-Agent": userAgent, - "Authorization": "Bearer " + accessToken - } - }; - if (httpCa) { - getOptions['npmRequestOptions'] = { ca: httpCa }; - } - response = HTTP.get(serverUserinfoEndpoint, getOptions); - } catch (err) { - throw _.extend(new Error("Failed to fetch userinfo from OIDC " + serverUserinfoEndpoint + ": " + err.message), - {response: err.response}); - } - if (debug) console.log('XXX: getUserInfo response: ', response.data); - return response.data; -}; - -var getConfiguration = function () { - var config = ServiceConfiguration.configurations.findOne({ service: 'oidc' }); - if (!config) { - throw new ServiceConfiguration.ConfigError('Service oidc not configured.'); - } - return config; -}; - -var getTokenContent = function (token) { - var content = null; - if (token) { - try { - var parts = token.split('.'); - var header = JSON.parse(Buffer.from(parts[0], 'base64').toString()); - content = JSON.parse(Buffer.from(parts[1], 'base64').toString()); - var signature = Buffer.from(parts[2], 'base64'); - var signed = parts[0] + '.' + parts[1]; - } catch (err) { - this.content = { - exp: 0 - }; - } - } - return content; -} - -Oidc.retrieveCredential = function (credentialToken, credentialSecret) { - return OAuth.retrieveCredential(credentialToken, credentialSecret); -}; diff --git a/packages/wekan-oidc/package.js b/packages/wekan-oidc/package.js deleted file mode 100644 index 273ef6126..000000000 --- a/packages/wekan-oidc/package.js +++ /dev/null @@ -1,23 +0,0 @@ -Package.describe({ - summary: "OpenID Connect (OIDC) flow for Meteor", - version: "1.0.12", - name: "wekan-oidc", - git: "https://github.com/wekan/wekan-oidc.git", -}); - -Package.onUse(function(api) { - api.use('oauth2@1.1.0', ['client', 'server']); - api.use('oauth@1.1.0', ['client', 'server']); - api.use('http@1.1.0', ['server']); - api.use('underscore@1.0.0', 'client'); - api.use('templating@1.1.0', 'client'); - api.use('random@1.0.0', 'client'); - api.use('service-configuration@1.0.0', ['client', 'server']); - - api.export('Oidc'); - - api.addFiles(['oidc_configure.html', 'oidc_configure.js'], 'client'); - - api.addFiles('oidc_server.js', 'server'); - api.addFiles('oidc_client.js', 'client'); -}); diff --git a/packages/wekan-tap-i18n/ChangeLog b/packages/wekan-tap-i18n/ChangeLog new file mode 100644 index 000000000..e58de9fd7 --- /dev/null +++ b/packages/wekan-tap-i18n/ChangeLog @@ -0,0 +1,216 @@ +2016.05.24, Version 1.8.1 + +* Avoid race condition in setLanguage method. Fixes #86, thanks @mpowaga + +2016.03.14, Version 1.8.0 + +* YAML translations files support, thanks @karfield @nscarcella + +2015.10.06, Version 1.7.0 + +* Ready for Meteor v1.2 + +2015.09.19, Version 1.6.1 + +* [BUGFIX] Fix compiler's output path, thanks @glyphing + +2015.07.24, Version 1.6.0 + +* Implement project-tap.i18n's preloaded_langs option +* Improve Chinese dialects names + +2015.07.06, Version 1.5.1 + +* Register server side translator for fallback language correctly, fix #82 + +2015.05.08, Version 1.5.0 + +* Make TAPi18n a constructor instead of object, inherit from EventEmitter +* Make the lang option alias to the lng option in tap:i18n translator functions +* Allow translation to a specific language on the client +* [BUGFIX] Allow pre Meteor.startup() server side translations, resolves #56 +* [BUGFIX] Allow 0 as first argument of sprintf args. fix #43 +* [MINOR] i18next: Fix plurals function for Mandinka @hamoid +* [MINOR] README: Added note about dot notation @SachaG +* [MINOR] Correct name for Ukrainina language @shkomg +* [MINOR] Travis CI: Stop testing node v0.8 + +2015.02.28, Version 1.4.1 + +* [bugfix] Under cordova ensure absoluteUrl have no trailing / + +2015.02.05, Version 1.4.0 + +* Add Cordova support (requires internet connection) + +2015.01.16, Version 1.3.2 + +* Use simple-schema 1.3.0 + +2015.01.14, Version 1.3.1 + +* [bugfix] getLanguages() should return languages defined as supported in + project-tap.i18n even if there is no *.i18n.json for these languages in + the project level +* [bugfix] getLanguages() shouldn't return non-supported languages Fix #38 +* Use cfs:http-methods@0.0.27 instead of tap:http-methods@0.0.23 + +2015.01.11, Version 1.3.0 + +* Fix language_names object keys, fix #36 +* Disable TAPi18next cookie feature that caused anomalies +* Introduce TAPi18n.loadTranslations + +2014.11.25, Version 1.2.1 + +* Register helpers with Template.template.helpers() +* [bugfix] fix the package templates detection (got broken by a Meteor API change) + +2014.11.25, Version 1.2.0 + +* package-tap.i18n: Introduce the namespace option + +2014.11.22, Version 1.1.1 + +* [bugfix] build plugin: don't assign _ var to global namespace. Thanks +@smeijer . #30 + +2014.11.18, Version 1.1.0 + +* Allow the use of comments in *.i18n.json files +* [MINOR] package.js: use METEOR@0.9.4, and the stable version of registerBuildPlugin +* [MINOR] fix a symbolic link +* [MINOR] add to the tree files that were missing due to wrong .gitignore + +2014.09.25, Version 1.0.7 + +* [bugfix] Packages non-fallback languages now load see issue #13 Thanks + to @francocatena . +* [bugfix] tap:i18n files of packages under /packages directory now load + correctly + +2014.09.24, Version 1.0.6, 304e1ee00e2916646bf672fd53ef5a6cceb69db4 + +* [bugfix] Project level: Make loading of tap:i18n files insensitive to order by + Registering template helpers as soon as tap:i18n gets enabled and not on + Meteor.ready() . Thanks to @danieljonce for reporting this issue + +2014.09.24, Version 1.0.5, df044dc3523d1ebb608f1e115a31539b4ba42742 + +* Project level: languages files should be common to server and client +* Fix unitests - add languages files to the tree +* Remove redundant output from i18n.json and project-tap.i18n compilers + +2014.09.19, Version 1.0.4, 4d843a11cf757ef6d2ff6534a1c6b757b91eedda + +* [bugfix] each language file should have its own output path + (this bug prevented multiple files per language in the app level) + +2014.09.16, Version 1.0.3, 888f3dd5066e320513a76f5bb1ce711a7a84478d + +* [bugfix] TAPi18n.getLanguages() format is now compatible with docs + +2014.09.10, Version 1.0.2, 66fcd441f3b6a107db0aa32c8f3ea9692c1c8c09 + +* [bugfix] compiler: fix error for invalid JSON + +2014.09.10, Version 1.0.1, 7f92b8fbd8ced171873b8afd70a808f51167e7ac + +* Allow project-tap.i18n's supported_languages to have a lang with no +translation files +* [bugfix] tap-i18n compiler: init compiler_configuration upon a rebuild + +2014.09.09, Version 1.0.0, 5964838f9ab085136d45899d38bb126958c3deda + +* Build plugin rewritten +* tap-i18n now fully support Meteor v0.9 +* Ready to be used with Cordova +* **New Features:** +* Server side internationalization is now supported. +* The template translation helper name (_) and the package translation function +name (__) are now customizable. +* Transparent bundling, no need for special procedures for deploying project +that uses tap-i18n. +* Language files and project-tap.i18n can now be located anywhere in the project tree. +* A project/package can now have more than one language file for the same +language. +* getLanguages() now works in both server and client. +* **Backward compatibility:** +* package i18n files now have to be added to both the client and the server +architectures, not only the client. +* The base language of a dialects are no longer added automatically as a supported +language. +* project-tap.i18n: languages_files_dir and build_files_path properties are now +obsolete. browser_path property renamed to cdn_path. +* package-tap.i18n: languages_files_dir is now obsolete. + +2014.08.30, Version 0.9.2, 742e44f659dfb7800d332bf4b2aa990e6f220d36 + +* Bugfix: Build plugin should consider projects with a *:i18n package as tap:i18n enabled +* Use tap:http-methods instead of raix:http-methods which isn't ready for v0.9.0 + +2014.08.30, Version 0.9.0, 118aa825e76165aac9df9f3153fbb8edc044a864 + +* tap-i18n is now tap:i18n +* Migrate to Meteor v0.9 + +2014.08.11, Version 0.8.0, a500ae5c5c6da2aa0ccd56bfe407bfa9c8a77b62 + +* [MINOR] package.js: only use single quotes to enclose strings +* Do not require having a file for the base language of a dialect +* Build plugin: make sure isString before removeFileTrailingSeparator + +2014.07.30, Version 0.7.0, 7c414420e65cb67a9e49896826542db1815a257c + +* Refactor build plugin. Fix a rare bug causing the proj base lang not to load +* build plugin: catch all build errors and use compileStep.error to report them +* Do not build/load supported languages with no translation files + +2014.06.26, Version 0.6.0, 7e9685ce75165a6a5998f6f4643490fc1e14c166 + +* Introduce {{languageTag}} +* README: add instuctions for deploying tap-i18n projects to *.meteor.com +* tap-i18n now works in Meteor bundles + +2014.06.14, Version 0.5.1, 71a9ad595e972998e16d7cbd60fed699127464c3 + +* Bugfix: Trigger buildFilesOnce for .i18n.json files for the os arch so + TAPi18n.conf will get set if there is no project-tap.i18n + +2014.06.13, Version 0.5.0, 0d7ea8c3ac8307b3d48efc6c8b80b1ce2dd1e8b1 + +* Unittests now work on mac +* Introduce TAPi18n.getLanguages() + +2014.06.12, Version 0.4.0, f583aa179b559d447519c61dcdb019f05a0b10a3 + +* README restructured +* Set lisence to: MIT + +2014.06.11, Version 0.3.0, ba328abf4e057b60c82cfb455d183fe1ff4605cd + +* Refresh the clients when .i18n.json files change +* bugfix: build files if i18n.json files change for case we don't have + project-tap.i18n to trigger build +* Show debug meesages only if globals.debug is true or env variable + TAP_I18N_DEBUG is "true" +* project-tap.i18n ignore default_browser_path if build_files_path is null +* Fixes to README + +2014.06.10, Version 0.2.0, 50bb1e9643e8233438ff7614bb79ca3dd575a3a8 + +* Implement project-level translations +* For enabled tap-i18n projects use the http-methods package as the default + mean for serving unified languages files instead of /public +* API change: Consider projects with no project-tap.i18n as tap-i18n enabled +* API change: By default, regard all the languages we find translations for as + supported_languages +* API change: No package-level default language - en is our fallback_language + everywhere +* Improve the unittesting framework +* Naming: Use TAPi18n and TAPi18next instead of TapI18n and TapI18next +* Bugfix: don't add an error object when throwing exception if error + +2014.05.22, Version 0.1.0, 676f50f0bea154596cacf44c34c352b09aa1d215 + +* tap-i18n first release diff --git a/packages/wekan-accounts-cas/LICENSE b/packages/wekan-tap-i18n/LICENSE similarity index 86% rename from packages/wekan-accounts-cas/LICENSE rename to packages/wekan-tap-i18n/LICENSE index c2d691582..8d0265994 100644 --- a/packages/wekan-accounts-cas/LICENSE +++ b/packages/wekan-tap-i18n/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2019 The Wekan Team +Copyright (c) 2014 TAPevents Asia Limited Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9,13 +9,13 @@ 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 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. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/wekan-tap-i18n/README.md b/packages/wekan-tap-i18n/README.md new file mode 100644 index 000000000..8219a6c58 --- /dev/null +++ b/packages/wekan-tap-i18n/README.md @@ -0,0 +1,808 @@ +# tap-i18n + +A comprehensive internationalization solution for Meteor + +### Internationalization for Meteor + +**tap-i18n** is a [Meteor](http://www.meteor.com) package that provides a comprehensive [i18n](http://www.i18nguy.com/origini18n.html) solution for Meteor apps and packages, +with the goal of standardizing the way package developers internationalize their +packages. + +[Watch a talk about tap:i18n & tap:i18n-db](https://www.youtube.com/watch?v=cu_dsoIc_0E) + +**Get involved in tap:i18n:** + +* [Mailing list](http://groups.google.com/d/forum/tap-i18n) +* [tap:i18n chat on Gitter](https://gitter.im/TAPevents/tap-i18n) +* [Roadmap](https://trello.com/b/w80JNkwf/tap-i18n-roadmap) +* [New features planning on Hackpad](https://hackpad.com/collection/DRzcZ7sBdZV) + +Developed by MeteorSpark [Professional Meteor Services](http://www.meteorspark.com)
for TAPevents  Leading Conference Technology. + +**Related Packages:** + +* Check [tap:i18n-db](https://github.com/TAPevents/tap-i18n-db) for Meteor collections internationalization. +* Check [tap:i18n-ui](https://github.com/TAPevents/tap-i18n-ui) for bootstrap based UI components for tap:i18n. +* Check [tap:i18n-bundler](https://github.com/TAPevents/i18n-bundler) for Cordova & static file deployments. + +**Users of tap-i18n v0.9** and below, read [tap:i18n v1.0 New Features & Backward Compatibility](https://github.com/TAPevents/tap-i18n/wiki/tap:i18n-v1.0-New-Feautres-&-Backward-Compatibility) and update your app to v1.0 . + +## Contents + +- [Key Features](#key-features) +- [Quickstart](#quickstart) +- [Documentation & Examples](#documentation--examples) + - [TAPi18n API](#tapi18n-api) + - [The tap-i18n Helpers](#the-tap-i18n-helpers) + - [Languages Tags and Translations Prioritization](#languages-tags-and-translations-prioritization) + - [Structure of Languages Files](#structure-of-languages-files) + - [Configuring tap-i18n](#configuring-tap-i18n) + - [Disabling tap-i18n](#disabling-tap-i18n) + - [Using tap-i18n in Cordova apps](#using-tap-i18n-in-cordova-apps) +- [Developing Packages](#developing-packages) + - [tap-i18n Two Work Modes](#tap-i18n-two-work-modes) + - [Setup tap-i18n](#setup-tap-i18n) + - [Package Level tap-i18n Functions](#package-level-tap-i18n-functions) + - [Using tap-i18n in Your Package Templates](#using-tap-i18n-in-your-package-templates) +- [Unit Testing](#unit-testing) +- [License](#license) +- [Credits](#credits) + +## Key Features + +### All Encompassing + +tap-i18n is designed in a way that distinguishes the role of the package developer, that is, making the package available in multiple languages, from the role of the app developer which is to translate the app, but more importantly, to manage the app's internationalization aspects, such as: setting the supported languages for the project, setting the client language, configuring CDNs for language files, and so on. + +### Readable Syntax + +```handlebars +
{{_ "sign_up"}}
+``` + +### Advanced i18n + +tap-i18n uses [i18next v1.11](http://i18next.github.io/i18next/) as its internationalization engine and exposes all its capabilities to the Meteor's templates - variables, dialects, count/context aware keys, and more. + +**client/messages.html** + +```handlebars + +``` + +**i18n/en.i18n.json** + +```json +{ + "inbox_status": "Hey, %s! You have received one new message today.", + "inbox_status_plural": "Hey, %s! You have received %s new messages today." +} +``` +See more examples below. + +### Transparent Namespacing + +You don't need to worry about domain prefixing or package conflicts when you translate your project or package. Behind the scenes we automatically generate scoped namespaces for you. + +### Ready to Scale + +* Translations are unified into a single JSON file per language that includes both package and project-level translations +* On-demand: translations are loaded only when they are needed +* 3rd Party CDN Support + + +## Quickstart + +**Step 1:** Install tap-i18n using meteor: + +```bash +$ meteor add tap:i18n +``` + +**Step 2:** Add translation helpers to your markup: + +**\*.html** + +```handlebars +
{{_ "hello"}}
+``` + +**Step 3:** Define translations in JSON or YAML format: + +**i18n/en.i18n.json** + +```json +{ "hello": "Hey there" } +``` + +**i18n/fr.i18n.json** + +```json +{ "hello": "Bonjour" } +``` + +**i18n/es.i18n.yml** + +```yaml +hello: Hola +``` + +Translations files should end with lang_tag.i18n.json/yml. + +You can split translations of a certain language to multiple files, we ignore +the prefixed text, e.g., we add the translations of menu.en.i18n.json in the +same way we add those of en.i18n.json . + +You can put languages files anywhere in your project tree, as long as they are +common to both your server and client - **do not put languages files under +/client, /server or /public**. + +Note: Languages files have to be saved in utf-8 encoding. + +**Step 4:** Initiate the client language on startup (optional) + +If you want the client to be served by a specific language on startup + +Assuming that you have a function getUserLanguage() that returns the language +for tag for the current user. + +```javascript +getUserLanguage = function () { + // Put here the logic for determining the user language + + return "fr"; +}; + +if (Meteor.isClient) { + Meteor.startup(function () { + Session.set("showLoadingIndicator", true); + + TAPi18n.setLanguage(getUserLanguage()) + .done(function () { + Session.set("showLoadingIndicator", false); + }) + .fail(function (error_message) { + // Handle the situation + console.log(error_message); + }); + }); +} +``` + +* If you won't set a language on startup your project will be served in the + fallback language: English +* You probably want to show a loading indicator until the language is ready (as + shown in the example), otherwise the templates in your projects will be in + English until the language will be ready + +## Documentation & Examples + +### TAPi18n API + +**TAPi18n.setLanguage(language\_tag) (Client)** + +Sets the client's translation language. + +Returns a jQuery deferred object that resolves if the language load +succeed and fails otherwise. + +**Notes:** + + * language\_tag has to be a supported Language. + * jQuery deferred docs: [jQuery Deferred](http://api.jquery.com/jQuery.Deferred/) + +**TAPi18n.getLanguage() (Client)** + +Returns the tag of the client's current language or null if +tap-i18n is not installed. + +If inside a reactive computation, invalidate the computation the next time the +client language get changed (by TAPi18n.setLanguage) + +**TAPi18n.getLanguages() (Anywhere)** + +Returns an object with all the supported languages and their names. + +A language is considred supported if it is in the supported_languages array of +the project-tap.i18n json. If supported_languages is null or not defined in +project-tap.i18n we consider all the languages we find *.i18n.json/yml files to as +supported. + +The returned object is in the following format: + +```javascript +{ + 'en': { + 'name':'English', // Local name + 'en':'English' // English name + }, + 'zh': { + 'name':'中文' // Local name + 'en':'Chinese' // English name + } + . + . + . +} +``` + +**TAPi18n.__(key, options, lang_tag=null) (Anywhere)** + +*If `lang_tag` is null:* + +Translates key to the current client's language. If inside a reactive +computation, invalidate the computation the next time the client language get +changed (by TAPi18n.setLanguage). + +*Otherwise:* + +Translates key to lang_tag. if you use `lang_tag` you should use `__` in a +reactive computation since the string will be translated to the current client +language if a translator to lang_tag is not ready in the client (if called for +the first time with that lang_tag, or until language data load from the server +finishes) and will get invalidated (trigger reactivity) when the translator to +that lang_tag is ready to be used to translate the key. + +Using `i18next.t` `lng` option or `lang`, which we made as alias to `lang` in +tap:i18n, is equivalent to setting the `lang_tag` attribute. + +The function is a proxy to the i18next.t() method. +Refer to the [documentation of i18next.t()](http://i18next.github.io/i18next/pages/doc_features.html) +to learn about its possible options. (Make sure you refer to i18next v1.11 documentation and not v2) + +**On the server**, TAPi18n.__ is not a reactive resource. You have to specify +the language tag you want to translate the key to. + +**TAPi18n.loadTranslations(translations, namespace="project") (Anywhere)** + +Use *translations* in addition or instead of the translations defined in the +i18n.json files. Translations defined by loadTranslations will have priority +over those defined in language files (i18n.json) of *namespace* (the project, +or package name). + +To enjoy [the benefits of tap:i18n](#key-features), you should use language +files to internationalize your project whenever you can. + +Legitimate cases for *loadTranslations* are: + +* Allowing users to change the project translations +* Changing translations of 3rd party packages that you don't want to fork (see + the Note below). + +Example: + +```javascript +TAPi18n.loadTranslations( + { + es: { + meteor_status_waiting: "Desconectado" + }, + fr: { + meteor_status_failed: "La connexion au serveur a échoué" + } + }, + "francocatena:status" +); +``` + +**Arguments:** + +* `translations`: An object of the following format: + +```javascript +{ + 'lang-tag': { + 'translation-key1': 'translation', + 'translation-key2': 'translation', + ... + }, + ... +} +``` + +* `namespace="project"`: The namespace you want to add the translations to. by + default translations are added to the project namespace, if you want to + change a package translation use the package name as the namespace like the + above example. + +**Notes:** + +* **Adding support to a new language in your app:** You can't use + *addTranslations* in order to add support to a new language, that is, to allow + users to change the interface language of the app to that language. In order + to start support a new language in your app, you'll have to either add a + language file to that language (*.i18n.json file) or add that languages to your + project-tap.i18n file. + +* **Translating a package that uses tap:i18n to another language**: If you want + to add a new language to a 3rd party package (and you can't get it's owner to + merge your pull request) consider introducing a "translation" package in which + package-tap.i18n has the "namespace" options set to the package you are + translating. That way you can translate with languages files instead of + *addTranslations* and share your translation package with others. + +### The tap-i18n Helpers + +### The \_ Helper + +To use tap-i18n to internationalize your templates you can use the \_ helper +that we set on the project's templates and on packages' templates for packages +that uses tap-i18n: + + {{_ "key" "sprintf_arg1" "sprintf_arg2" ... op1="option-value" op2="option-value" ... }} + +**You can customize the helper name, see "Configuring tap-i18n" section.** + +The translation files that will be used to translate key depends on the +template from which it is being used: +* If the helper is being used in a template that belongs to a package that uses + tap-i18n we'll always look for the translation in that package's translation + files. +* If the helper is being used in one of the project's templates we'll look for + the translation in the project's translation files (tap-i18n has to be + installed of course). + +**Usage Examples:** + +Assuming the client language is en. + +**Example 1:** Simple key: + + en.i18n.json: + ------------- + { + "click": "Click Here", + "html_key": "BOLD" + } + + page.html: + ---------- + + + output: + ------- + Click Here + BOLD + +**Example 2:** Simple key specific language: + + en.i18n.json: + ------------- + { + "click": "Click Here" + } + + fr.i18n.json: + ------------- + { + "click": "Cliquez Ici" + } + + page.html (lng and lang options are the same in tap:i18n you can use both): + ---------- + + + + + output: + ------- + Cliquez Ici + +**Example 3:** Sprintf: + + en.i18n.json: + ------------- + { + "hello": "Hello %s, your last visit was on: %s" + } + + page.html: + ---------- + + + output: + ------- + Hello Daniel, your last visit was on: 2014-05-22 + +**Example 4:** Named variables and sprintf: + + en.i18n.json: + ------------- + { + "hello": "Hello __user_name__, your last visit was on: %s" + } + + page.html: + ---------- + + + output: + ------- + Hello Daniel, your last visit was on: 2014-05-22 + +**Note:** Named variables have to be after all the sprintf parameters. + +**Example 5:** Named variables, sprintf, singular/plural: + + en.i18n.json: + ------------- + { + "inbox_status": "__username__, You have a new message (inbox last checked %s)", + "inbox_status_plural": "__username__, You have __count__ new messages (last checked %s)" + } + + page.html: + ---------- + + + output: + ------- + Daniel, You have a new message (inbox last checked 2014-05-22) + Chris, You have 4 new messages (last checked 2014-05-22) + +**Example 6:** Singular/plural, context: + + en.i18n.json: + ------------- + { + "actors_count": "There is one actor in the movie", + "actors_count_male": "There is one actor in the movie", + "actors_count_female": "There is one actress in the movie", + "actors_count_plural": "There are __count__ actors in the movie", + "actors_count_male_plural": "There are __count__ actors in the movie", + "actors_count_female_plural": "There are __count__ actresses in the movie", + } + + page.html: + ---------- + + + output: + ------- + There is one actor in the movie + There is one actor in the movie + There is one actress in the movie + There are 2 actors in the movie + There are 2 actors in the movie + There are 2 actresses in the movie + +* Refer to the [documentation of i18next.t() v1.11](http://i18next.github.io/i18next/pages/doc_features.html) + to learn more about its possible options. (Make sure you refer to i18next v1.11 documentation and not v2) +* The translation will get updated automatically after calls to + TAPi18n.setLanguage(). + +### More helpers + +**{{languageTag}}:** + +The {{languageTag}} helper calls TAPi18n.getLanguage(). + +It's useful when you need to load assets depending on the current language, for +example: + +```handlebars + +``` + +### Languages Tags and Translations Prioritization + +We use the [IETF language tag system](http://en.wikipedia.org/wiki/IETF_language_tag) +for languages tagging. With it developers can refer to a certain language or +pick one of its dialects. + +Example: A developer can either refer to English in general using: "en" or to +use the Great Britain dialect with "en-GB". + +**If tap-i18n is install** we'll attempt to look for a translation of a certain +string in the following order: +* Language dialect, if specified ("pt-BR") +* Base language ("pt") +* Base English ("en") + +**Notes:** + +* We currently support only one dialect level. e.g. nan-Hant-TW is not + supported. +* "en-US" is the dialect we use for the base English translations "en". +* If tap-i18n is not installed, packages will be served in English, the fallback language. + +### Structure of Languages Files + +Languages files should be named: arbitrary.text.lang_tag.i18n.json . e.g., en.i18n.json, menu.pt-BR.i18n.json. + +You can have more than one file for the same language. + +You can put languages files anywhere in your project tree, as long as they are +common to both your server and client - **do not put languages files under +/client, /server or /public**. + +Example for languages files: + + en.i18n.json + { + "sky": "Sky", + "color": "Color" + } + + pt.i18n.json + { + "sky": "Céu", + "color": "Cor" + } + + fr.i18n.json + { + "sky": "Ciel" + } + + en-GB.i18n.json + { + "color": "Colour" + } + +* Do not use colons and periods (see note below) in translation keys. +* To avoid translation bugs all the keys in your package must be translated to + English ("en") which is the fallback language we use if tap-i18n is not installed, + or when we can't find a translation for a certain key. +* In the above example there is no need to translate "sky" in en-GB which is the + same in en. Remember that thanks to the Languages Tags and Translations + Prioritization (see above) if a translation for a certain key is the same for a + language and one of its dialects you don't need to translate it again in the + dialect file. +* The French file above have no translation for the color key above, it will + fallback to English. +* Check [i18next features documentation](http://i18next.github.io/i18next/pages/doc_features.html) for + more advanced translations structures you can use in your JSONs files (Such as + variables, plural form, etc.). (Make sure you refer to i18next v1.11 documentation and not v2) + +#### A note about dot notation + +Note that `{_ "foo.bar"}` will be looked under `{foo: {bar: "Hello World"}}`, and not under `"foo.bar"`. + +### Configuring tap-i18n + +To configure tap-i18n add to it a file named **project-tap.i18n**. + +This JSON can have the following properties. All of them are optional. The values bellow +are the defaults. + + project-root/project-tap.i18n + ----------------------------- + { + "helper_name": "_", + "supported_languages": null, + "i18n_files_route": "/tap-i18n", + "cdn_path": null, + "preloaded_langs": [] + } + +Options: + +**helper\_name:** the name for the templates' translation helper. + +**supported\_languages:** A list of languages tags you want to make available on +your project. If null, all the languages we'll find translation files for, in the +project, will be available. + +**build\_files\_path:** Can be an absolute path or relative to the project's root. If you change this value we assume you want to serve the files yourself (via cdn, or by other means) so we won't initiate the tap-i18n's built-in files server. Therefore if you set build\_files\_path you **must** set the browser\_path. + +**i18n\_files\_route:** The route in which the tap-i18n resources will be available in the project. + +**cdn\_path:** An alternative path from which you want tap-i18n resources to be loaded. Example: "http://cdn.example.com/tap-i18n". + +**preloaded_langs:** An array of languages tags. If isn't empty, a single synchronous ajax requrest will load the translation strings for all the languages tags listed. If you want to load all the supported languages set preloaded_langs to `["*"]` (`"*"` must be the first item of the array, the rest of the array will be ignored. `["zh-*"]` won't work). + +**Notes:** + +* We use AJAX to load the languages files so you'll have to set CORS on your CDN. + +### Disabling tap-i18n + +**Step 1:** Remove tap-i18n method calls from your project. + +**Step 2:** Remove tap-i18n package + +```bash +$ meteor remove tap:i18n +``` + +### Using tap-i18n in Cordova apps + +In order to use tap-i18n in a Cordova app you must set the `--server` flag +to your server's root url when building your project. + +```bash +$ meteor build --server="http://www.your-site-domain.com" +``` + +If your app should work when the user is offline, install the [tap:i18n-bundler](https://atmospherejs.com/tap/i18n-bundler) package and follow [its instructions](https://github.com/TAPevents/i18n-bundler#usage). + +## Developing Packages + +Though the decision to translate a package and to internationalize it is a +decision made by the **package** developer, the control over the +internationalization configurations are done by the **project** developer and +are global to all the packages within the project. + +Therefore if you wish to use tap-i18n to internationalize your Meteor +package your docs will have to refer projects developers that will use it to +the "Usage - Project Developers" section above to enable internationalization. +If the project developer won't enable tap-i18n your package will be served in +the fallback language English. + +### tap-i18n Two Work Modes + +tap-i18n can be used to internationalize projects and packages, but its +behavior is determined by whether or not it's installed on the project level. +We call these two work modes: *enabled* and *disabled*. + +When tap-i18n is disabled we don't unify the languages files that the packages +being used by the project uses, and serve all the packages in the fallback +language (English) + +### Setup tap-i18n + +In order to use tap-i18n to internationalize your package: + +**Step 1:** Add the package-tap.i18n configuration file: + +You can use empty file or an empty JSON object if you don't need to change them. + +The values below are the defaults. + + package_dir/package-tap.i18n + ---------------------------- + { + // The name for the translation function that + // will be available in package's namespace. + "translation_function_name": "__", + + // the name for the package templates' translation helper + "helper_name": "_", + + // directory for the translation files (without leading slash) + "languages_files_dir": "i18n", + + // tap:i18n automatically separates the translation strings of each package to a + // namespace dedicated to that package, which is used by the package's translation + // function and helper. Use the namespace option to set a custom namespace for + // the package. By using the name of another package you can use your package to + // add to that package or modify its translations. You can also set the namespace to + // "project" to add translations that will be available in the project level. + "namespace": null + } + +**Step 2:** Create your languages\_files\_dir: + +Example for the default languages\_files\_dir path and its structure: + + . + |--package_name + |----package.js + |----package-tap.i18n + |----i18n # Should be the same path as languages_files_dir option above + |------en.i18n.json + |------fr.i18n.json + |------pt.i18n.json + |------pt-BR.i18n.json + . + . + . + +NOTE: the file for the fallback language (`en.i18n.json`) **must** exist (it may be empty though). + +The leanest set up (for instance in a private package, where you keep the translations at the project level) is two empty files: `package-tap.i18n` and `i18n/en.i18n.json`. + +**Step 3:** Setup your package.js: + +Your package's package.js should be structured as follow: + + Package.on_use(function (api) { + api.use(["tap:i18n@1.0.7"], ["client", "server"]); + + . + . + . + + // You must load your package's package-tap.i18n before you load any + // template + api.add_files("package-tap.i18n", ["client", "server"]); + + // Templates loads (if any) + + // List your languages files so Meteor will watch them and rebuild your + // package as they change. + // You must load the languages files after you load your templates - + // otherwise the templates won't have the i18n capabilities (unless + // you'll register them with tap-i18n yourself, see below). + api.add_files([ + "i18n/en.i18n.json", + "i18n/fr.i18n.json", + "i18n/pt.i18n.json", + "i18n/pt-br.i18n.json" + ], ["client", "server"]); + }); + +Note: en, which is the fallback language, is the only language we integrate +into the clients bundle. All the other languages files will be loaded only +to the server bundle and will be served as part of the unified languages files, +that contain all the project's translations. + +### Package Level tap-i18n Functions + +The following functions are added to your package namespace by tap-i18n: + +**\_\_("key", options, lang_tag) (Anywhere)** + +Read documenation for `TAPi18n.__` above. + +**On the server**, TAPi18n.__ is not a reactive resource. You have to specify +the language tag you want to translate the key to. + +You can use package-tap.i18n to change the name of this function. + +**registerI18nHelper(template\_name) (Client)** + +**registerTemplate(template\_name) (Client) [obsolete alias, will be removed in future versions]** + +Register the \_ helper that maps to the \_\_ function for the +template with the given name. + +**Important:** As long as you load the package templates after you add package-tap.i18n +and before you start adding the languages files you won't need to register templates yourself. + +### Using tap-i18n in Your Package Templates + +See "The tap-i18n helper" section above. + +## Unit Testing + +See /unittest/test-packages/README.md . + +## License + +MIT + +## Author + +[Daniel Chcouri](http://theosp.github.io/) + +## Contributors + +* [Chris Hitchcott](https://github.com/hitchcott/) +* [Kevin Iamburg](http://www.slickdevelopment.com) +* [Abe Pazos](https://github.com/hamoid/) +* [@karfield](https://github.com/karfield/) +* [@nscarcella](https://github.com/nscarcella/) +* [@mpowaga](https://github.com/mpowaga/) + +## Credits + +* [i18next v1.11](http://i18next.github.io/i18next/) +* [simple-schema](https://github.com/aldeed/meteor-simple-schema) +* [http-methods](https://github.com/CollectionFS/Meteor-http-methods) diff --git a/packages/wekan-tap-i18n/TODO b/packages/wekan-tap-i18n/TODO new file mode 100644 index 000000000..edc654412 --- /dev/null +++ b/packages/wekan-tap-i18n/TODO @@ -0,0 +1,3 @@ +TODO: + +* Add memcache layer to the integral file server diff --git a/packages/wekan-tap-i18n/lib/globals.js b/packages/wekan-tap-i18n/lib/globals.js new file mode 100644 index 000000000..bc36ed4ca --- /dev/null +++ b/packages/wekan-tap-i18n/lib/globals.js @@ -0,0 +1,10 @@ +// The globals object will be accessible to the build plugin, the server and +// the client + +globals = { + fallback_language: "en", + langauges_tags_regex: "([a-z]{2})(-[A-Z]{2})?", + project_translations_domain: "project", + browser_path: "/tap-i18n", + debug: false +}; diff --git a/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee b/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee new file mode 100644 index 000000000..e3677703f --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee @@ -0,0 +1,23 @@ +# Note: same compiler can be used to compile more then one package (at least in v0.9.x) + +share.compiler_configuration = + fallback_language: globals.fallback_language + packages: [] # Each time we compile package-tap.i18n we push "package_name:arch" to this array + templates_registered_for: [] # Each time we register a template we push "package_name:arch" to this array + default_project_conf_inserted_for: [] # Keeps track of the archs we've inserted the default project conf for. + # Default project conf is inserted by the *.i18.json compiler to be used + # in case the project has no project-tap.i18n + project_tap_i18n_loaded_for: [] # Keeps track of the archs we've loaded project_tap_i18n for + + tap_i18n_input_files: [] + registerInputFile: (compileStep) -> + input_file = "#{compileStep.arch}:#{compileStep._fullInputPath}" + if input_file in @tap_i18n_input_files + # A new build cycle + @packages = [] + @templates_registered_for = [] + @default_project_conf_inserted_for = [] + @project_tap_i18n_loaded_for = [] + @tap_i18n_input_files = [] + + @tap_i18n_input_files.push(input_file) diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee new file mode 100644 index 000000000..37d6f3027 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee @@ -0,0 +1,18 @@ +path = Npm.require "path" + +compilers = share.compilers + +Plugin.registerSourceHandler "i18n", (compileStep) -> + # Starting from Meteor v1.2 registerSourceHandler doesn't + # accept filenames as handlers. + # See: https://github.com/meteor/meteor/issues/3985 + # and: https://github.com/TAPevents/tap-i18n/issues/113 + # Below is a workaround until we refactor for v1.2 new + # build plugin API. + file_name = _.last compileStep.inputPath.split(path.sep) + + if file_name == "package-tap.i18n" + compilers.package_tap_i18n(compileStep) + + if file_name == "project-tap.i18n" + compilers.project_tap_i18n(compileStep) diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee new file mode 100644 index 000000000..86199b861 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee @@ -0,0 +1,124 @@ +path = Npm.require "path" + +helpers = share.helpers +compilers = share.compilers +compiler_configuration = share.compiler_configuration + +compilers.generic_compiler = (extension, helper) -> (compileStep) -> + compiler_configuration.registerInputFile(compileStep) + input_path = compileStep._fullInputPath + + language = path.basename(input_path).split(".").slice(0, -2).pop() + if _.isUndefined(language) or _.isEmpty(language) + compileStep.error + message: "Language-tag is not specified for *.i18n.`#{extension}' file: `#{input_path}'", + sourcePath: input_path + return + + if not RegExp("^#{globals.langauges_tags_regex}$").test(language) + compileStep.error + message: "Can't recognise '#{language}' as a language-tag: `#{input_path}'", + sourcePath: input_path + return + + translations = helper input_path, compileStep + + package_name = if helpers.isPackage(compileStep) then compileStep.packageName else globals.project_translations_domain + output = + """ + var _ = Package.underscore._, + package_name = "#{package_name}", + namespace = "#{package_name}"; + + if (package_name != "#{globals.project_translations_domain}") { + namespace = TAPi18n.packages[package_name].namespace; + } + + """ + + # only for project + if not helpers.isPackage(compileStep) + if /^(client|server)/.test(compileStep.inputPath) + compileStep.error + message: "Languages files should be common to the server and the client. Do not put them under /client or /server .", + sourcePath: input_path + return + + # add the language names to TAPi18n.languages_names + language_name = [language, language] + if language_names[language]? + language_name = language_names[language] + + if language != globals.fallback_language + # the name for the fallback_language is part of the getProjectConfJs()'s output + output += + """ + TAPi18n.languages_names["#{language}"] = #{JSON.stringify language_name}; + + """ + + # If this is a project but project-tap.i18n haven't compiled yet add default project conf + # for case there is no project-tap.i18n defined in this project. + # Reminder: we don't require projects to have project-tap.i18n + if not(helpers.isDefaultProjectConfInserted(compileStep)) and \ + not(helpers.isProjectI18nLoaded(compileStep)) + output += share.getProjectConfJs(share.project_i18n_schema.clean {}) # defined in project-tap.i18n.coffee + + helpers.markDefaultProjectConfInserted(compileStep) + + + # if fallback_language -> integrate, otherwise add to TAPi18n.translations if server arch. + if language == compiler_configuration.fallback_language + output += + """ + // integrate the fallback language translations + translations = {}; + translations[namespace] = #{JSON.stringify translations}; + TAPi18n._loadLangFileObject("#{compiler_configuration.fallback_language}", translations); + + """ + + if compileStep.archMatches "os" + if language != compiler_configuration.fallback_language + output += + """ + if(_.isUndefined(TAPi18n.translations["#{language}"])) { + TAPi18n.translations["#{language}"] = {}; + } + + if(_.isUndefined(TAPi18n.translations["#{language}"][namespace])) { + TAPi18n.translations["#{language}"][namespace] = {}; + } + + _.extend(TAPi18n.translations["#{language}"][namespace], #{JSON.stringify translations}); + + """ + + output += + """ + TAPi18n._registerServerTranslator("#{language}", namespace); + + """ + + # register i18n helper for templates, only once per web arch, only for packages + if helpers.isPackage(compileStep) + if compileStep.archMatches("web") and helpers.getCompileStepArchAndPackage(compileStep) not in compiler_configuration.templates_registered_for + output += + """ + var package_templates = _.difference(_.keys(Template), non_package_templates); + + for (var i = 0; i < package_templates.length; i++) { + var package_template = package_templates[i]; + + registerI18nTemplate(package_template); + } + + """ + compiler_configuration.templates_registered_for.push helpers.getCompileStepArchAndPackage(compileStep) + + output_path = compileStep.rootOutputPath + compileStep.inputPath.replace new RegExp("`#{extension}'$"), "js" + compileStep.addJavaScript + path: output_path, + sourcePath: input_path, + data: output, + bare: false \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee new file mode 100644 index 000000000..fe65e24a0 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee @@ -0,0 +1,4 @@ +helpers = share.helpers +compilers = share.compilers +compilers.i18n_json = compilers.generic_compiler('json', helpers.loadJSON) +Plugin.registerSourceHandler "i18n.json", compilers.i18n_json \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee new file mode 100644 index 000000000..ec7e7f793 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee @@ -0,0 +1,4 @@ +helpers = share.helpers +compilers = share.compilers +compilers.i18n_yml = compilers.generic_compiler('yml', helpers.loadYAML) +Plugin.registerSourceHandler "i18n.yml", compilers.i18n_yml \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee new file mode 100644 index 000000000..45db1a679 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee @@ -0,0 +1,95 @@ +helpers = share.helpers +compilers = share.compilers +compiler_configuration = share.compiler_configuration + +schema = new SimpleSchema + translation_function_name: + type: String + defaultValue: "__" + label: "Translation Function Name" + optional: true + helper_name: + type: String + defaultValue: "_" + label: "Helper Name" + optional: true + namespace: + type: String + defaultValue: null + label: "Translations Namespace" + optional: true + +compilers.package_tap_i18n = (compileStep) -> + compiler_configuration.registerInputFile(compileStep) + input_path = compileStep._fullInputPath + + if helpers.isPackage(compileStep) + compileStep.error + message: "More than one package-tap.i18n found for package: #{compileStep.packageName}", + sourcePath: input_path + return + + if helpers.isProjectI18nLoaded(compileStep) + compileStep.error + message: "Can't compile package-tap.i18n if project-tap.i18n is present", + sourcePath: input_path + return + + if helpers.isDefaultProjectConfInserted(compileStep) + compileStep.error + message: "package-tap.i18n should be loaded before languages files (*.i18n.json)", + sourcePath: input_path + return + + helpers.markAsPackage(compileStep) + + package_tap_i18n = helpers.loadJSON input_path, compileStep + + if not package_tap_i18n? + package_tap_i18n = schema.clean {} + schema.clean package_tap_i18n + + try + check package_tap_i18n, schema + catch error + compileStep.error + message: "File `#{file_path}' is an invalid package-tap.i18n file (#{error})", + sourcePath: input_path + return + + package_name = compileStep.packageName + + if not package_tap_i18n.namespace? + package_tap_i18n.namespace = package_name + + namespace = package_tap_i18n.namespace + + package_i18n_js_file = + """ + TAPi18n.packages["#{package_name}"] = #{JSON.stringify(package_tap_i18n)}; + + // define package's translation function (proxy to the i18next) + #{package_tap_i18n.translation_function_name} = TAPi18n._getPackageI18nextProxy("#{namespace}"); + + """ + + if compileStep.archMatches "web" + package_i18n_js_file += + """ + // define the package's templates registrar + registerI18nTemplate = TAPi18n._getRegisterHelpersProxy("#{package_name}"); + registerTemplate = registerI18nTemplate; // XXX OBSOLETE, kept for backward compatibility will be removed in the future + + // Record the list of templates prior to package load + var _ = Package.underscore._; + non_package_templates = _.keys(Template); + + """ + + compileStep.addJavaScript + path: "package-i18n.js", + sourcePath: input_path, + data: package_i18n_js_file, + bare: false + +Plugin.registerSourceHandler "package-tap.i18n", compilers.package_tap_i18n \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee new file mode 100644 index 000000000..0187d7161 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee @@ -0,0 +1,122 @@ +helpers = share.helpers +compilers = share.compilers +compiler_configuration = share.compiler_configuration + +share.project_i18n_schema = schema = new SimpleSchema + helper_name: + type: String + defaultValue: "_" + label: "Helper Name" + optional: true + supported_languages: + type: [String] + label: "Supported Languages" + defaultValue: null + optional: true + i18n_files_route: + type: String + label: "Unified languages files path" + defaultValue: globals.browser_path + optional: true + preloaded_langs: + type: [String] + label: "Preload languages" + defaultValue: [] + optional: true + cdn_path: + type: String + label: "Unified languages files path on CDN" + defaultValue: null + optional: true + +getProjectConfJs = share.getProjectConfJs = (conf) -> + fallback_language_name = language_names[globals.fallback_language] + + project_conf_js = """ + TAPi18n._enable(#{JSON.stringify(conf)}); + TAPi18n.languages_names["#{globals.fallback_language}"] = #{JSON.stringify fallback_language_name}; + + """ + + # If we get a list of supported languages we must make sure that we'll have a + # language name for each one of its languages. + # + # Though languages names are added for every language we find i18n.json file + # for (by the i18n.json compiler). We shouldn't rely on the existence of + # *.i18n.json file for each supported language, because a language might be + # defined as supported even when it has no i18n.json files (it's especially + # true when tap:i18n is used with tap:i18n-db) + if conf.supported_languages? + for lang_tag in conf.supported_languages + if language_names[lang_tag]? + project_conf_js += """ + TAPi18n.languages_names["#{lang_tag}"] = #{JSON.stringify language_names[lang_tag]}; + + """ + + return project_conf_js + +compilers.project_tap_i18n = (compileStep) -> + compiler_configuration.registerInputFile(compileStep) + input_path = compileStep._fullInputPath + + if helpers.isPackage(compileStep) + compileStep.error + message: "Can't load project-tap.i18n in a package: #{compileStep.packageName}", + sourcePath: input_path + return + + if helpers.isProjectI18nLoaded(compileStep) + compileStep.error + message: "Can't have more than one project-tap.i18n", + sourcePath: input_path + return + + project_tap_i18n = helpers.loadJSON input_path, compileStep + + if not project_tap_i18n? + project_tap_i18n = schema.clean {} + schema.clean project_tap_i18n + + try + check project_tap_i18n, schema + catch error + compileStep.error + message: "File `#{file_path}' is an invalid project-tap.i18n file (#{error})", + sourcePath: input_path + return + + project_i18n_js_file = getProjectConfJs project_tap_i18n + + if compileStep.archMatches("web") and not _.isEmpty project_tap_i18n.preloaded_langs + preloaded_langs = "all" + if project_tap_i18n.preloaded_langs[0] != "*" + preloaded_langs = project_tap_i18n.preloaded_langs.join(",") + + project_i18n_js_file += + """ + $.ajax({ + type: 'GET', + url: "#{project_tap_i18n.i18n_files_route}/multi/#{preloaded_langs}.json", + dataType: 'json', + success: function(data) { + for (lang_tag in data) { + TAPi18n._loadLangFileObject(lang_tag, data[lang_tag]); + TAPi18n._loaded_languages.push(lang_tag); + } + }, + data: {}, + async: false + }); + + """ + + helpers.markProjectI18nLoaded(compileStep) + + compileStep.addJavaScript + path: "project-i18n.js", + sourcePath: input_path, + data: project_i18n_js_file, + bare: false + +Plugin.registerSourceHandler "project-tap.i18n", compilers.project_tap_i18n \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee new file mode 100644 index 000000000..6216e2839 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee @@ -0,0 +1 @@ +share.compilers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js b/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js new file mode 100644 index 000000000..43d72f450 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js @@ -0,0 +1,136 @@ +language_names = { + "af": ["Afrikaans","Afrikaans"], + "ak": ["Akan","Akan"], + "sq": ["Albanian","Shqip"], + "am": ["Amharic","አማርኛ"], + "ar": ["Arabic","العربية"], + "hy": ["Armenian","Հայերեն"], + "rup": ["Aromanian","Armãneashce"], + "as": ["Assamese","অসমীয়া"], + "az": ["Azerbaijani","Azərbaycan dili"], + "az-TR": ["Azerbaijani (Turkey)","Azərbaycan Türkcəsi"], + "ba": ["Bashkir","башҡорт теле"], + "eu": ["Basque","Euskara"], + "bel": ["Belarusian","Беларуская мова"], + "bn": ["Bengali","বাংলা"], + "bs": ["Bosnian","Bosanski"], + "bg": ["Bulgarian","Български"], + "mya": ["Burmese","ဗမာစာ"], + "ca": ["Catalan","Català"], + "bal": ["Catalan (Balear)","Català (Balear)"], + "zh": ["Chinese","中文"], + "zh-CN": ["Chinese (China)","简体中文"], + "zh-HK": ["Chinese (Hong Kong)","繁體中文(香港)"], + "zh-TW": ["Chinese (Taiwan)","繁體中文(台灣)"], + "co": ["Corsican","corsu"], + "hr": ["Croatian","Hrvatski"], + "cs": ["Czech","čeština‎"], + "da": ["Danish","Dansk"], + "nl": ["Dutch","Nederlands"], + "nl-BE": ["Dutch (Belgium)","Nederlands (België)"], + "en": ["English","English"], + "en-AU": ["English (Australia)","English (Australia)"], + "en-CA": ["English (Canada)","English (Canada)"], + "en-GB": ["English (UK)","English (UK)"], + "eo": ["Esperanto","Esperanto"], + "et": ["Estonian","Eesti"], + "fo": ["Faroese","føroyskt"], + "fi": ["Finnish","Suomi"], + "fr-BE": ["French (Belgium)","Français de Belgique"], + "fr": ["French (France)","Français"], + "fy": ["Frisian","Frysk"], + "fuc": ["Fulah","Pulaar"], + "gl": ["Galician","Galego"], + "ka": ["Georgian","ქართული"], + "de": ["German","Deutsch"], + "el": ["Greek","Ελληνικά"], + "gn": ["Guaraní","Avañe'ẽ"], + "haw": ["Hawaiian","Ōlelo Hawaiʻi"], + "haz": ["Hazaragi","هزاره گی"], + "he": ["Hebrew","עברית"], + "hi": ["Hindi","हिन्दी"], + "hu": ["Hungarian","Magyar"], + "is": ["Icelandic","Íslenska"], + "id": ["Indonesian","Bahasa Indonesia"], + "ga": ["Irish","Gaelige"], + "it": ["Italian","Italiano"], + "ja": ["Japanese","日本語"], + "jv": ["Javanese","Basa Jawa"], + "kn": ["Kannada","ಕನ್ನಡ"], + "kk": ["Kazakh","Қазақ тілі"], + "km": ["Khmer","ភាសាខ្មែរ"], + "rw": ["Kinyarwanda","Kinyarwanda"], + "ky": ["Kirghiz","кыргыз тили"], + "ko": ["Korean","한국어"], + "ckb": ["Kurdish (Sorani)","كوردی‎"], + "lo": ["Lao","ພາສາລາວ"], + "lv": ["Latvian","latviešu valoda"], + "li": ["Limburgish","Limburgs"], + "lt": ["Lithuanian","Lietuvių kalba"], + "lb": ["Luxembourgish","Lëtzebuergesch"], + "mk": ["Macedonian","македонски јазик"], + "mg": ["Malagasy","Malagasy"], + "ms": ["Malay","Bahasa Melayu"], + "ml": ["Malayalam","മലയാളം"], + "mr": ["Marathi","मराठी"], + "xmf": ["Mingrelian","მარგალური ნინა"], + "mn": ["Mongolian","Монгол"], + "me": ["Montenegrin","Crnogorski jezik"], + "ne": ["Nepali","नेपाली"], + "nb": ["Norwegian (Bokmål)","Norsk bokmål"], + "nn": ["Norwegian (Nynorsk)","Norsk nynorsk"], + "os": ["Ossetic","Ирон"], + "ps": ["Pashto","پښتو"], + "fa": ["Persian","فارسی"], + "fa-AF": ["Persian (Afghanistan)","فارسی (افغانستان"], + "pl": ["Polish","Polski"], + "pt-BR": ["Portuguese (Brazil)","Português do Brasil"], + "pt": ["Portuguese (Portugal)","Português"], + "pa": ["Punjabi","ਪੰਜਾਬੀ"], + "rhg": ["Rohingya","Rohingya"], + "ro": ["Romanian","Română"], + "ru": ["Russian","Русский"], + "rue": ["Rusyn","Русиньскый"], + "sah": ["Sakha","Sakha"], + "sa-IN": ["Sanskrit","भारतम्"], + "srd": ["Sardinian","sardu"], + "gd": ["Scottish Gaelic","Gàidhlig"], + "sr": ["Serbian","Српски језик"], + "sd": ["Sindhi","سندھ"], + "si": ["Sinhala","සිංහල"], + "sk": ["Slovak","Slovenčina"], + "sl": ["Slovenian","slovenščina"], + "so": ["Somali","Afsoomaali"], + "azb": ["South Azerbaijani","گؤنئی آذربایجان"], + "es-AR": ["Spanish (Argentina)","Español de Argentina"], + "es-CL": ["Spanish (Chile)","Español de Chile"], + "es-CO": ["Spanish (Colombia)","Español de Colombia"], + "es-MX": ["Spanish (Mexico)","Español de México"], + "es-PE": ["Spanish (Peru)","Español de Perú"], + "es-PR": ["Spanish (Puerto Rico)","Español de Puerto Rico"], + "es": ["Spanish (Spain)","Español"], + "es-VE": ["Spanish (Venezuela)","Español de Venezuela"], + "su": ["Sundanese","Basa Sunda"], + "sw": ["Swahili","Kiswahili"], + "sv": ["Swedish","Svenska"], + "gsw": ["Swiss German","Schwyzerdütsch"], + "tl": ["Tagalog","Tagalog"], + "tg": ["Tajik","тоҷикӣ"], + "ta": ["Tamil","தமிழ்"], + "ta-LK": ["Tamil (Sri Lanka)","தமிழ்"], + "tt": ["Tatar","Татар теле"], + "te": ["Telugu","తెలుగు"], + "th": ["Thai","ไทย"], + "bo": ["Tibetan","བོད་སྐད"], + "tir": ["Tigrinya","ትግርኛ"], + "tr": ["Turkish","Türkçe"], + "tuk": ["Turkmen","Türkmençe"], + "ua": ["Ukrainian","Українська"], + "ug": ["Uighur","Uyƣurqə"], + "uk": ["Ukrainian","Українська"], + "ur": ["Urdu","اردو"], + "uz": ["Uzbek","O‘zbekcha"], + "vi": ["Vietnamese","Tiếng Việt"], + "wa": ["Walloon","Walon"], + "cy": ["Welsh","Cymraeg"] +}; diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee new file mode 100644 index 000000000..0ab5a6f58 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee @@ -0,0 +1,23 @@ +compiler_configuration = share.compiler_configuration + +_.extend share.helpers, + getCompileStepArchAndPackage: (compileStep) -> + "#{compileStep.packageName}:#{compileStep.arch}" + + markAsPackage: (compileStep) -> + compiler_configuration.packages.push @.getCompileStepArchAndPackage(compileStep) + + isPackage: (compileStep) -> + @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.packages + + markProjectI18nLoaded: (compileStep) -> + compiler_configuration.project_tap_i18n_loaded_for.push @.getCompileStepArchAndPackage(compileStep) + + isProjectI18nLoaded: (compileStep) -> + @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.project_tap_i18n_loaded_for + + markDefaultProjectConfInserted: (compileStep) -> + compiler_configuration.default_project_conf_inserted_for.push @.getCompileStepArchAndPackage(compileStep) + + isDefaultProjectConfInserted: (compileStep) -> + @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.default_project_conf_inserted_for diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee new file mode 100644 index 000000000..74aff3ad7 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee @@ -0,0 +1 @@ +share.helpers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee new file mode 100644 index 000000000..6ead9c015 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee @@ -0,0 +1,25 @@ +fs = Npm.require 'fs' +JSON.minify = JSON.minify || Npm.require("node-json-minify") + +# loads a json from file_path +# +# returns undefined if file doesn't exist null if file is empty, parsed content otherwise +_.extend share.helpers, + loadJSON: (file_path, compileStep=null) -> + try # use try/catch to avoid the additional syscall to fs.existsSync + fstats = fs.statSync file_path + catch + return undefined + + if fstats.size == 0 + return null + + try + content = JSON.parse(JSON.minify(fs.readFileSync(file_path, "utf8"))) + catch error + if compileStep? + compileStep.error + message: "Can't load `#{file_path}' JSON", + sourcePath: compileStep._fullInputPath + + throw new Error "Can't load `#{file_path}' JSON" diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee new file mode 100644 index 000000000..77f898c33 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee @@ -0,0 +1,25 @@ +fs = Npm.require 'fs' +YAML = Npm.require 'yamljs' + +# loads a yml from file_path +# +# returns undefined if file doesn't exist null if file is empty, parsed content otherwise +_.extend share.helpers, + loadYAML: (file_path, compileStep=null) -> + try # use try/catch to avoid the additional syscall to fs.existsSync + fstats = fs.statSync file_path + catch + return undefined + + if fstats.size == 0 + return null + + try + content = YAML.load(file_path) + catch error + if compileStep? + compileStep.error + message: "Can't load `#{file_path}' YAML", + sourcePath: compileStep._fullInputPath + + throw new Error "Can't load `#{file_path}' YAML" diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee new file mode 100644 index 000000000..5437cb885 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee @@ -0,0 +1,198 @@ +_.extend TAPi18n.prototype, + _languageSpecificTranslators: null + _languageSpecificTranslatorsTrackers: null + + _getLanguageFilePath: (lang_tag) -> + if not @_enabled() + return null + + path = if @.conf.cdn_path? then @.conf.cdn_path else @.conf.i18n_files_route + path = path.replace /\/$/, "" + if Meteor.isCordova and path[0] == "/" + path = Meteor.absoluteUrl().replace(/\/+$/, "") + path + + "#{path}/#{lang_tag}.json" + + _loadLanguage: (languageTag) -> + # Load languageTag and its dependencies languages to TAPi18next if we + # haven't loaded them already. + # + # languageTag dependencies languages are: + # * The base language if languageTag is a dialect. + # * The fallback language (en) if we haven't loaded it already. + # + # Returns a deferred object that resolves with no arguments if all files + # loaded successfully to TAPi18next and rejects with array of error + # messages otherwise + # + # Example: + # TAPi18n._loadLanguage("pt-BR") + # .done(function () { + # console.log("languageLoaded successfully"); + # }) + # .fail(function (messages) { + # console.log("Couldn't load languageTag", messages); + # }) + # + # The above example will attempt to load pt-BR, pt and en + + dfd = new $.Deferred() + + if not @_enabled() + return dfd.reject "tap-i18n is not enabled in the project level, check tap-i18n README" + + project_languages = @_getProjectLanguages() + + if languageTag in project_languages + if languageTag not in @_loaded_languages + loadLanguageTag = => + jqXHR = $.getJSON(@_getLanguageFilePath(languageTag)) + + jqXHR.done (data) => + @_loadLangFileObject(languageTag, data) + + @_loaded_languages.push languageTag + + dfd.resolve() + + jqXHR.fail (xhr, error_code) => + dfd.reject("Couldn't load language '#{languageTag}' JSON: #{error_code}") + + directDependencyLanguageTag = if "-" in languageTag then languageTag.replace(/-.*/, "") else fallback_language + + # load dependency language if it is part of the project and not the fallback language + if languageTag != fallback_language and directDependencyLanguageTag in project_languages + dependencyLoadDfd = @_loadLanguage directDependencyLanguageTag + + dependencyLoadDfd.done => + # All dependencies loaded successfully + loadLanguageTag() + + dependencyLoadDfd.fail (message) => + dfd.reject("Loading process failed since dependency language + '#{directDependencyLanguageTag}' failed to load: " + message) + else + loadLanguageTag() + else + # languageTag loaded already + dfd.resolve() + else + dfd.reject(["Language #{languageTag} is not supported"]) + + return dfd.promise() + + _registerHelpers: (package_name, template) -> + if package_name != globals.project_translations_domain + tapI18nextProxy = @_getPackageI18nextProxy(@packages[package_name].namespace) + else + tapI18nextProxy = @_getPackageI18nextProxy(globals.project_translations_domain) + + underscore_helper = (key, args...) -> + options = (args.pop()).hash + if not _.isEmpty(args) + options.sprintf = args + + tapI18nextProxy(key, options) + + # template specific helpers + if package_name != globals.project_translations_domain + # {{_ }} + if Template[template]? and Template[template].helpers? + helpers = {} + helpers[@packages[package_name].helper_name] = underscore_helper + Template[template].helpers(helpers) + + # global helpers + else + # {{_ }} + UI.registerHelper @conf.helper_name, underscore_helper + + # {{languageTag}} + UI.registerHelper "languageTag", () => @getLanguage() + + return + + _getRegisterHelpersProxy: (package_name) -> + # A proxy to _registerHelpers where the package_name is fixed to package_name + (template) => + @_registerHelpers(package_name, template) + + _prepareLanguageSpecificTranslator: (lang_tag) -> + dfd = (new $.Deferred()).resolve().promise() + + if lang_tag of @_languageSpecificTranslatorsTrackers + return dfd + + @_languageSpecificTranslatorsTrackers[lang_tag] = new Tracker.Dependency + + if not(lang_tag of @_languageSpecificTranslators) + dfd = @_loadLanguage(lang_tag) + .done => + @_languageSpecificTranslators[lang_tag] = @_getSpecificLangTranslator(lang_tag) + + @_languageSpecificTranslatorsTrackers[lang_tag].changed() + + return dfd + + _getPackageI18nextProxy: (package_name) -> + # A proxy to TAPi18next.t where the namespace is preset to the package's + + (key, options, lang_tag=null) => + # Devs get confused and use lang option instead of lng option, make lang + # alias of lng + if options?.lang? and not options?.lng? + options.lng = options.lang + + if options?.lng? and not lang_tag? + lang_tag = options.lng + # Remove options.lng so we won't pass it to the regular TAPi18next + # before the language specific translator is ready to keep behavior + # consistent. + # + # If lang is actually ready before the language specifc translator is + # ready, TAPi18next will translate to lang_tag if we won't remove + # options.lng. + delete options.lng + + if lang_tag? + @_prepareLanguageSpecificTranslator(lang_tag) + + @_languageSpecificTranslatorsTrackers[lang_tag].depend() + + if lang_tag of @_languageSpecificTranslators + return @_languageSpecificTranslators[lang_tag] "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options + else + return TAPi18next.t "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options + + # If inside a reactive computation, we want to invalidate the computation if the client lang changes + @_language_changed_tracker.depend() + + + TAPi18next.t "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options + + _onceEnabled: () -> + @_registerHelpers globals.project_translations_domain + + _abortPreviousSetLang: null + setLanguage: (lang_tag) -> + self = @ + + @_abortPreviousSetLang?() + + isAborted = false + @_abortPreviousSetLang = -> isAborted = true + + @_loadLanguage(lang_tag).then => + if not isAborted + TAPi18next.setLng(lang_tag) + + @_language_changed_tracker.changed() + Session.set @_loaded_lang_session_key, lang_tag + + getLanguage: -> + if not @._enabled() + return null + + session_lang = Session.get @_loaded_lang_session_key + + if session_lang? then session_lang else @._fallback_language diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee new file mode 100644 index 000000000..23bc6e59f --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee @@ -0,0 +1,143 @@ +fallback_language = globals.fallback_language + +TAPi18n = -> + EventEmitter.call @ + + @_fallback_language = fallback_language + + @_language_changed_tracker = new Tracker.Dependency + + @_loaded_languages = [fallback_language] # stores the loaded languages, the fallback language is loaded automatically + + @conf = null # If conf isn't null we assume that tap:i18n is enabled for the project. + # We assume conf is valid, we sterilize and validate it during the build process. + + @packages = {} # Stores the packages' package-tap.i18n jsons + + @languages_names = {} # Stores languages that we've found languages files for in the project dir. + # format: + # { + # lang_tag: [lang_name_in_english, lang_name_in_local_language] + # } + + @translations = {} # Stores the packages/project translations - Server side only + # fallback_language translations are not stored here + + + if Meteor.isClient + Session.set @_loaded_lang_session_key, null + + @_languageSpecificTranslators = {} + @_languageSpecificTranslatorsTrackers = {} + + if Meteor.isServer + @server_translators = {} + + Meteor.startup => + # If tap-i18n is enabled for that project + if @_enabled() + @_registerHTTPMethod() + + @__ = @_getPackageI18nextProxy(globals.project_translations_domain) + + TAPi18next.setLng fallback_language + + return @ + +Util.inherits TAPi18n, EventEmitter + +_.extend TAPi18n.prototype, + _loaded_lang_session_key: "TAPi18n::loaded_lang" + + _enable: (conf) -> + # tap:i18n gets enabled for a project once a conf file is set for it. + # It can be either a conf object that was set by project-tap.i18n file or + # a default conf, which is being added if the project has lang files + # (*.i18n.json) but not project-tap.i18n + @conf = conf + + @._onceEnabled() + + _onceEnabled: () -> + # The arch specific code can use this for procedures that should be performed once + # tap:i18n gets enabled (project conf file is being set) + return + + _enabled: -> + # read the comment of @conf + @conf? + + _getPackageDomain: (package_name) -> + package_name.replace(/:/g, "-") + + addResourceBundle: (lang_tag, package_name, translations) -> + TAPi18next.addResourceBundle(lang_tag, @_getPackageDomain(package_name), translations) + + _getSpecificLangTranslator: (lang) -> + current_lang = TAPi18next.lng() + + translator = null + TAPi18next.setLng lang, {fixLng: true}, (lang_translator) => + translator = lang_translator + + # Restore i18next lang that had been changed in the process of generating + # lang specific translator + TAPi18next.setLng current_lang + + return translator + + _getProjectLanguages: () -> + # Return an array of languages available for the current project + if @._enabled() + if _.isArray @.conf.supported_languages + return _.union([@._fallback_language], @.conf.supported_languages) + else + # If supported_languages is null, all the languages we found + # translations files to in the project level are considered supported. + # We use the @.languages_names array to tell which languages we found + # since for every i18n.json file we found in the project level we add + # an entry for its language to @.languages_names in the build process. + # + # We also know for certain that when tap-i18n is enabled the fallback + # lang is in @.languages_names + return _.keys @.languages_names + else + return [@._fallback_language] + + getLanguages: -> + if not @._enabled() + return null + + languages = {} + for lang_tag in @._getProjectLanguages() + languages[lang_tag] = + name: @.languages_names[lang_tag][1] + en: @.languages_names[lang_tag][0] + + languages + + _loadLangFileObject: (language_tag, data) -> + for package_name, package_keys of data + # Translations that are added by loadTranslations() have higher priority + package_keys = _.extend({}, package_keys, @_loadTranslations_cache[language_tag]?[package_name] or {}) + + @addResourceBundle(language_tag, package_name, package_keys) + + _loadTranslations_cache: {} + loadTranslations: (translations, namespace) -> + project_languages = @_getProjectLanguages() + + for language_tag, translation_keys of translations + if not @_loadTranslations_cache[language_tag]? + @_loadTranslations_cache[language_tag] = {} + + if not @_loadTranslations_cache[language_tag][namespace]? + @_loadTranslations_cache[language_tag][namespace] = {} + + _.extend(@_loadTranslations_cache[language_tag][namespace], translation_keys) + + @addResourceBundle(language_tag, namespace, translation_keys) + + if Meteor.isClient and @getLanguage() == language_tag + # Retranslate if session language updated + @_language_changed_tracker.changed() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee new file mode 100644 index 000000000..74aff3ad7 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee @@ -0,0 +1 @@ +share.helpers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee new file mode 100644 index 000000000..f51365a4e --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee @@ -0,0 +1 @@ +TAPi18n = new TAPi18n() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee new file mode 100644 index 000000000..014e89d0d --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee @@ -0,0 +1,85 @@ +_.extend TAPi18n.prototype, + server_translators: null + + _registerServerTranslator: (lang_tag, package_name) -> + if @_enabled() + if not(lang_tag of @server_translators) + @server_translators[lang_tag] = @_getSpecificLangTranslator(lang_tag) + + # fallback language is integrated, and isn't part of @translations + if lang_tag != @_fallback_language + @addResourceBundle(lang_tag, package_name, @translations[lang_tag][package_name]) + + if not(@_fallback_language of @server_translators) + @server_translators[@_fallback_language] = @_getSpecificLangTranslator(@_fallback_language) + + _registerAllServerTranslators: () -> + for lang_tag in @_getProjectLanguages() + for package_name of @translations[lang_tag] + @_registerServerTranslator(lang_tag, package_name) + + _getPackageI18nextProxy: (package_name) -> + # A proxy to TAPi18next.t where the namespace is preset to the package's + (key, options, lang_tag=null) => + if not lang_tag? + # translate to fallback_language + return @server_translators[@_fallback_language] "#{@_getPackageDomain(package_name)}:#{key}", options + else if not(lang_tag of @server_translators) + console.log "Warning: language #{lang_tag} is not supported in this project, fallback language (#{@_fallback_language})" + return @server_translators[@_fallback_language] "#{@_getPackageDomain(package_name)}:#{key}", options + else + return @server_translators[lang_tag] "#{@_getPackageDomain(package_name)}:#{key}", options + + _registerHTTPMethod: -> + self = @ + + methods = {} + + if not self._enabled() + throw new Meteor.Error 500, "tap-i18n has to be enabled in order to register the HTTP method" + + methods["#{self.conf.i18n_files_route.replace(/\/$/, "")}/multi/:langs"] = + get: () -> + if not RegExp("^((#{globals.langauges_tags_regex},)*#{globals.langauges_tags_regex}|all).json$").test(@params.langs) + return @setStatusCode(401) + + langs = @params.langs.replace ".json", "" + + if langs == "all" + output = self.translations + else + output = {} + + langs = langs.split(",") + for lang_tag in langs + if lang_tag in self._getProjectLanguages() and \ + lang_tag != self._fallback_language # fallback language is integrated to the bundle + language_translations = self.translations[lang_tag] + + if language_translations? + output[lang_tag] = language_translations + + return JSON.stringify(output) + + methods["#{self.conf.i18n_files_route.replace(/\/$/, "")}/:lang"] = + get: () -> + if not RegExp("^#{globals.langauges_tags_regex}.json$").test(@params.lang) + return @setStatusCode(401) + + lang_tag = @params.lang.replace ".json", "" + + if lang_tag not in self._getProjectLanguages() or \ + lang_tag == self._fallback_language # fallback language is integrated to the bundle + return @setStatusCode(404) # not found + + language_translations = self.translations[lang_tag] + # returning {} if lang_tag is not in translations allows the project + # developer to force a language supporte with project-tap.i18n's + # supported_languages property, even if that language has no lang + # files. + return JSON.stringify(if language_translations? then language_translations else {}) + + HTTP.methods methods + + _onceEnabled: -> + @_registerAllServerTranslators() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js new file mode 100644 index 000000000..dbf4f810b --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js @@ -0,0 +1,2748 @@ +// tap_i18next is a copy of i18next that expose i18next to the global namespace +// under the name name TAPi18next instead of i18n to (1) avoid interfering with other +// Meteor packages that might use i18n with different configurations than we do +// or worse - (2) using a different version of i18next +// +// setJqueryExt is disabled by default in TAPi18next +// sprintf is a default postProcess in TAPi18next +// +// TAPi18next is set outside of the singleton builder to make it available in the +// package level + +// i18next, v1.7.3 +// Copyright (c)2014 Jan Mühlemann (jamuhl). +// Distributed under MIT license +// http://i18next.com + +// set TAPi18next outside of the singleton builder to make it available in the package level +TAPi18next = {}; +(function() { + + // add indexOf to non ECMA-262 standard compliant browsers + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { + "use strict"; + if (this == null) { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 0) { + n = Number(arguments[1]); + if (n != n) { // shortcut for verifying if it's NaN + n = 0; + } else if (n != 0 && n != Infinity && n != -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + } + } + + // add lastIndexOf to non ECMA-262 standard compliant browsers + if (!Array.prototype.lastIndexOf) { + Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) { + "use strict"; + if (this == null) { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = len; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n != n) { + n = 0; + } else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + var k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); + for (; k >= 0; k--) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + }; + } + + // Add string trim for IE8. + if (typeof String.prototype.trim !== 'function') { + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); + } + } + + var root = this + , $ = root.jQuery || root.Zepto + , resStore = {} + , currentLng + , replacementCounter = 0 + , languages = [] + , initialized = false; + + + // Export the i18next object for **CommonJS**. + // If we're not in CommonJS, add `i18n` to the + // global object or to jquery. + if (typeof module !== 'undefined' && module.exports) { + module.exports = TAPi18next; + } else { + if ($) { + $.TAPi18next = $.TAPi18next || TAPi18next; + } + + root.TAPi18next = root.TAPi18next || TAPi18next; + } + // defaults + var o = { + lng: undefined, + load: 'all', + preload: [], + lowerCaseLng: false, + returnObjectTrees: false, + fallbackLng: ['dev'], + fallbackNS: [], + detectLngQS: 'setLng', + ns: 'translation', + fallbackOnNull: true, + fallbackOnEmpty: false, + fallbackToDefaultNS: false, + nsseparator: ':', + keyseparator: '.', + selectorAttr: 'data-i18n', + debug: false, + + resGetPath: 'locales/__lng__/__ns__.json', + resPostPath: 'locales/add/__lng__/__ns__', + + getAsync: true, + postAsync: true, + + resStore: undefined, + useLocalStorage: false, + localStorageExpirationTime: 7*24*60*60*1000, + + dynamicLoad: false, + sendMissing: false, + sendMissingTo: 'fallback', // current | all + sendType: 'POST', + + interpolationPrefix: '__', + interpolationSuffix: '__', + reusePrefix: '$t(', + reuseSuffix: ')', + pluralSuffix: '_plural', + pluralNotFound: ['plural_not_found', Math.random()].join(''), + contextNotFound: ['context_not_found', Math.random()].join(''), + escapeInterpolation: false, + + setJqueryExt: false, + defaultValueFromContent: true, + useDataAttrOptions: false, + cookieExpirationTime: undefined, + useCookie: true, + cookieName: 'TAPi18next', + cookieDomain: undefined, + + objectTreeKeyHandler: undefined, + postProcess: ["sprintf"], + parseMissingKey: undefined, + + shortcutFunction: 'sprintf' // or: defaultValue + }; + function _extend(target, source) { + if (!source || typeof source === 'function') { + return target; + } + + for (var attr in source) { target[attr] = source[attr]; } + return target; + } + + function _each(object, callback, args) { + var name, i = 0, + length = object.length, + isObj = length === undefined || Object.prototype.toString.apply(object) !== '[object Array]' || typeof object === "function"; + + if (args) { + if (isObj) { + for (name in object) { + if (callback.apply(object[name], args) === false) { + break; + } + } + } else { + for ( ; i < length; ) { + if (callback.apply(object[i++], args) === false) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if (isObj) { + for (name in object) { + if (callback.call(object[name], name, object[name]) === false) { + break; + } + } + } else { + for ( ; i < length; ) { + if (callback.call(object[i], i, object[i++]) === false) { + break; + } + } + } + } + + return object; + } + + var _entityMap = { + "&": "&", + "<": "<", + ">": ">", + '"': '"', + "'": ''', + "/": '/' + }; + + function _escape(data) { + if (typeof data === 'string') { + return data.replace(/[&<>"'\/]/g, function (s) { + return _entityMap[s]; + }); + }else{ + return data; + } + } + + function _ajax(options) { + + // v0.5.0 of https://github.com/goloroden/http.js + var getXhr = function (callback) { + // Use the native XHR object if the browser supports it. + if (window.XMLHttpRequest) { + return callback(null, new XMLHttpRequest()); + } else if (window.ActiveXObject) { + // In Internet Explorer check for ActiveX versions of the XHR object. + try { + return callback(null, new ActiveXObject("Msxml2.XMLHTTP")); + } catch (e) { + return callback(null, new ActiveXObject("Microsoft.XMLHTTP")); + } + } + + // If no XHR support was found, throw an error. + return callback(new Error()); + }; + + var encodeUsingUrlEncoding = function (data) { + if(typeof data === 'string') { + return data; + } + + var result = []; + for(var dataItem in data) { + if(data.hasOwnProperty(dataItem)) { + result.push(encodeURIComponent(dataItem) + '=' + encodeURIComponent(data[dataItem])); + } + } + + return result.join('&'); + }; + + var utf8 = function (text) { + text = text.replace(/\r\n/g, '\n'); + var result = ''; + + for(var i = 0; i < text.length; i++) { + var c = text.charCodeAt(i); + + if(c < 128) { + result += String.fromCharCode(c); + } else if((c > 127) && (c < 2048)) { + result += String.fromCharCode((c >> 6) | 192); + result += String.fromCharCode((c & 63) | 128); + } else { + result += String.fromCharCode((c >> 12) | 224); + result += String.fromCharCode(((c >> 6) & 63) | 128); + result += String.fromCharCode((c & 63) | 128); + } + } + + return result; + }; + + var base64 = function (text) { + var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + text = utf8(text); + var result = '', + chr1, chr2, chr3, + enc1, enc2, enc3, enc4, + i = 0; + + do { + chr1 = text.charCodeAt(i++); + chr2 = text.charCodeAt(i++); + chr3 = text.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if(isNaN(chr2)) { + enc3 = enc4 = 64; + } else if(isNaN(chr3)) { + enc4 = 64; + } + + result += + keyStr.charAt(enc1) + + keyStr.charAt(enc2) + + keyStr.charAt(enc3) + + keyStr.charAt(enc4); + chr1 = chr2 = chr3 = ''; + enc1 = enc2 = enc3 = enc4 = ''; + } while(i < text.length); + + return result; + }; + + var mergeHeaders = function () { + // Use the first header object as base. + var result = arguments[0]; + + // Iterate through the remaining header objects and add them. + for(var i = 1; i < arguments.length; i++) { + var currentHeaders = arguments[i]; + for(var header in currentHeaders) { + if(currentHeaders.hasOwnProperty(header)) { + result[header] = currentHeaders[header]; + } + } + } + + // Return the merged headers. + return result; + }; + + var ajax = function (method, url, options, callback) { + // Adjust parameters. + if(typeof options === 'function') { + callback = options; + options = {}; + } + + // Set default parameter values. + options.cache = options.cache || false; + options.data = options.data || {}; + options.headers = options.headers || {}; + options.jsonp = options.jsonp || false; + options.async = options.async === undefined ? true : options.async; + + // Merge the various header objects. + var headers = mergeHeaders({ + 'accept': '*/*', + 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8' + }, ajax.headers, options.headers); + + // Encode the data according to the content-type. + var payload; + if (headers['content-type'] === 'application/json') { + payload = JSON.stringify(options.data); + } else { + payload = encodeUsingUrlEncoding(options.data); + } + + // Specially prepare GET requests: Setup the query string, handle caching and make a JSONP call + // if neccessary. + if(method === 'GET') { + // Setup the query string. + var queryString = []; + if(payload) { + queryString.push(payload); + payload = null; + } + + // Handle caching. + if(!options.cache) { + queryString.push('_=' + (new Date()).getTime()); + } + + // If neccessary prepare the query string for a JSONP call. + if(options.jsonp) { + queryString.push('callback=' + options.jsonp); + queryString.push('jsonp=' + options.jsonp); + } + + // Merge the query string and attach it to the url. + queryString = queryString.join('&'); + if (queryString.length > 1) { + if (url.indexOf('?') > -1) { + url += '&' + queryString; + } else { + url += '?' + queryString; + } + } + + // Make a JSONP call if neccessary. + if(options.jsonp) { + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = url; + head.appendChild(script); + return; + } + } + + // Since we got here, it is no JSONP request, so make a normal XHR request. + getXhr(function (err, xhr) { + if(err) return callback(err); + + // Open the request. + xhr.open(method, url, options.async); + + // Set the request headers. + for(var header in headers) { + if(headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header, headers[header]); + } + } + + // Handle the request events. + xhr.onreadystatechange = function () { + if(xhr.readyState === 4) { + var data = xhr.responseText || ''; + + // If no callback is given, return. + if(!callback) { + return; + } + + // Return an object that provides access to the data as text and JSON. + callback(xhr.status, { + text: function () { + return data; + }, + + json: function () { + return JSON.parse(data); + } + }); + } + }; + + // Actually send the XHR request. + xhr.send(payload); + }); + }; + + // Define the external interface. + var http = { + authBasic: function (username, password) { + ajax.headers['Authorization'] = 'Basic ' + base64(username + ':' + password); + }, + + connect: function (url, options, callback) { + return ajax('CONNECT', url, options, callback); + }, + + del: function (url, options, callback) { + return ajax('DELETE', url, options, callback); + }, + + get: function (url, options, callback) { + return ajax('GET', url, options, callback); + }, + + head: function (url, options, callback) { + return ajax('HEAD', url, options, callback); + }, + + headers: function (headers) { + ajax.headers = headers || {}; + }, + + isAllowed: function (url, verb, callback) { + this.options(url, function (status, data) { + callback(data.text().indexOf(verb) !== -1); + }); + }, + + options: function (url, options, callback) { + return ajax('OPTIONS', url, options, callback); + }, + + patch: function (url, options, callback) { + return ajax('PATCH', url, options, callback); + }, + + post: function (url, options, callback) { + return ajax('POST', url, options, callback); + }, + + put: function (url, options, callback) { + return ajax('PUT', url, options, callback); + }, + + trace: function (url, options, callback) { + return ajax('TRACE', url, options, callback); + } + }; + + + var methode = options.type ? options.type.toLowerCase() : 'get'; + + http[methode](options.url, options, function (status, data) { + if (status === 200) { + options.success(data.json(), status, null); + } else { + options.error(data.text(), status, null); + } + }); + } + + var _cookie = { + create: function(name,value,minutes,domain) { + var expires; + if (minutes) { + var date = new Date(); + date.setTime(date.getTime()+(minutes*60*1000)); + expires = "; expires="+date.toGMTString(); + } + else expires = ""; + domain = (domain)? "domain="+domain+";" : ""; + document.cookie = name+"="+value+expires+";"+domain+"path=/"; + }, + + read: function(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length); + } + return null; + }, + + remove: function(name) { + this.create(name,"",-1); + } + }; + + var cookie_noop = { + create: function(name,value,minutes,domain) {}, + read: function(name) { return null; }, + remove: function(name) {} + }; + + + + // move dependent functions to a container so that + // they can be overriden easier in no jquery environment (node.js) + var f = { + extend: $ ? $.extend : _extend, + each: $ ? $.each : _each, + ajax: $ ? $.ajax : (typeof document !== 'undefined' ? _ajax : function() {}), + cookie: typeof document !== 'undefined' ? _cookie : cookie_noop, + detectLanguage: detectLanguage, + escape: _escape, + log: function(str) { + if (o.debug && typeof console !== "undefined") console.log(str); + }, + toLanguages: function(lng) { + var languages = []; + if (typeof lng === 'string' && lng.indexOf('-') > -1) { + var parts = lng.split('-'); + + lng = o.lowerCaseLng ? + parts[0].toLowerCase() + '-' + parts[1].toLowerCase() : + parts[0].toLowerCase() + '-' + parts[1].toUpperCase(); + + if (o.load !== 'unspecific') languages.push(lng); + if (o.load !== 'current') languages.push(parts[0]); + } else { + languages.push(lng); + } + + for (var i = 0; i < o.fallbackLng.length; i++) { + if (languages.indexOf(o.fallbackLng[i]) === -1 && o.fallbackLng[i]) languages.push(o.fallbackLng[i]); + } + + return languages; + }, + regexEscape: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + }; + function init(options, cb) { + + if (typeof options === 'function') { + cb = options; + options = {}; + } + options = options || {}; + + // override defaults with passed in options + f.extend(o, options); + delete o.fixLng; /* passed in each time */ + + // create namespace object if namespace is passed in as string + if (typeof o.ns == 'string') { + o.ns = { namespaces: [o.ns], defaultNs: o.ns}; + } + + // fallback namespaces + if (typeof o.fallbackNS == 'string') { + o.fallbackNS = [o.fallbackNS]; + } + + // fallback languages + if (typeof o.fallbackLng == 'string' || typeof o.fallbackLng == 'boolean') { + o.fallbackLng = [o.fallbackLng]; + } + + // escape prefix/suffix + o.interpolationPrefixEscaped = f.regexEscape(o.interpolationPrefix); + o.interpolationSuffixEscaped = f.regexEscape(o.interpolationSuffix); + + if (!o.lng) o.lng = f.detectLanguage(); + if (o.lng) { + // set cookie with lng set (as detectLanguage will set cookie on need) + if (o.useCookie) f.cookie.create(o.cookieName, o.lng, o.cookieExpirationTime, o.cookieDomain); + } else { + o.lng = o.fallbackLng[0]; + if (o.useCookie) f.cookie.remove(o.cookieName); + } + + languages = f.toLanguages(o.lng); + currentLng = languages[0]; + f.log('currentLng set to: ' + currentLng); + + var lngTranslate = translate; + if (options.fixLng) { + lngTranslate = function(key, options) { + options = options || {}; + options.lng = options.lng || lngTranslate.lng; + return translate(key, options); + }; + lngTranslate.lng = currentLng; + } + + pluralExtensions.setCurrentLng(currentLng); + + // add JQuery extensions + if ($ && o.setJqueryExt) addJqueryFunct(); + + // jQuery deferred + var deferred; + if ($ && $.Deferred) { + deferred = $.Deferred(); + } + + // return immidiatly if res are passed in + if (o.resStore) { + resStore = o.resStore; + initialized = true; + if (cb) cb(lngTranslate); + if (deferred) deferred.resolve(lngTranslate); + if (deferred) return deferred.promise(); + return; + } + + // languages to load + var lngsToLoad = f.toLanguages(o.lng); + if (typeof o.preload === 'string') o.preload = [o.preload]; + for (var i = 0, l = o.preload.length; i < l; i++) { + var pres = f.toLanguages(o.preload[i]); + for (var y = 0, len = pres.length; y < len; y++) { + if (lngsToLoad.indexOf(pres[y]) < 0) { + lngsToLoad.push(pres[y]); + } + } + } + + // else load them + TAPi18next.sync.load(lngsToLoad, o, function(err, store) { + resStore = store; + initialized = true; + + if (cb) cb(lngTranslate); + if (deferred) deferred.resolve(lngTranslate); + }); + + if (deferred) return deferred.promise(); + } + function preload(lngs, cb) { + if (typeof lngs === 'string') lngs = [lngs]; + for (var i = 0, l = lngs.length; i < l; i++) { + if (o.preload.indexOf(lngs[i]) < 0) { + o.preload.push(lngs[i]); + } + } + return init(cb); + } + + function addResourceBundle(lng, ns, resources) { + if (typeof ns !== 'string') { + resources = ns; + ns = o.ns.defaultNs; + } else if (o.ns.namespaces.indexOf(ns) < 0) { + o.ns.namespaces.push(ns); + } + + resStore[lng] = resStore[lng] || {}; + resStore[lng][ns] = resStore[lng][ns] || {}; + + f.extend(resStore[lng][ns], resources); + } + + function removeResourceBundle(lng, ns) { + if (typeof ns !== 'string') { + ns = o.ns.defaultNs; + } + + resStore[lng] = resStore[lng] || {}; + resStore[lng][ns] = {}; + } + + function setDefaultNamespace(ns) { + o.ns.defaultNs = ns; + } + + function loadNamespace(namespace, cb) { + loadNamespaces([namespace], cb); + } + + function loadNamespaces(namespaces, cb) { + var opts = { + dynamicLoad: o.dynamicLoad, + resGetPath: o.resGetPath, + getAsync: o.getAsync, + customLoad: o.customLoad, + ns: { namespaces: namespaces, defaultNs: ''} /* new namespaces to load */ + }; + + // languages to load + var lngsToLoad = f.toLanguages(o.lng); + if (typeof o.preload === 'string') o.preload = [o.preload]; + for (var i = 0, l = o.preload.length; i < l; i++) { + var pres = f.toLanguages(o.preload[i]); + for (var y = 0, len = pres.length; y < len; y++) { + if (lngsToLoad.indexOf(pres[y]) < 0) { + lngsToLoad.push(pres[y]); + } + } + } + + // check if we have to load + var lngNeedLoad = []; + for (var a = 0, lenA = lngsToLoad.length; a < lenA; a++) { + var needLoad = false; + var resSet = resStore[lngsToLoad[a]]; + if (resSet) { + for (var b = 0, lenB = namespaces.length; b < lenB; b++) { + if (!resSet[namespaces[b]]) needLoad = true; + } + } else { + needLoad = true; + } + + if (needLoad) lngNeedLoad.push(lngsToLoad[a]); + } + + if (lngNeedLoad.length) { + TAPi18next.sync._fetch(lngNeedLoad, opts, function(err, store) { + var todo = namespaces.length * lngNeedLoad.length; + + // load each file individual + f.each(namespaces, function(nsIndex, nsValue) { + + // append namespace to namespace array + if (o.ns.namespaces.indexOf(nsValue) < 0) { + o.ns.namespaces.push(nsValue); + } + + f.each(lngNeedLoad, function(lngIndex, lngValue) { + resStore[lngValue] = resStore[lngValue] || {}; + resStore[lngValue][nsValue] = store[lngValue][nsValue]; + + todo--; // wait for all done befor callback + if (todo === 0 && cb) { + if (o.useLocalStorage) TAPi18next.sync._storeLocal(resStore); + cb(); + } + }); + }); + }); + } else { + if (cb) cb(); + } + } + + function setLng(lng, options, cb) { + if (typeof options === 'function') { + cb = options; + options = {}; + } else if (!options) { + options = {}; + } + + options.lng = lng; + return init(options, cb); + } + + function lng() { + return currentLng; + } + function addJqueryFunct() { + // $.t shortcut + $.t = $.t || translate; + + function parse(ele, key, options) { + if (key.length === 0) return; + + var attr = 'text'; + + if (key.indexOf('[') === 0) { + var parts = key.split(']'); + key = parts[1]; + attr = parts[0].substr(1, parts[0].length-1); + } + + if (key.indexOf(';') === key.length-1) { + key = key.substr(0, key.length-2); + } + + var optionsToUse; + if (attr === 'html') { + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; + ele.html($.t(key, optionsToUse)); + } else if (attr === 'text') { + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.text() }, options) : options; + ele.text($.t(key, optionsToUse)); + } else if (attr === 'prepend') { + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; + ele.prepend($.t(key, optionsToUse)); + } else if (attr === 'append') { + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; + ele.append($.t(key, optionsToUse)); + } else if (attr.indexOf("data-") === 0) { + var dataAttr = attr.substr(("data-").length); + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.data(dataAttr) }, options) : options; + var translated = $.t(key, optionsToUse); + //we change into the data cache + ele.data(dataAttr, translated); + //we change into the dom + ele.attr(attr, translated); + } else { + optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.attr(attr) }, options) : options; + ele.attr(attr, $.t(key, optionsToUse)); + } + } + + function localize(ele, options) { + var key = ele.attr(o.selectorAttr); + if (!key && typeof key !== 'undefined' && key !== false) key = ele.text() || ele.val(); + if (!key) return; + + var target = ele + , targetSelector = ele.data("i18n-target"); + if (targetSelector) { + target = ele.find(targetSelector) || ele; + } + + if (!options && o.useDataAttrOptions === true) { + options = ele.data("i18n-options"); + } + options = options || {}; + + if (key.indexOf(';') >= 0) { + var keys = key.split(';'); + + $.each(keys, function(m, k) { + if (k !== '') parse(target, k, options); + }); + + } else { + parse(target, key, options); + } + + if (o.useDataAttrOptions === true) ele.data("i18n-options", options); + } + + // fn + $.fn.TAPi18next = function (options) { + return this.each(function() { + // localize element itself + localize($(this), options); + + // localize childs + var elements = $(this).find('[' + o.selectorAttr + ']'); + elements.each(function() { + localize($(this), options); + }); + }); + }; + } + function applyReplacement(str, replacementHash, nestedKey, options) { + if (!str) return str; + + options = options || replacementHash; // first call uses replacement hash combined with options + if (str.indexOf(options.interpolationPrefix || o.interpolationPrefix) < 0) return str; + + var prefix = options.interpolationPrefix ? f.regexEscape(options.interpolationPrefix) : o.interpolationPrefixEscaped + , suffix = options.interpolationSuffix ? f.regexEscape(options.interpolationSuffix) : o.interpolationSuffixEscaped + , unEscapingSuffix = 'HTML'+suffix; + + f.each(replacementHash, function(key, value) { + var nextKey = nestedKey ? nestedKey + o.keyseparator + key : key; + if (typeof value === 'object' && value !== null) { + str = applyReplacement(str, value, nextKey, options); + } else { + if (options.escapeInterpolation || o.escapeInterpolation) { + str = str.replace(new RegExp([prefix, nextKey, unEscapingSuffix].join(''), 'g'), value); + str = str.replace(new RegExp([prefix, nextKey, suffix].join(''), 'g'), f.escape(value)); + } else { + str = str.replace(new RegExp([prefix, nextKey, suffix].join(''), 'g'), value); + } + // str = options.escapeInterpolation; + } + }); + return str; + } + + // append it to functions + f.applyReplacement = applyReplacement; + + function applyReuse(translated, options) { + var comma = ','; + var options_open = '{'; + var options_close = '}'; + + var opts = f.extend({}, options); + delete opts.postProcess; + + while (translated.indexOf(o.reusePrefix) != -1) { + replacementCounter++; + if (replacementCounter > o.maxRecursion) { break; } // safety net for too much recursion + var index_of_opening = translated.lastIndexOf(o.reusePrefix); + var index_of_end_of_closing = translated.indexOf(o.reuseSuffix, index_of_opening) + o.reuseSuffix.length; + var token = translated.substring(index_of_opening, index_of_end_of_closing); + var token_without_symbols = token.replace(o.reusePrefix, '').replace(o.reuseSuffix, ''); + + + if (token_without_symbols.indexOf(comma) != -1) { + var index_of_token_end_of_closing = token_without_symbols.indexOf(comma); + if (token_without_symbols.indexOf(options_open, index_of_token_end_of_closing) != -1 && token_without_symbols.indexOf(options_close, index_of_token_end_of_closing) != -1) { + var index_of_opts_opening = token_without_symbols.indexOf(options_open, index_of_token_end_of_closing); + var index_of_opts_end_of_closing = token_without_symbols.indexOf(options_close, index_of_opts_opening) + options_close.length; + try { + opts = f.extend(opts, JSON.parse(token_without_symbols.substring(index_of_opts_opening, index_of_opts_end_of_closing))); + token_without_symbols = token_without_symbols.substring(0, index_of_token_end_of_closing); + } catch (e) { + } + } + } + + var translated_token = _translate(token_without_symbols, opts); + translated = translated.replace(token, translated_token); + } + return translated; + } + + function hasContext(options) { + return (options.context && (typeof options.context == 'string' || typeof options.context == 'number')); + } + + function needsPlural(options) { + return (options.count !== undefined && typeof options.count != 'string' && options.count !== 1); + } + + function exists(key, options) { + options = options || {}; + + var notFound = _getDefaultValue(key, options) + , found = _find(key, options); + + return found !== undefined || found === notFound; + } + + function translate(key, options) { + if (typeof options === 'undefined') { + options = {}; + } + + if (!initialized) { + f.log('i18next not finished initialization. you might have called t function before loading resources finished.') + return options.defaultValue || ''; + }; + replacementCounter = 0; + return _translate.apply(null, arguments); + } + + function _getDefaultValue(key, options) { + return (options.defaultValue !== undefined) ? options.defaultValue : key; + } + + function _injectSprintfProcessor() { + + var values = []; + + // mh: build array from second argument onwards + for (var i = 1; i < arguments.length; i++) { + values.push(arguments[i]); + } + + return { + postProcess: 'sprintf', + sprintf: values + }; + } + + function _translate(potentialKeys, options) { + if (typeof options !== "undefined" && options !== null && typeof options !== 'object') { + if (o.shortcutFunction === 'sprintf') { + // mh: gettext like sprintf syntax found, automatically create sprintf processor + options = _injectSprintfProcessor.apply(null, arguments); + } else if (o.shortcutFunction === 'defaultValue') { + options = { + defaultValue: options + } + } + } else { + options = options || {}; + } + + if (potentialKeys === undefined || potentialKeys === null) return ''; + + if (typeof potentialKeys == 'string') { + potentialKeys = [potentialKeys]; + } + + var key = potentialKeys[0]; + + if (potentialKeys.length > 1) { + for (var i = 0; i < potentialKeys.length; i++) { + key = potentialKeys[i]; + if (exists(key, options)) { + break; + } + } + } + + var notFound = _getDefaultValue(key, options) + , found = _find(key, options) + , lngs = options.lng ? f.toLanguages(options.lng) : languages + , ns = options.ns || o.ns.defaultNs + , parts; + + // split ns and key + if (key.indexOf(o.nsseparator) > -1) { + parts = key.split(o.nsseparator); + ns = parts[0]; + key = parts[1]; + } + + if (found === undefined && o.sendMissing) { + if (options.lng) { + sync.postMissing(lngs[0], ns, key, notFound, lngs); + } else { + sync.postMissing(o.lng, ns, key, notFound, lngs); + } + } + + var postProcessor = options.postProcess || o.postProcess; + if (found !== undefined && postProcessor) { + if (postProcessors[postProcessor]) { + found = postProcessors[postProcessor](found, key, options); + } + } + + // process notFound if function exists + var splitNotFound = notFound; + if (notFound.indexOf(o.nsseparator) > -1) { + parts = notFound.split(o.nsseparator); + splitNotFound = parts[1]; + } + if (splitNotFound === key && o.parseMissingKey) { + notFound = o.parseMissingKey(notFound); + } + + if (found === undefined) { + notFound = applyReplacement(notFound, options); + notFound = applyReuse(notFound, options); + + if (postProcessor && postProcessors[postProcessor]) { + var val = _getDefaultValue(key, options); + found = postProcessors[postProcessor](val, key, options); + } + } + + return (found !== undefined) ? found : notFound; + } + + function _find(key, options) { + options = options || {}; + + var optionWithoutCount, translated + , notFound = _getDefaultValue(key, options) + , lngs = languages; + + if (!resStore) { return notFound; } // no resStore to translate from + + // CI mode + if (lngs[0].toLowerCase() === 'cimode') return notFound; + + // passed in lng + if (options.lng) { + lngs = f.toLanguages(options.lng); + + if (!resStore[lngs[0]]) { + var oldAsync = o.getAsync; + o.getAsync = false; + + TAPi18next.sync.load(lngs, o, function(err, store) { + f.extend(resStore, store); + o.getAsync = oldAsync; + }); + } + } + + var ns = options.ns || o.ns.defaultNs; + if (key.indexOf(o.nsseparator) > -1) { + var parts = key.split(o.nsseparator); + ns = parts[0]; + key = parts[1]; + } + + if (hasContext(options)) { + optionWithoutCount = f.extend({}, options); + delete optionWithoutCount.context; + optionWithoutCount.defaultValue = o.contextNotFound; + + var contextKey = ns + o.nsseparator + key + '_' + options.context; + + translated = translate(contextKey, optionWithoutCount); + if (translated != o.contextNotFound) { + return applyReplacement(translated, { context: options.context }); // apply replacement for context only + } // else continue translation with original/nonContext key + } + + if (needsPlural(options)) { + optionWithoutCount = f.extend({}, options); + delete optionWithoutCount.count; + optionWithoutCount.defaultValue = o.pluralNotFound; + + var pluralKey = ns + o.nsseparator + key + o.pluralSuffix; + var pluralExtension = pluralExtensions.get(lngs[0], options.count); + if (pluralExtension >= 0) { + pluralKey = pluralKey + '_' + pluralExtension; + } else if (pluralExtension === 1) { + pluralKey = ns + o.nsseparator + key; // singular + } + + translated = translate(pluralKey, optionWithoutCount); + if (translated != o.pluralNotFound) { + return applyReplacement(translated, { + count: options.count, + interpolationPrefix: options.interpolationPrefix, + interpolationSuffix: options.interpolationSuffix + }); // apply replacement for count only + } // else continue translation with original/singular key + } + + var found; + var keys = key.split(o.keyseparator); + for (var i = 0, len = lngs.length; i < len; i++ ) { + if (found !== undefined) break; + + var l = lngs[i]; + + var x = 0; + var value = resStore[l] && resStore[l][ns]; + while (keys[x]) { + value = value && value[keys[x]]; + x++; + } + if (value !== undefined) { + var valueType = Object.prototype.toString.apply(value); + if (typeof value === 'string') { + value = applyReplacement(value, options); + value = applyReuse(value, options); + } else if (valueType === '[object Array]' && !o.returnObjectTrees && !options.returnObjectTrees) { + value = value.join('\n'); + value = applyReplacement(value, options); + value = applyReuse(value, options); + } else if (value === null && o.fallbackOnNull === true) { + value = undefined; + } else if (value !== null) { + if (!o.returnObjectTrees && !options.returnObjectTrees) { + if (o.objectTreeKeyHandler && typeof o.objectTreeKeyHandler == 'function') { + value = o.objectTreeKeyHandler(key, value, l, ns, options); + } else { + value = 'key \'' + ns + ':' + key + ' (' + l + ')\' ' + + 'returned an object instead of string.'; + f.log(value); + } + } else if (valueType !== '[object Number]' && valueType !== '[object Function]' && valueType !== '[object RegExp]') { + var copy = (valueType === '[object Array]') ? [] : {}; // apply child translation on a copy + f.each(value, function(m) { + copy[m] = _translate(ns + o.nsseparator + key + o.keyseparator + m, options); + }); + value = copy; + } + } + + if (typeof value === 'string' && value.trim() === '' && o.fallbackOnEmpty === true) + value = undefined; + + found = value; + } + } + + if (found === undefined && !options.isFallbackLookup && (o.fallbackToDefaultNS === true || (o.fallbackNS && o.fallbackNS.length > 0))) { + // set flag for fallback lookup - avoid recursion + options.isFallbackLookup = true; + + if (o.fallbackNS.length) { + + for (var y = 0, lenY = o.fallbackNS.length; y < lenY; y++) { + found = _find(o.fallbackNS[y] + o.nsseparator + key, options); + + if (found) { + /* compare value without namespace */ + var foundValue = found.indexOf(o.nsseparator) > -1 ? found.split(o.nsseparator)[1] : found + , notFoundValue = notFound.indexOf(o.nsseparator) > -1 ? notFound.split(o.nsseparator)[1] : notFound; + + if (foundValue !== notFoundValue) break; + } + } + } else { + found = _find(key, options); // fallback to default NS + } + } + + return found; + } + function detectLanguage() { + var detectedLng; + + // get from qs + var qsParm = []; + if (typeof window !== 'undefined') { + (function() { + var query = window.location.search.substring(1); + var parms = query.split('&'); + for (var i=0; i 0) { + var key = parms[i].substring(0,pos); + var val = parms[i].substring(pos+1); + qsParm[key] = val; + } + } + })(); + if (qsParm[o.detectLngQS]) { + detectedLng = qsParm[o.detectLngQS]; + } + } + + // get from cookie + if (!detectedLng && typeof document !== 'undefined' && o.useCookie ) { + var c = f.cookie.read(o.cookieName); + if (c) detectedLng = c; + } + + // get from navigator + if (!detectedLng && typeof navigator !== 'undefined') { + detectedLng = (navigator.language) ? navigator.language : navigator.userLanguage; + } + + return detectedLng; + } + var sync = { + + load: function(lngs, options, cb) { + if (options.useLocalStorage) { + sync._loadLocal(lngs, options, function(err, store) { + var missingLngs = []; + for (var i = 0, len = lngs.length; i < len; i++) { + if (!store[lngs[i]]) missingLngs.push(lngs[i]); + } + + if (missingLngs.length > 0) { + sync._fetch(missingLngs, options, function(err, fetched) { + f.extend(store, fetched); + sync._storeLocal(fetched); + + cb(null, store); + }); + } else { + cb(null, store); + } + }); + } else { + sync._fetch(lngs, options, function(err, store){ + cb(null, store); + }); + } + }, + + _loadLocal: function(lngs, options, cb) { + var store = {} + , nowMS = new Date().getTime(); + + if(window.localStorage) { + + var todo = lngs.length; + + f.each(lngs, function(key, lng) { + var local = window.localStorage.getItem('res_' + lng); + + if (local) { + local = JSON.parse(local); + + if (local.i18nStamp && local.i18nStamp + options.localStorageExpirationTime > nowMS) { + store[lng] = local; + } + } + + todo--; // wait for all done befor callback + if (todo === 0) cb(null, store); + }); + } + }, + + _storeLocal: function(store) { + if(window.localStorage) { + for (var m in store) { + store[m].i18nStamp = new Date().getTime(); + window.localStorage.setItem('res_' + m, JSON.stringify(store[m])); + } + } + return; + }, + + _fetch: function(lngs, options, cb) { + var ns = options.ns + , store = {}; + + if (!options.dynamicLoad) { + var todo = ns.namespaces.length * lngs.length + , errors; + + // load each file individual + f.each(ns.namespaces, function(nsIndex, nsValue) { + f.each(lngs, function(lngIndex, lngValue) { + + // Call this once our translation has returned. + var loadComplete = function(err, data) { + if (err) { + errors = errors || []; + errors.push(err); + } + store[lngValue] = store[lngValue] || {}; + store[lngValue][nsValue] = data; + + todo--; // wait for all done befor callback + if (todo === 0) cb(errors, store); + }; + + if(typeof options.customLoad == 'function'){ + // Use the specified custom callback. + options.customLoad(lngValue, nsValue, options, loadComplete); + } else { + //~ // Use our inbuilt sync. + sync._fetchOne(lngValue, nsValue, options, loadComplete); + } + }); + }); + } else { + // Call this once our translation has returned. + var loadComplete = function(err, data) { + cb(null, data); + }; + + if(typeof options.customLoad == 'function'){ + // Use the specified custom callback. + options.customLoad(lngs, ns.namespaces, options, loadComplete); + } else { + var url = applyReplacement(options.resGetPath, { lng: lngs.join('+'), ns: ns.namespaces.join('+') }); + // load all needed stuff once + f.ajax({ + url: url, + success: function(data, status, xhr) { + f.log('loaded: ' + url); + loadComplete(null, data); + }, + error : function(xhr, status, error) { + f.log('failed loading: ' + url); + loadComplete('failed loading resource.json error: ' + error); + }, + dataType: "json", + async : options.getAsync + }); + } + } + }, + + _fetchOne: function(lng, ns, options, done) { + var url = applyReplacement(options.resGetPath, { lng: lng, ns: ns }); + f.ajax({ + url: url, + success: function(data, status, xhr) { + f.log('loaded: ' + url); + done(null, data); + }, + error : function(xhr, status, error) { + if ((status && status == 200) || (xhr && xhr.status && xhr.status == 200)) { + // file loaded but invalid json, stop waste time ! + f.log('There is a typo in: ' + url); + } else if ((status && status == 404) || (xhr && xhr.status && xhr.status == 404)) { + f.log('Does not exist: ' + url); + } else { + var theStatus = status ? status : ((xhr && xhr.status) ? xhr.status : null); + f.log(theStatus + ' when loading ' + url); + } + + done(error, {}); + }, + dataType: "json", + async : options.getAsync + }); + }, + + postMissing: function(lng, ns, key, defaultValue, lngs) { + var payload = {}; + payload[key] = defaultValue; + + var urls = []; + + if (o.sendMissingTo === 'fallback' && o.fallbackLng[0] !== false) { + for (var i = 0; i < o.fallbackLng.length; i++) { + urls.push({lng: o.fallbackLng[i], url: applyReplacement(o.resPostPath, { lng: o.fallbackLng[i], ns: ns })}); + } + } else if (o.sendMissingTo === 'current' || (o.sendMissingTo === 'fallback' && o.fallbackLng[0] === false) ) { + urls.push({lng: lng, url: applyReplacement(o.resPostPath, { lng: lng, ns: ns })}); + } else if (o.sendMissingTo === 'all') { + for (var i = 0, l = lngs.length; i < l; i++) { + urls.push({lng: lngs[i], url: applyReplacement(o.resPostPath, { lng: lngs[i], ns: ns })}); + } + } + + for (var y = 0, len = urls.length; y < len; y++) { + var item = urls[y]; + f.ajax({ + url: item.url, + type: o.sendType, + data: payload, + success: function(data, status, xhr) { + f.log('posted missing key \'' + key + '\' to: ' + item.url); + + // add key to resStore + var keys = key.split('.'); + var x = 0; + var value = resStore[item.lng][ns]; + while (keys[x]) { + if (x === keys.length - 1) { + value = value[keys[x]] = defaultValue; + } else { + value = value[keys[x]] = value[keys[x]] || {}; + } + x++; + } + }, + error : function(xhr, status, error) { + f.log('failed posting missing key \'' + key + '\' to: ' + item.url); + }, + dataType: "json", + async : o.postAsync + }); + } + } + }; + // definition http://translate.sourceforge.net/wiki/l10n/pluralforms + var pluralExtensions = { + + rules: { + "ach": { + "name": "Acholi", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "af": { + "name": "Afrikaans", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ak": { + "name": "Akan", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "am": { + "name": "Amharic", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "an": { + "name": "Aragonese", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ar": { + "name": "Arabic", + "numbers": [ + 0, + 1, + 2, + 3, + 11, + 100 + ], + "plurals": function(n) { return Number(n===0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5); } + }, + "arn": { + "name": "Mapudungun", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "ast": { + "name": "Asturian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ay": { + "name": "Aymar\u00e1", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "az": { + "name": "Azerbaijani", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "be": { + "name": "Belarusian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "bg": { + "name": "Bulgarian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "bn": { + "name": "Bengali", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "bo": { + "name": "Tibetan", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "br": { + "name": "Breton", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "bs": { + "name": "Bosnian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "ca": { + "name": "Catalan", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "cgg": { + "name": "Chiga", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "cs": { + "name": "Czech", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2); } + }, + "csb": { + "name": "Kashubian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "cy": { + "name": "Welsh", + "numbers": [ + 1, + 2, + 3, + 8 + ], + "plurals": function(n) { return Number((n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3); } + }, + "da": { + "name": "Danish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "de": { + "name": "German", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "dz": { + "name": "Dzongkha", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "el": { + "name": "Greek", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "en": { + "name": "English", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "eo": { + "name": "Esperanto", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "es": { + "name": "Spanish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "es_ar": { + "name": "Argentinean Spanish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "et": { + "name": "Estonian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "eu": { + "name": "Basque", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "fa": { + "name": "Persian", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "fi": { + "name": "Finnish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "fil": { + "name": "Filipino", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "fo": { + "name": "Faroese", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "fr": { + "name": "French", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "fur": { + "name": "Friulian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "fy": { + "name": "Frisian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ga": { + "name": "Irish", + "numbers": [ + 1, + 2, + 3, + 7, + 11 + ], + "plurals": function(n) { return Number(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4) ;} + }, + "gd": { + "name": "Scottish Gaelic", + "numbers": [ + 1, + 2, + 3, + 20 + ], + "plurals": function(n) { return Number((n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3); } + }, + "gl": { + "name": "Galician", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "gu": { + "name": "Gujarati", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "gun": { + "name": "Gun", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "ha": { + "name": "Hausa", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "he": { + "name": "Hebrew", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "hi": { + "name": "Hindi", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "hr": { + "name": "Croatian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "hu": { + "name": "Hungarian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "hy": { + "name": "Armenian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ia": { + "name": "Interlingua", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "id": { + "name": "Indonesian", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "is": { + "name": "Icelandic", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n%10!=1 || n%100==11); } + }, + "it": { + "name": "Italian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ja": { + "name": "Japanese", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "jbo": { + "name": "Lojban", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "jv": { + "name": "Javanese", + "numbers": [ + 0, + 1 + ], + "plurals": function(n) { return Number(n !== 0); } + }, + "ka": { + "name": "Georgian", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "kk": { + "name": "Kazakh", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "km": { + "name": "Khmer", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "kn": { + "name": "Kannada", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ko": { + "name": "Korean", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "ku": { + "name": "Kurdish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "kw": { + "name": "Cornish", + "numbers": [ + 1, + 2, + 3, + 4 + ], + "plurals": function(n) { return Number((n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3); } + }, + "ky": { + "name": "Kyrgyz", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "lb": { + "name": "Letzeburgesch", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ln": { + "name": "Lingala", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "lo": { + "name": "Lao", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "lt": { + "name": "Lithuanian", + "numbers": [ + 1, + 2, + 10 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "lv": { + "name": "Latvian", + "numbers": [ + 1, + 2, + 0 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n !== 0 ? 1 : 2); } + }, + "mai": { + "name": "Maithili", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "mfe": { + "name": "Mauritian Creole", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "mg": { + "name": "Malagasy", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "mi": { + "name": "Maori", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "mk": { + "name": "Macedonian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n==1 || n%10==1 ? 0 : 1); } + }, + "ml": { + "name": "Malayalam", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "mn": { + "name": "Mongolian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "mnk": { + "name": "Mandinka", + "numbers": [ + 0, + 1, + 2 + ], + "plurals": function(n) { return Number(n == 0 ? 0 : n==1 ? 1 : 2); } + }, + "mr": { + "name": "Marathi", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ms": { + "name": "Malay", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "mt": { + "name": "Maltese", + "numbers": [ + 1, + 2, + 11, + 20 + ], + "plurals": function(n) { return Number(n==1 ? 0 : n===0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3); } + }, + "nah": { + "name": "Nahuatl", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "nap": { + "name": "Neapolitan", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "nb": { + "name": "Norwegian Bokmal", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ne": { + "name": "Nepali", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "nl": { + "name": "Dutch", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "nn": { + "name": "Norwegian Nynorsk", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "no": { + "name": "Norwegian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "nso": { + "name": "Northern Sotho", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "oc": { + "name": "Occitan", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "or": { + "name": "Oriya", + "numbers": [ + 2, + 1 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "pa": { + "name": "Punjabi", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "pap": { + "name": "Papiamento", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "pl": { + "name": "Polish", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "pms": { + "name": "Piemontese", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ps": { + "name": "Pashto", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "pt": { + "name": "Portuguese", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "pt_br": { + "name": "Brazilian Portuguese", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "rm": { + "name": "Romansh", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ro": { + "name": "Romanian", + "numbers": [ + 1, + 2, + 20 + ], + "plurals": function(n) { return Number(n==1 ? 0 : (n===0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2); } + }, + "ru": { + "name": "Russian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "sah": { + "name": "Yakut", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "sco": { + "name": "Scots", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "se": { + "name": "Northern Sami", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "si": { + "name": "Sinhala", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "sk": { + "name": "Slovak", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2); } + }, + "sl": { + "name": "Slovenian", + "numbers": [ + 5, + 1, + 2, + 3 + ], + "plurals": function(n) { return Number(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); } + }, + "so": { + "name": "Somali", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "son": { + "name": "Songhay", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "sq": { + "name": "Albanian", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "sr": { + "name": "Serbian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "su": { + "name": "Sundanese", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "sv": { + "name": "Swedish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "sw": { + "name": "Swahili", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "ta": { + "name": "Tamil", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "te": { + "name": "Telugu", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "tg": { + "name": "Tajik", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "th": { + "name": "Thai", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "ti": { + "name": "Tigrinya", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "tk": { + "name": "Turkmen", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "tr": { + "name": "Turkish", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "tt": { + "name": "Tatar", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "ug": { + "name": "Uyghur", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "uk": { + "name": "Ukrainian", + "numbers": [ + 1, + 2, + 5 + ], + "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } + }, + "ur": { + "name": "Urdu", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "uz": { + "name": "Uzbek", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "vi": { + "name": "Vietnamese", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "wa": { + "name": "Walloon", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n > 1); } + }, + "wo": { + "name": "Wolof", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + }, + "yo": { + "name": "Yoruba", + "numbers": [ + 1, + 2 + ], + "plurals": function(n) { return Number(n != 1); } + }, + "zh": { + "name": "Chinese", + "numbers": [ + 1 + ], + "plurals": function(n) { return 0; } + } + }, + + // for demonstration only sl and ar is added but you can add your own pluralExtensions + addRule: function(lng, obj) { + pluralExtensions.rules[lng] = obj; + }, + + setCurrentLng: function(lng) { + if (!pluralExtensions.currentRule || pluralExtensions.currentRule.lng !== lng) { + var parts = lng.split('-'); + + pluralExtensions.currentRule = { + lng: lng, + rule: pluralExtensions.rules[parts[0]] + }; + } + }, + + get: function(lng, count) { + var parts = lng.split('-'); + + function getResult(l, c) { + var ext; + if (pluralExtensions.currentRule && pluralExtensions.currentRule.lng === lng) { + ext = pluralExtensions.currentRule.rule; + } else { + ext = pluralExtensions.rules[l]; + } + if (ext) { + var i = ext.plurals(c); + var number = ext.numbers[i]; + if (ext.numbers.length === 2 && ext.numbers[0] === 1) { + if (number === 2) { + number = -1; // regular plural + } else if (number === 1) { + number = 1; // singular + } + }//console.log(count + '-' + number); + return number; + } else { + return c === 1 ? '1' : '-1'; + } + } + + return getResult(parts[0], count); + } + + }; + var postProcessors = {}; + var addPostProcessor = function(name, fc) { + postProcessors[name] = fc; + }; + // sprintf support + var sprintf = (function() { + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + function str_repeat(input, multiplier) { + for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} + return output.join(''); + } + + var str_format = function() { + if (!str_format.cache.hasOwnProperty(arguments[0])) { + str_format.cache[arguments[0]] = str_format.parse(arguments[0]); + } + return str_format.format.call(null, str_format.cache[arguments[0]], arguments); + }; + + str_format.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { + throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = Math.abs(arg); break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + str_format.cache = {}; + + str_format.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw('[sprintf] huh?'); + } + } + } + else { + throw('[sprintf] huh?'); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw('[sprintf] huh?'); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + return str_format; + })(); + + var vsprintf = function(fmt, argv) { + argv.unshift(fmt); + return sprintf.apply(null, argv); + }; + + addPostProcessor("sprintf", function(val, key, opts) { + if (!opts.sprintf) return val; + + if (Object.prototype.toString.apply(opts.sprintf) === '[object Array]') { + return vsprintf(val, opts.sprintf); + } else if (typeof opts.sprintf === 'object') { + return sprintf(val, opts.sprintf); + } + + return val; + }); + // public api interface + TAPi18next.init = init; + TAPi18next.setLng = setLng; + TAPi18next.preload = preload; + TAPi18next.addResourceBundle = addResourceBundle; + TAPi18next.removeResourceBundle = removeResourceBundle; + TAPi18next.loadNamespace = loadNamespace; + TAPi18next.loadNamespaces = loadNamespaces; + TAPi18next.setDefaultNamespace = setDefaultNamespace; + TAPi18next.t = translate; + TAPi18next.translate = translate; + TAPi18next.exists = exists; + TAPi18next.detectLanguage = f.detectLanguage; + TAPi18next.pluralExtensions = pluralExtensions; + TAPi18next.sync = sync; + TAPi18next.functions = f; + TAPi18next.lng = lng; + TAPi18next.addPostProcessor = addPostProcessor; + TAPi18next.options = o; +})(); diff --git a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js new file mode 100644 index 000000000..8c2010744 --- /dev/null +++ b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js @@ -0,0 +1 @@ +TAPi18next.init({resStore: {}, fallbackLng: globals.fallback_language, useCookie: false}); diff --git a/packages/wekan-tap-i18n/package.js b/packages/wekan-tap-i18n/package.js new file mode 100644 index 000000000..3c947c00f --- /dev/null +++ b/packages/wekan-tap-i18n/package.js @@ -0,0 +1,78 @@ +Package.describe({ + name: 'wekan-tap-i18n', + summary: 'A comprehensive internationalization solution for Meteor', + version: '1.8.1', + git: 'https://github.com/TAPevents/tap-i18n' +}); + +both = ['server', 'client']; +server = 'server'; +client = 'client'; + +Package.onUse(function (api) { + api.versionsFrom('0.9.4'); + + api.use('coffeescript', both); + api.use('underscore', both); + api.use('meteor', both); + + api.use('raix:eventemitter@0.1.1', both); + api.use('meteorspark:util@0.2.0', both); + + api.use('tracker', both); + api.use('session', client); + api.use('jquery', client); + api.use('templating', client); + + // load TAPi18n + api.addFiles('lib/globals.js', both); + + // load and init TAPi18next + api.addFiles('lib/tap_i18next/tap_i18next-1.7.3.js', both); + api.export('TAPi18next'); + api.addFiles('lib/tap_i18next/tap_i18next_init.js', both); + + api.addFiles('lib/tap_i18n/tap_i18n-helpers.coffee', both); + + // We use the bare option since we need TAPi18n in the package level and + // coffee adds vars to all (so without bare all vars are in the file level) + api.addFiles('lib/tap_i18n/tap_i18n-common.coffee', server); + api.addFiles('lib/tap_i18n/tap_i18n-common.coffee', client, {bare: true}); + + api.addFiles('lib/tap_i18n/tap_i18n-server.coffee', server); + api.addFiles('lib/tap_i18n/tap_i18n-client.coffee', client, {bare: true}); + + api.addFiles('lib/tap_i18n/tap_i18n-init.coffee', server); + api.addFiles('lib/tap_i18n/tap_i18n-init.coffee', client, {bare: true}); + + api.export('TAPi18n'); +}); + +Package.registerBuildPlugin({ + name: 'tap-i18n-compiler', + use: ['coffeescript', 'underscore', 'aldeed:simple-schema@1.3.0', 'check@1.0.3', 'templating'], + npmDependencies: { + "node-json-minify": "0.1.3-a", + "yamljs": "0.2.4" + }, + sources: [ + 'lib/globals.js', + + 'lib/plugin/etc/language_names.js', + + 'lib/plugin/compiler_configuration.coffee', + + 'lib/plugin/helpers/helpers.coffee', + 'lib/plugin/helpers/load_json.coffee', + 'lib/plugin/helpers/load_yml.coffee', + 'lib/plugin/helpers/compile_step_helpers.coffee', + + 'lib/plugin/compilers/share.coffee', + 'lib/plugin/compilers/i18n.coffee', + 'lib/plugin/compilers/project-tap.i18n.coffee', + 'lib/plugin/compilers/package-tap.i18n.coffee', + 'lib/plugin/compilers/i18n.generic_compiler.coffee', + 'lib/plugin/compilers/i18n.json.coffee', + 'lib/plugin/compilers/i18n.yml.coffee' + ] +}); diff --git a/server/accounts-lockout.js b/server/accounts-lockout.js deleted file mode 100644 index 4b9854cfb..000000000 --- a/server/accounts-lockout.js +++ /dev/null @@ -1,26 +0,0 @@ -Meteor.startup(() => { - // https://atmospherejs.com/lucasantoniassi/accounts-lockout - // server - - if (Meteor.isServer) { - import { AccountsLockout } from 'meteor/wekan-accounts-lockout'; - - new AccountsLockout({ - knownUsers: { - failuresBeforeLockout: - process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3, - lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60, - failureWindow: - process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15, - }, - unknownUsers: { - failuresBeforeLockout: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3, - lockoutPeriod: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60, - failureWindow: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15, - }, - }).startup(); - } -}); diff --git a/server/migrations.js b/server/migrations.js index 5b6f05296..08a5cc72f 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -77,6 +77,7 @@ Migrations.add('lowercase-board-permission', () => { }); }); +/* // Security migration: see https://github.com/wekan/wekan/issues/99 Migrations.add('change-attachments-type-for-non-images', () => { const newTypeForNonImage = 'application/octet-stream'; @@ -106,6 +107,8 @@ Migrations.add('card-covers', () => { Attachments.update({}, { $unset: { cover: '' } }, noValidateMulti); }); +*/ + Migrations.add('use-css-class-for-boards-colors', () => { const associationTable = { '#27AE60': 'nephritis', diff --git a/server/publications/boards.js b/server/publications/boards.js index ed3cdce1d..695161946 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -311,7 +311,7 @@ Meteor.publishRelations('board', function(boardId, isArchived) { ), ); - this.cursor(presences.find({ userId: { $in: memberIds } })); + //this.cursor(presences.find({ userId: { $in: memberIds } })); } }, ); diff --git a/server/publications/fast-render.js b/server/publications/fast-render.js deleted file mode 100644 index 4829ad574..000000000 --- a/server/publications/fast-render.js +++ /dev/null @@ -1,9 +0,0 @@ -import { FastRender } from 'meteor/staringatlights:fast-render'; - -FastRender.onAllRoutes(function() { - this.subscribe('boards'); -}); - -FastRender.route('/b/:id/:slug', function({ id }) { - this.subscribe('board', id, false); -}); From 60af7766bfd34338e1cc3a77a7250a3e791180ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=BCster?= Date: Sat, 10 Jul 2021 10:55:54 +0200 Subject: [PATCH 002/246] Switch tap:i18n to custom TAPi18n implementation --- .meteor/packages | 12 +- .meteor/versions | 19 +- client/components/activities/activities.js | 1 + client/components/boards/boardBody.js | 2 + client/components/boards/boardHeader.js | 2 + client/components/boards/boardsList.js | 3 +- client/components/cards/cardCustomFields.js | 2 + client/components/cards/cardDate.js | 2 + client/components/cards/cardDetails.js | 3 +- client/components/cards/cardTime.js | 2 + client/components/cards/checklists.js | 1 + client/components/cards/minicard.js | 2 + client/components/lists/list.js | 1 + client/components/lists/listBody.js | 1 + client/components/lists/listHeader.js | 2 + client/components/main/globalSearch.js | 1 + client/components/main/layouts.js | 128 +- .../components/rules/triggers/cardTriggers.js | 2 + client/components/settings/adminReports.js | 1 + client/components/settings/informationBody.js | 2 + client/components/settings/settingBody.js | 1 + client/components/sidebar/sidebar.js | 2 + client/components/sidebar/sidebarArchives.js | 2 + .../components/sidebar/sidebarCustomFields.js | 2 + client/components/users/userHeader.js | 106 +- client/config/blazeHelpers.js | 10 + client/lib/cardSearch.js | 1 + client/lib/datepicker.js | 3 + client/lib/filter.js | 4 +- client/lib/i18n.js | 28 +- client/lib/popup.js | 2 + config/accounts.js | 5 +- config/query-classes.js | 3 +- config/router.js | 22 +- imports/i18n/accounts.js | 63 + imports/i18n/blaze.js | 8 + {i18n => imports/i18n/data}/ar-EG.i18n.json | 0 {i18n => imports/i18n/data}/ar.i18n.json | 0 {i18n => imports/i18n/data}/bg.i18n.json | 0 {i18n => imports/i18n/data}/br.i18n.json | 0 {i18n => imports/i18n/data}/ca.i18n.json | 0 {i18n => imports/i18n/data}/cs.i18n.json | 0 {i18n => imports/i18n/data}/da.i18n.json | 0 {i18n => imports/i18n/data}/de-AT.i18n.json | 0 {i18n => imports/i18n/data}/de-CH.i18n.json | 0 {i18n => imports/i18n/data}/de.i18n.json | 0 {i18n => imports/i18n/data}/el-GR.i18n.json | 0 imports/i18n/data/el.i18n.json | 1148 +++++++ {i18n => imports/i18n/data}/en-DE.i18n.json | 0 {i18n => imports/i18n/data}/en-GB.i18n.json | 0 {i18n => imports/i18n/data}/en-IT.i18n.json | 0 {i18n => imports/i18n/data}/en.i18n.json | 0 {i18n => imports/i18n/data}/eo.i18n.json | 0 {i18n => imports/i18n/data}/es-AR.i18n.json | 0 {i18n => imports/i18n/data}/es-CL.i18n.json | 0 {i18n => imports/i18n/data}/es-LA.i18n.json | 0 {i18n => imports/i18n/data}/es-MX.i18n.json | 0 {i18n => imports/i18n/data}/es-PE.i18n.json | 0 {i18n => imports/i18n/data}/es-PY.i18n.json | 0 {i18n => imports/i18n/data}/es.i18n.json | 0 {i18n => imports/i18n/data}/et-EE.i18n.json | 0 {i18n => imports/i18n/data}/eu.i18n.json | 0 {i18n => imports/i18n/data}/fa-IR.i18n.json | 0 {i18n => imports/i18n/data}/fa.i18n.json | 0 {i18n => imports/i18n/data}/fi.i18n.json | 0 {i18n => imports/i18n/data}/fr-CH.i18n.json | 0 {i18n => imports/i18n/data}/fr.i18n.json | 0 {i18n => imports/i18n/data}/gl-ES.i18n.json | 0 {i18n => imports/i18n/data}/gl.i18n.json | 0 {i18n => imports/i18n/data}/gu-IN.i18n.json | 0 {i18n => imports/i18n/data}/he.i18n.json | 0 {i18n => imports/i18n/data}/hi-IN.i18n.json | 0 {i18n => imports/i18n/data}/hi.i18n.json | 0 {i18n => imports/i18n/data}/hr.i18n.json | 0 {i18n => imports/i18n/data}/hu.i18n.json | 0 {i18n => imports/i18n/data}/hy.i18n.json | 0 {i18n => imports/i18n/data}/id.i18n.json | 0 {i18n => imports/i18n/data}/ig.i18n.json | 0 {i18n => imports/i18n/data}/it.i18n.json | 0 {i18n => imports/i18n/data}/ja.i18n.json | 0 {i18n => imports/i18n/data}/ka.i18n.json | 0 {i18n => imports/i18n/data}/km.i18n.json | 0 {i18n => imports/i18n/data}/ko.i18n.json | 0 {i18n => imports/i18n/data}/lt.i18n.json | 0 {i18n => imports/i18n/data}/lv.i18n.json | 0 {i18n => imports/i18n/data}/mk.i18n.json | 0 {i18n => imports/i18n/data}/mn.i18n.json | 0 {i18n => imports/i18n/data}/ms-MY.i18n.json | 0 {i18n => imports/i18n/data}/nb.i18n.json | 0 {i18n => imports/i18n/data}/nl.i18n.json | 0 {i18n => imports/i18n/data}/oc.i18n.json | 0 {i18n => imports/i18n/data}/pa.i18n.json | 0 {i18n => imports/i18n/data}/pl.i18n.json | 0 {i18n => imports/i18n/data}/pt-BR.i18n.json | 0 {i18n => imports/i18n/data}/pt.i18n.json | 0 {i18n => imports/i18n/data}/ro.i18n.json | 0 {i18n => imports/i18n/data}/ru-UA.i18n.json | 0 {i18n => imports/i18n/data}/ru.i18n.json | 0 {i18n => imports/i18n/data}/sk.i18n.json | 0 {i18n => imports/i18n/data}/sl.i18n.json | 0 {i18n => imports/i18n/data}/sr.i18n.json | 0 {i18n => imports/i18n/data}/sv.i18n.json | 0 {i18n => imports/i18n/data}/sw.i18n.json | 0 {i18n => imports/i18n/data}/ta.i18n.json | 0 {i18n => imports/i18n/data}/th.i18n.json | 0 {i18n => imports/i18n/data}/tr.i18n.json | 0 .../i18n/data/ua-UA.i18n.json | 0 .../i18n/data/ua.i18n.json | 0 {i18n => imports/i18n/data}/vi.i18n.json | 0 {i18n => imports/i18n/data}/zh-CN.i18n.json | 0 {i18n => imports/i18n/data}/zh-HK.i18n.json | 0 {i18n => imports/i18n/data}/zh-TW.i18n.json | 0 imports/i18n/index.js | 14 + imports/i18n/languages.js | 470 +++ imports/i18n/moment.js | 13 + imports/i18n/tap.js | 60 + models/boards.js | 3 +- models/cards.js | 1 + models/exportExcel.js | 5 +- models/exportPDF.js | 1 + models/exporter.js | 4 +- models/server/ExporterExcel.js | 16 +- models/settings.js | 1 + models/trelloCreator.js | 3 + models/users.js | 1 + models/wekanCreator.js | 2 + package-lock.json | 58 +- package.json | 12 +- packages/wekan-tap-i18n/ChangeLog | 216 -- packages/wekan-tap-i18n/LICENSE | 21 - packages/wekan-tap-i18n/README.md | 808 ----- packages/wekan-tap-i18n/TODO | 3 - packages/wekan-tap-i18n/lib/globals.js | 10 - .../lib/plugin/compiler_configuration.coffee | 23 - .../lib/plugin/compilers/i18n.coffee | 18 - .../compilers/i18n.generic_compiler.coffee | 124 - .../lib/plugin/compilers/i18n.json.coffee | 4 - .../lib/plugin/compilers/i18n.yml.coffee | 4 - .../plugin/compilers/package-tap.i18n.coffee | 95 - .../plugin/compilers/project-tap.i18n.coffee | 122 - .../lib/plugin/compilers/share.coffee | 1 - .../lib/plugin/etc/language_names.js | 136 - .../helpers/compile_step_helpers.coffee | 23 - .../lib/plugin/helpers/helpers.coffee | 1 - .../lib/plugin/helpers/load_json.coffee | 25 - .../lib/plugin/helpers/load_yml.coffee | 25 - .../lib/tap_i18n/tap_i18n-client.coffee | 198 -- .../lib/tap_i18n/tap_i18n-common.coffee | 143 - .../lib/tap_i18n/tap_i18n-helpers.coffee | 1 - .../lib/tap_i18n/tap_i18n-init.coffee | 1 - .../lib/tap_i18n/tap_i18n-server.coffee | 85 - .../lib/tap_i18next/tap_i18next-1.7.3.js | 2748 ----------------- .../lib/tap_i18next/tap_i18next_init.js | 1 - packages/wekan-tap-i18n/package.js | 78 - server/migrations.js | 1 + server/notifications/email.js | 1 + server/notifications/outgoing.js | 2 + 157 files changed, 1991 insertions(+), 5190 deletions(-) create mode 100644 imports/i18n/accounts.js create mode 100644 imports/i18n/blaze.js rename {i18n => imports/i18n/data}/ar-EG.i18n.json (100%) rename {i18n => imports/i18n/data}/ar.i18n.json (100%) rename {i18n => imports/i18n/data}/bg.i18n.json (100%) rename {i18n => imports/i18n/data}/br.i18n.json (100%) rename {i18n => imports/i18n/data}/ca.i18n.json (100%) rename {i18n => imports/i18n/data}/cs.i18n.json (100%) rename {i18n => imports/i18n/data}/da.i18n.json (100%) rename {i18n => imports/i18n/data}/de-AT.i18n.json (100%) rename {i18n => imports/i18n/data}/de-CH.i18n.json (100%) rename {i18n => imports/i18n/data}/de.i18n.json (100%) rename {i18n => imports/i18n/data}/el-GR.i18n.json (100%) create mode 100644 imports/i18n/data/el.i18n.json rename {i18n => imports/i18n/data}/en-DE.i18n.json (100%) rename {i18n => imports/i18n/data}/en-GB.i18n.json (100%) rename {i18n => imports/i18n/data}/en-IT.i18n.json (100%) rename {i18n => imports/i18n/data}/en.i18n.json (100%) rename {i18n => imports/i18n/data}/eo.i18n.json (100%) rename {i18n => imports/i18n/data}/es-AR.i18n.json (100%) rename {i18n => imports/i18n/data}/es-CL.i18n.json (100%) rename {i18n => imports/i18n/data}/es-LA.i18n.json (100%) rename {i18n => imports/i18n/data}/es-MX.i18n.json (100%) rename {i18n => imports/i18n/data}/es-PE.i18n.json (100%) rename {i18n => imports/i18n/data}/es-PY.i18n.json (100%) rename {i18n => imports/i18n/data}/es.i18n.json (100%) rename {i18n => imports/i18n/data}/et-EE.i18n.json (100%) rename {i18n => imports/i18n/data}/eu.i18n.json (100%) rename {i18n => imports/i18n/data}/fa-IR.i18n.json (100%) rename {i18n => imports/i18n/data}/fa.i18n.json (100%) rename {i18n => imports/i18n/data}/fi.i18n.json (100%) rename {i18n => imports/i18n/data}/fr-CH.i18n.json (100%) rename {i18n => imports/i18n/data}/fr.i18n.json (100%) rename {i18n => imports/i18n/data}/gl-ES.i18n.json (100%) rename {i18n => imports/i18n/data}/gl.i18n.json (100%) rename {i18n => imports/i18n/data}/gu-IN.i18n.json (100%) rename {i18n => imports/i18n/data}/he.i18n.json (100%) rename {i18n => imports/i18n/data}/hi-IN.i18n.json (100%) rename {i18n => imports/i18n/data}/hi.i18n.json (100%) rename {i18n => imports/i18n/data}/hr.i18n.json (100%) rename {i18n => imports/i18n/data}/hu.i18n.json (100%) rename {i18n => imports/i18n/data}/hy.i18n.json (100%) rename {i18n => imports/i18n/data}/id.i18n.json (100%) rename {i18n => imports/i18n/data}/ig.i18n.json (100%) rename {i18n => imports/i18n/data}/it.i18n.json (100%) rename {i18n => imports/i18n/data}/ja.i18n.json (100%) rename {i18n => imports/i18n/data}/ka.i18n.json (100%) rename {i18n => imports/i18n/data}/km.i18n.json (100%) rename {i18n => imports/i18n/data}/ko.i18n.json (100%) rename {i18n => imports/i18n/data}/lt.i18n.json (100%) rename {i18n => imports/i18n/data}/lv.i18n.json (100%) rename {i18n => imports/i18n/data}/mk.i18n.json (100%) rename {i18n => imports/i18n/data}/mn.i18n.json (100%) rename {i18n => imports/i18n/data}/ms-MY.i18n.json (100%) rename {i18n => imports/i18n/data}/nb.i18n.json (100%) rename {i18n => imports/i18n/data}/nl.i18n.json (100%) rename {i18n => imports/i18n/data}/oc.i18n.json (100%) rename {i18n => imports/i18n/data}/pa.i18n.json (100%) rename {i18n => imports/i18n/data}/pl.i18n.json (100%) rename {i18n => imports/i18n/data}/pt-BR.i18n.json (100%) rename {i18n => imports/i18n/data}/pt.i18n.json (100%) rename {i18n => imports/i18n/data}/ro.i18n.json (100%) rename {i18n => imports/i18n/data}/ru-UA.i18n.json (100%) rename {i18n => imports/i18n/data}/ru.i18n.json (100%) rename {i18n => imports/i18n/data}/sk.i18n.json (100%) rename {i18n => imports/i18n/data}/sl.i18n.json (100%) rename {i18n => imports/i18n/data}/sr.i18n.json (100%) rename {i18n => imports/i18n/data}/sv.i18n.json (100%) rename {i18n => imports/i18n/data}/sw.i18n.json (100%) rename {i18n => imports/i18n/data}/ta.i18n.json (100%) rename {i18n => imports/i18n/data}/th.i18n.json (100%) rename {i18n => imports/i18n/data}/tr.i18n.json (100%) rename i18n/uk-UA.i18n.json => imports/i18n/data/ua-UA.i18n.json (100%) rename i18n/uk.i18n.json => imports/i18n/data/ua.i18n.json (100%) rename {i18n => imports/i18n/data}/vi.i18n.json (100%) rename {i18n => imports/i18n/data}/zh-CN.i18n.json (100%) rename {i18n => imports/i18n/data}/zh-HK.i18n.json (100%) rename {i18n => imports/i18n/data}/zh-TW.i18n.json (100%) create mode 100644 imports/i18n/index.js create mode 100644 imports/i18n/languages.js create mode 100644 imports/i18n/moment.js create mode 100644 imports/i18n/tap.js delete mode 100644 packages/wekan-tap-i18n/ChangeLog delete mode 100644 packages/wekan-tap-i18n/LICENSE delete mode 100644 packages/wekan-tap-i18n/README.md delete mode 100644 packages/wekan-tap-i18n/TODO delete mode 100644 packages/wekan-tap-i18n/lib/globals.js delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/etc/language_names.js delete mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee delete mode 100644 packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js delete mode 100644 packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js delete mode 100644 packages/wekan-tap-i18n/package.js diff --git a/.meteor/packages b/.meteor/packages index 218cce0f0..2b46496ad 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -41,10 +41,11 @@ kadira:dochead mquandalle:autofocus ongoworks:speakingurl raix:handlebar-helpers -http@2.0.0 +http@2.0.0! # force new http package # UI components blaze +ostrio:i18n reactive-var@1.0.11 fortawesome:fontawesome mousetrap:mousetrap @@ -59,9 +60,7 @@ email@2.1.1 horka:swipebox dynamic-import@0.7.1 rzymek:fullcalendar -momentjs:moment@2.22.2 browser-policy-framing@1.1.0 -mquandalle:moment msavin:usercache # Keep stylus in 1.1.0, because building v2 takes extra 52 minutes. coagmano:stylus@1.1.0! @@ -124,8 +123,13 @@ pascoual:pdfkit lmieulet:meteor-coverage meteortesting:mocha aldeed:simple-schema -accounts-password@2.0.0 +accounts-password matb33:collection-hooks simple:json-routes kadira:flow-router spacebars +communitypackages:picker +useraccounts:core +useraccounts:unstyled +useraccounts:flow-routing +service-configuration diff --git a/.meteor/versions b/.meteor/versions index 5f85a4cf8..1db92d8e4 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -20,8 +20,7 @@ browser-policy-common@1.0.11 browser-policy-framing@1.1.0 caching-compiler@1.2.2 caching-html-compiler@1.2.1 -callback-hook@1.3.1 -cfs:http-methods@0.0.32 +callback-hook@1.4.0 check@1.3.1 coagmano:stylus@1.1.0 coffeescript@2.4.1 @@ -77,7 +76,6 @@ meteorhacks:aggregate@1.3.0 meteorhacks:collection-utils@1.2.0 meteorhacks:picker@1.0.3 meteorhacks:subs-manager@1.6.4 -meteorspark:util@0.2.0 meteortesting:browser-tests@0.2.0 meteortesting:mocha@0.6.0 minifier-css@1.5.4 @@ -100,15 +98,14 @@ mquandalle:collection-mutations@0.1.0 mquandalle:jade@0.4.9 mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 -mquandalle:jquery-ui-drag-drop-sort@0.2.0 -mquandalle:moment@1.0.1 mquandalle:mousetrap-bindglobal@0.0.1 -mrt:just-i18n@0.3.0 msavin:usercache@1.8.0 npm-mongo@3.9.1 observe-sequence@1.0.19 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 +ostrio:cstorage@2.2.2 +ostrio:i18n@3.1.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 peerlibrary:base-component@0.17.1 @@ -186,9 +183,8 @@ simple:json-routes@2.1.0 socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 -standard-minifier-css@1.7.3 -standard-minifier-js@2.6.1 -tap:i18n@1.8.2 +standard-minifier-css@1.7.4 +standard-minifier-js@2.8.0 templates:tabs@2.3.0 templating@1.4.1 templating-compiler@1.4.1 @@ -199,7 +195,10 @@ twbs:bootstrap@3.3.6 ui@1.0.13 underscore@1.0.10 url@1.3.2 -webapp@1.11.1 +useraccounts:core@1.16.2 +useraccounts:flow-routing@1.15.0 +useraccounts:unstyled@1.14.2 +webapp@1.13.0 webapp-hashing@1.1.0 wekan-markdown@1.0.9 zimme:active-route@2.3.2 diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index cc5237097..4470f72de 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -1,4 +1,5 @@ import DOMPurify from 'dompurify'; +import { TAPi18n } from '/imports/i18n'; const activitiesPerPage = 500; diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index 81846f2ee..d52404a86 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + const subManager = new SubsManager(); const { calculateIndex } = Utils; const swimlaneWhileSortingHeight = 150; diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index ed7d9490e..fb8a5ed5c 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + /* const DOWNCLS = 'fa-sort-down'; const UPCLS = 'fa-sort-up'; diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index a5b1ccb51..37665b8b9 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + const subManager = new SubsManager(); Template.boardListHeaderBar.events({ @@ -33,7 +35,6 @@ BlazeComponent.extendComponent({ } if (userLanguage) { TAPi18n.setLanguage(userLanguage); - T9n.setLanguage(userLanguage); } }, diff --git a/client/components/cards/cardCustomFields.js b/client/components/cards/cardCustomFields.js index 7686bbeb9..6dafd8e4d 100644 --- a/client/components/cards/cardCustomFields.js +++ b/client/components/cards/cardCustomFields.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; import Cards from '/models/cards'; diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 685f79e3a..ca3af61c0 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; Template.dateBadge.helpers({ diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 110e64bf6..d749d9b2a 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; import Cards from '/models/cards'; import Boards from '/models/boards'; @@ -7,7 +9,6 @@ import Users from '/models/users'; import Lists from '/models/lists'; import CardComments from '/models/cardComments'; import { ALLOWED_COLORS } from '/config/const'; -import moment from 'moment'; import { UserAvatar } from '../users/userAvatar'; const subManager = new SubsManager(); diff --git a/client/components/cards/cardTime.js b/client/components/cards/cardTime.js index 984f048e1..b9a24c0a4 100644 --- a/client/components/cards/cardTime.js +++ b/client/components/cards/cardTime.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + BlazeComponent.extendComponent({ template() { return 'editCardSpentTime'; diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 568b76108..cb64c1a37 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import Cards from '/models/cards'; import Boards from '/models/boards'; diff --git a/client/components/cards/minicard.js b/client/components/cards/minicard.js index 6a2057c34..e1a642ee0 100644 --- a/client/components/cards/minicard.js +++ b/client/components/cards/minicard.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + // Template.cards.events({ // 'click .member': Popup.open('cardMember') // }); diff --git a/client/components/lists/list.js b/client/components/lists/list.js index 0f953ae36..7d3483b1e 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; require('/client/lib/jquery-ui.js') const { calculateIndex } = Utils; diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 3a368c344..6cf1ebb4b 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { Spinner } from '/client/lib/spinner'; const subManager = new SubsManager(); diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 547ba1bc8..95d05e28e 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + let listsColors; Meteor.startup(() => { listsColors = Lists.simpleSchema()._schema.color.allowedValues; diff --git a/client/components/main/globalSearch.js b/client/components/main/globalSearch.js index f74393917..3a8a84b52 100644 --- a/client/components/main/globalSearch.js +++ b/client/components/main/globalSearch.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { CardSearchPagedComponent } from '../../lib/cardSearch'; import Boards from '../../../models/boards'; import { Query, QueryErrors } from '../../../config/query-classes'; diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index f78791102..e9b153b92 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -1,10 +1,6 @@ -BlazeLayout.setRoot('body'); +import { TAPi18n } from '/imports/i18n'; -const i18nTagToT9n = i18nTag => { - // t9n/i18n tags are same now, see: https://github.com/softwarerero/meteor-accounts-t9n/pull/129 - // but we keep this conversion function here, to be aware that that they are different system. - return i18nTag; -}; +BlazeLayout.setRoot('body'); let alreadyCheck = 1; let isCheckDone = false; @@ -60,11 +56,6 @@ Template.userFormsLayout.onRendered(() => { AccountsTemplates.state.form.keys, validator, ); - - const i18nTag = navigator.language; - if (i18nTag) { - T9n.setLanguage(i18nTagToT9n(i18nTag)); - } EscapeActions.executeAll(); }); @@ -89,11 +80,11 @@ Template.userFormsLayout.helpers({ getLegalNoticeWithWritTraduction(){ let spanLegalNoticeElt = $("#legalNoticeSpan"); if(spanLegalNoticeElt != null && spanLegalNoticeElt != undefined){ - spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {}, T9n.getLanguage() || 'en')); + spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {})); } let atLinkLegalNoticeElt = $("#legalNoticeAtLink"); if(atLinkLegalNoticeElt != null && atLinkLegalNoticeElt != undefined){ - atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {}, T9n.getLanguage() || 'en')); + atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {})); } return true; }, @@ -111,112 +102,27 @@ Template.userFormsLayout.helpers({ }, languages() { - return _.map(TAPi18n.getLanguages(), (lang, code) => { - const tag = code; - let name = lang.name; - if (lang.name === 'br') { - name = 'Brezhoneg'; - } else if (lang.name === 'ar-EG') { - // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo) - name = 'مَصرى'; - } else if (lang.name === 'de-CH') { - name = 'Deutsch (Schweiz)'; - } else if (lang.name === 'de-AT') { - name = 'Deutsch (Österreich)'; - } else if (lang.name === 'en-DE') { - name = 'English (Germany)'; - } else if (lang.name === 'et-EE') { - name = 'eesti keel (Eesti)'; - } else if (lang.name === 'fa-IR') { - // fa-IR = Persian (Iran) - name = 'فارسی/پارسی (ایران‎)'; - } else if (lang.name === 'fr-BE') { - name = 'Français (Belgique)'; - } else if (lang.name === 'fr-CA') { - name = 'Français (Canada)'; - } else if (lang.name === 'fr-CH') { - name = 'Français (Schweiz)'; - } else if (lang.name === 'gu-IN') { - // gu-IN = Gurajati (India) - name = 'ગુજરાતી'; - } else if (lang.name === 'hi-IN') { - // hi-IN = Hindi (India) - name = 'हिंदी (भारत)'; - } else if (lang.name === 'ig') { - name = 'Igbo'; - } else if (lang.name === 'lv') { - name = 'Latviešu'; - } else if (lang.name === 'latviešu valoda') { - name = 'Latviešu'; - } else if (lang.name === 'ms-MY') { - // ms-MY = Malay (Malaysia) - name = 'بهاس ملايو'; - } else if (lang.name === 'en-IT') { - name = 'English (Italy)'; - } else if (lang.name === 'el-GR') { - // el-GR = Greek (Greece) - name = 'Ελληνικά (Ελλάδα)'; - } else if (lang.name === 'Español') { - name = 'español'; - } else if (lang.name === 'es_419') { - name = 'español de América Latina'; - } else if (lang.name === 'es-419') { - name = 'español de América Latina'; - } else if (lang.name === 'Español de América Latina') { - name = 'español de América Latina'; - } else if (lang.name === 'es-LA') { - name = 'español de América Latina'; - } else if (lang.name === 'Español de Argentina') { - name = 'español de Argentina'; - } else if (lang.name === 'Español de Chile') { - name = 'español de Chile'; - } else if (lang.name === 'Español de Colombia') { - name = 'español de Colombia'; - } else if (lang.name === 'Español de México') { - name = 'español de México'; - } else if (lang.name === 'es-PY') { - name = 'español de Paraguayo'; - } else if (lang.name === 'Español de Paraguayo') { - name = 'español de Paraguayo'; - } else if (lang.name === 'Español de Perú') { - name = 'español de Perú'; - } else if (lang.name === 'Español de Puerto Rico') { - name = 'español de Puerto Rico'; - } else if (lang.name === 'gl-ES') { - name = 'Galego (España)'; - } else if (lang.name === 'oc') { - name = 'Occitan'; - } else if (lang.name === 'ru-UA') { - name = 'Русский (Украина)'; - } else if (lang.name === 'st') { - name = 'Sãotomense'; - } else if (lang.name === 'uk-UA') { - name = 'українська (Україна)'; - } else if (lang.name === '繁体中文(台湾)') { - // Traditional Chinese (Taiwan) - name = '繁體中文(台灣)'; - } - return { tag, name }; - }).sort(function(a, b) { - if (a.name === b.name) { - return 0; - } else { - return a.name > b.name ? 1 : -1; - } - }); + return TAPi18n.getSupportedLanguages() + .map(({ isoCode, name }) => ({ tag: isoCode, name })) + .sort((a, b) => { + if (a.name === b.name) { + return 0; + } else { + return a.name > b.name ? 1 : -1; + } + }); }, isCurrentLanguage() { - const t9nTag = i18nTagToT9n(this.tag); - const curLang = T9n.getLanguage() || 'en'; - return t9nTag === curLang; + const curLang = TAPi18n.getLanguage(); + return this.tag === curLang; }, }); Template.userFormsLayout.events({ 'change .js-userform-set-language'(event) { - const i18nTag = $(event.currentTarget).val(); - T9n.setLanguage(i18nTagToT9n(i18nTag)); + const tag = $(event.currentTarget).val(); + TAPi18n.setLanguage(tag); event.preventDefault(); }, 'click #at-btn'(event, templateInstance) { diff --git a/client/components/rules/triggers/cardTriggers.js b/client/components/rules/triggers/cardTriggers.js index 8d4ec52e3..fbe064a76 100644 --- a/client/components/rules/triggers/cardTriggers.js +++ b/client/components/rules/triggers/cardTriggers.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + BlazeComponent.extendComponent({ onCreated() { this.subscribe('allRules'); diff --git a/client/components/settings/adminReports.js b/client/components/settings/adminReports.js index 6dcbb0fc4..341eb4e39 100644 --- a/client/components/settings/adminReports.js +++ b/client/components/settings/adminReports.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { AttachmentStorage } from '/models/attachments'; import { CardSearchPagedComponent } from '/client/lib/cardSearch'; import SessionData from '/models/usersessiondata'; diff --git a/client/components/settings/informationBody.js b/client/components/settings/informationBody.js index 4775bce67..6bab8b3ac 100644 --- a/client/components/settings/informationBody.js +++ b/client/components/settings/informationBody.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + BlazeComponent.extendComponent({ onCreated() { this.info = new ReactiveVar({}); diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 71a286fdb..8d0797966 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { ALLOWED_WAIT_SPINNERS } from '/config/const'; BlazeComponent.extendComponent({ diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index a1943a8f0..ae42a3f8d 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + Sidebar = null; const defaultView = 'home'; diff --git a/client/components/sidebar/sidebarArchives.js b/client/components/sidebar/sidebarArchives.js index 32a23b0d0..d535d0822 100644 --- a/client/components/sidebar/sidebarArchives.js +++ b/client/components/sidebar/sidebarArchives.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + //archivedRequested = false; const subManager = new SubsManager(); diff --git a/client/components/sidebar/sidebarCustomFields.js b/client/components/sidebar/sidebarCustomFields.js index 0a35b08e6..61b1cb2d8 100644 --- a/client/components/sidebar/sidebarCustomFields.js +++ b/client/components/sidebar/sidebarCustomFields.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + BlazeComponent.extendComponent({ customFields() { return CustomFields.find({ diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 28729d6f0..92f6f37eb 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + Template.headerUserBar.events({ 'click .js-open-header-member-menu': Popup.open('memberMenu'), 'click .js-change-avatar': Popup.open('changeAvatar'), @@ -256,101 +258,15 @@ Template.changePasswordPopup.onRendered(function() { Template.changeLanguagePopup.helpers({ languages() { - return _.map(TAPi18n.getLanguages(), (lang, code) => { - // Same code in /client/components/main/layouts.js - // TODO : Make code reusable - const tag = code; - let name = lang.name; - if (lang.name === 'br') { - name = 'Brezhoneg'; - } else if (lang.name === 'ar-EG') { - // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo) - name = 'مَصرى'; - } else if (lang.name === 'de-CH') { - name = 'Deutsch (Schweiz)'; - } else if (lang.name === 'de-AT') { - name = 'Deutsch (Österreich)'; - } else if (lang.name === 'en-DE') { - name = 'English (Germany)'; - } else if (lang.name === 'et-EE') { - name = 'eesti keel (Eesti)'; - } else if (lang.name === 'fa-IR') { - // fa-IR = Persian (Iran) - name = 'فارسی/پارسی (ایران‎)'; - } else if (lang.name === 'fr-BE') { - name = 'Français (Belgique)'; - } else if (lang.name === 'fr-CA') { - name = 'Français (Canada)'; - } else if (lang.name === 'fr-CH') { - name = 'Français (Schweiz)'; - } else if (lang.name === 'gu-IN') { - // gu-IN = Gurajati (India) - name = 'ગુજરાતી'; - } else if (lang.name === 'hi-IN') { - // hi-IN = Hindi (India) - name = 'हिंदी (भारत)'; - } else if (lang.name === 'ig') { - name = 'Igbo'; - } else if (lang.name === 'lv') { - name = 'Latviešu'; - } else if (lang.name === 'latviešu valoda') { - name = 'Latviešu'; - } else if (lang.name === 'ms-MY') { - // ms-MY = Malay (Malaysia) - name = 'بهاس ملايو'; - } else if (lang.name === 'en-IT') { - name = 'English (Italy)'; - } else if (lang.name === 'el-GR') { - // el-GR = Greek (Greece) - name = 'Ελληνικά (Ελλάδα)'; - } else if (lang.name === 'Español') { - name = 'español'; - } else if (lang.name === 'es_419') { - name = 'español de América Latina'; - } else if (lang.name === 'es-419') { - name = 'español de América Latina'; - } else if (lang.name === 'Español de América Latina') { - name = 'español de América Latina'; - } else if (lang.name === 'es-LA') { - name = 'español de América Latina'; - } else if (lang.name === 'Español de Argentina') { - name = 'español de Argentina'; - } else if (lang.name === 'Español de Chile') { - name = 'español de Chile'; - } else if (lang.name === 'Español de Colombia') { - name = 'español de Colombia'; - } else if (lang.name === 'Español de México') { - name = 'español de México'; - } else if (lang.name === 'es-PY') { - name = 'español de Paraguayo'; - } else if (lang.name === 'Español de Paraguayo') { - name = 'español de Paraguayo'; - } else if (lang.name === 'Español de Perú') { - name = 'español de Perú'; - } else if (lang.name === 'Español de Puerto Rico') { - name = 'español de Puerto Rico'; - } else if (lang.name === 'gl-ES') { - name = 'Galego (España)'; - } else if (lang.name === 'oc') { - name = 'Occitan'; - } else if (lang.name === 'ru-UA') { - name = 'Русский (Украина)'; - } else if (lang.name === 'st') { - name = 'Sãotomense'; - } else if (lang.name === 'uk-UA') { - name = 'українська (Україна)'; - } else if (lang.name === '繁体中文(台湾)') { - // Traditional Chinese (Taiwan) - name = '繁體中文(台灣)'; - } - return { tag, name }; - }).sort(function(a, b) { - if (a.name === b.name) { - return 0; - } else { - return a.name > b.name ? 1 : -1; - } - }); + return TAPi18n.getSupportedLanguages() + .map(({ isoCode, name }) => ({ tag: isoCode, name })) + .sort((a, b) => { + if (a.name === b.name) { + return 0; + } else { + return a.name > b.name ? 1 : -1; + } + }); }, isCurrentLanguage() { diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index 22194f3bd..715803ef6 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -1,3 +1,7 @@ +import { Blaze } from 'meteor/blaze'; +import { Session } from 'meteor/session'; +import moment from 'moment'; + Blaze.registerHelper('currentBoard', () => { const ret = Utils.getCurrentBoard(); return ret; @@ -30,3 +34,9 @@ Blaze.registerHelper('isShowDesktopDragHandles', () => Blaze.registerHelper('isMiniScreenOrShowDesktopDragHandles', () => Utils.isMiniScreenOrShowDesktopDragHandles(), ); + +Blaze.registerHelper('moment', (...args) => { + args.pop(); // hash + const [date, format] = args; + return moment(date).format(format); +}); diff --git a/client/lib/cardSearch.js b/client/lib/cardSearch.js index 7fe74492b..28db79a79 100644 --- a/client/lib/cardSearch.js +++ b/client/lib/cardSearch.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import Cards from '../../models/cards'; import SessionData from '../../models/usersessiondata'; import {QueryDebug} from "../../config/query-classes"; diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index f57bcdaa3..7138c366b 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -1,3 +1,6 @@ +import { TAPi18n } from '/imports/i18n'; +import moment from 'moment'; + // Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours function adjustedTimeFormat() { return moment diff --git a/client/lib/filter.js b/client/lib/filter.js index 283dbcd07..d1d5669e9 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -1,3 +1,5 @@ +import moment from 'moment'; + // Filtered view manager // We define local filter objects for each different type of field (SetFilter, // RangeFilter, dateFilter, etc.). We then define a global `Filter` object whose @@ -721,7 +723,7 @@ Filter = { isFilterActive = true; selectors.push(this.advanced._getMongoSelector()); } - + if(isFilterActive) { return { $or: selectors, diff --git a/client/lib/i18n.js b/client/lib/i18n.js index dbce251e9..5d809c17b 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -1,27 +1,21 @@ +import { TAPi18n } from '/imports/i18n'; + // We save the user language preference in the user profile, and use that to set // the language reactively. If the user is not connected we use the language // information provided by the browser, and default to english. Meteor.startup(() => { - TAPi18n.conf.i18n_files_route = Meteor._relativeToSiteRootUrl('/tap-i18n'); const currentUser = Meteor.user(); - let language; - if (currentUser) { - language = currentUser.profile && currentUser.profile.language; - } - - if (!language) { - if (navigator.languages) { - language = navigator.languages[0]; - } else { - language = navigator.language || navigator.userLanguage; - } - } - + // Select first available language + const [language] = [ + // User profile + currentUser?.profile?.language, + // Browser locale + navigator.languages?.at(0), + navigator.language, + navigator.userLanguage, + ].filter(Boolean); if (language) { TAPi18n.setLanguage(language); - // eslint-disable-next-line no-console - // console.log('language set!'); - T9n.setLanguage(language); } }); diff --git a/client/lib/popup.js b/client/lib/popup.js index 01f34f92a..9eb72b662 100644 --- a/client/lib/popup.js +++ b/client/lib/popup.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + window.Popup = new (class { constructor() { // The template we use to render popups diff --git a/config/accounts.js b/config/accounts.js index a2046d0f1..7f6c22161 100644 --- a/config/accounts.js +++ b/config/accounts.js @@ -1,4 +1,5 @@ -/* +import { TAPi18n } from '/imports/i18n'; + const passwordField = AccountsTemplates.removeField('password'); const emailField = AccountsTemplates.removeField('email'); @@ -89,5 +90,3 @@ if (Meteor.isServer) { }; }); } - -*/ diff --git a/config/query-classes.js b/config/query-classes.js index a1abec3a1..be3b098f8 100644 --- a/config/query-classes.js +++ b/config/query-classes.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; import { OPERATOR_ASSIGNEE, OPERATOR_BOARD, @@ -46,7 +48,6 @@ import { PREDICATE_YEAR, } from './search-const'; import Boards from '../models/boards'; -import moment from 'moment'; export class QueryDebug { predicate = null; diff --git a/config/router.js b/config/router.js index cc1d2c5ea..e5b8fd273 100644 --- a/config/router.js +++ b/config/router.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + let previousPath; FlowRouter.triggers.exit([ ({ path }) => { @@ -7,7 +9,7 @@ FlowRouter.triggers.exit([ FlowRouter.route('/', { name: 'home', - //triggersEnter: [qAccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Session.set('currentBoard', null); Session.set('currentList', null); @@ -31,7 +33,7 @@ FlowRouter.route('/', { FlowRouter.route('/public', { name: 'public', - //triggersEnter: [AccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Session.set('currentBoard', null); Session.set('currentList', null); @@ -150,7 +152,7 @@ FlowRouter.route('/b/templates', { FlowRouter.route('/my-cards', { name: 'my-cards', - //triggersEnter: [AccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -170,7 +172,7 @@ FlowRouter.route('/my-cards', { FlowRouter.route('/due-cards', { name: 'due-cards', - //triggersEnter: [AccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -190,7 +192,7 @@ FlowRouter.route('/due-cards', { FlowRouter.route('/global-search', { name: 'global-search', - //triggersEnter: [AccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action() { Filter.reset(); Session.set('sortBy', ''); @@ -236,7 +238,7 @@ FlowRouter.route('/broken-cards', { FlowRouter.route('/import/:source', { name: 'import', - //triggersEnter: [AccountsTemplates.ensureSignedIn], + triggersEnter: [AccountsTemplates.ensureSignedIn], action(params) { if (Session.get('currentBoard')) { Session.set('fromBoard', Session.get('currentBoard')); @@ -261,7 +263,7 @@ FlowRouter.route('/import/:source', { FlowRouter.route('/setting', { name: 'setting', triggersEnter: [ - //AccountsTemplates.ensureSignedIn, + AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -286,7 +288,7 @@ FlowRouter.route('/setting', { FlowRouter.route('/information', { name: 'information', triggersEnter: [ - //AccountsTemplates.ensureSignedIn, + AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -310,7 +312,7 @@ FlowRouter.route('/information', { FlowRouter.route('/people', { name: 'people', triggersEnter: [ - //AccountsTemplates.ensureSignedIn, + AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); @@ -334,7 +336,7 @@ FlowRouter.route('/people', { FlowRouter.route('/admin-reports', { name: 'admin-reports', triggersEnter: [ - //AccountsTemplates.ensureSignedIn, + AccountsTemplates.ensureSignedIn, () => { Session.set('currentBoard', null); Session.set('currentList', null); diff --git a/imports/i18n/accounts.js b/imports/i18n/accounts.js new file mode 100644 index 000000000..124331dd6 --- /dev/null +++ b/imports/i18n/accounts.js @@ -0,0 +1,63 @@ +// Load all useraccounts translations at once +import { Tracker } from 'meteor/tracker'; +import { T9n } from 'meteor-accounts-t9n'; +import { TAPi18n } from './tap'; + +T9n.setTracker({ Tracker }); + +T9n.map('ar', require('meteor-accounts-t9n/build/ar').ar); +T9n.map('ca', require('meteor-accounts-t9n/build/ca').ca); +T9n.map('cs', require('meteor-accounts-t9n/build/cs').cs); +T9n.map('da', require('meteor-accounts-t9n/build/da').da); +T9n.map('de', require('meteor-accounts-t9n/build/de').de); +T9n.map('el', require('meteor-accounts-t9n/build/el').el); +T9n.map('en', require('meteor-accounts-t9n/build/en').en); +T9n.map('es', require('meteor-accounts-t9n/build/es').es); +T9n.map('es-ES', require('meteor-accounts-t9n/build/es_ES').es_ES); +T9n.map('es-ES-formal', require('meteor-accounts-t9n/build/es_ES_formal').es_ES_formal); +T9n.map('es-formal', require('meteor-accounts-t9n/build/es_formal').es_formal); +T9n.map('et', require('meteor-accounts-t9n/build/et').et); +T9n.map('fa', require('meteor-accounts-t9n/build/fa').fa); +T9n.map('fi', require('meteor-accounts-t9n/build/fi').fi); +T9n.map('fr', require('meteor-accounts-t9n/build/fr').fr); +T9n.map('fr-CA', require('meteor-accounts-t9n/build/fr_CA').fr_CA); +T9n.map('he', require('meteor-accounts-t9n/build/he').he); +T9n.map('hr', require('meteor-accounts-t9n/build/hr').hr); +T9n.map('hu', require('meteor-accounts-t9n/build/hu').hu); +T9n.map('id', require('meteor-accounts-t9n/build/id').id); +T9n.map('it', require('meteor-accounts-t9n/build/it').it); +T9n.map('ja', require('meteor-accounts-t9n/build/ja').ja); +T9n.map('kh', require('meteor-accounts-t9n/build/kh').kh); +T9n.map('ko', require('meteor-accounts-t9n/build/ko').ko); +T9n.map('nl', require('meteor-accounts-t9n/build/nl').nl); +T9n.map('no-NB', require('meteor-accounts-t9n/build/no_NB').no_NB); +T9n.map('pl', require('meteor-accounts-t9n/build/pl').pl); +T9n.map('pt', require('meteor-accounts-t9n/build/pt').pt); +T9n.map('pt-PT', require('meteor-accounts-t9n/build/pt_PT').pt_PT); +T9n.map('ro', require('meteor-accounts-t9n/build/ro').ro); +T9n.map('ru', require('meteor-accounts-t9n/build/ru').ru); +T9n.map('sk', require('meteor-accounts-t9n/build/sk').sk); +T9n.map('sl', require('meteor-accounts-t9n/build/sl').sl); +T9n.map('sv', require('meteor-accounts-t9n/build/sv').sv); +T9n.map('th', require('meteor-accounts-t9n/build/th').th); +T9n.map('tr', require('meteor-accounts-t9n/build/tr').tr); +T9n.map('uk', require('meteor-accounts-t9n/build/uk').uk); +T9n.map('vi', require('meteor-accounts-t9n/build/vi').vi); +T9n.map('zh-CN', require('meteor-accounts-t9n/build/zh_CN').zh_CN); +T9n.map('zh-HK', require('meteor-accounts-t9n/build/zh_HK').zh_HK); +T9n.map('zh-TW', require('meteor-accounts-t9n/build/zh_TW').zh_TW); + +// Reactively adjust useraccounts:core translations +Tracker.autorun(() => { + const language = TAPi18n.getLanguage(); + try { + T9n.setLanguage(language); + } catch (err) { + // Try to extract & set the language part only (e.g. "en" instead of "en-UK") + try { + T9n.setLanguage(language.split('-')[0]); + } catch (err) { + console.error(err); + } + } +}); diff --git a/imports/i18n/blaze.js b/imports/i18n/blaze.js new file mode 100644 index 000000000..fd8e393ce --- /dev/null +++ b/imports/i18n/blaze.js @@ -0,0 +1,8 @@ +import { Blaze } from 'meteor/blaze'; +import { TAPi18n } from './tap'; + +Blaze.registerHelper('_', (...args) => { + const { hash } = args.pop(); + const [key] = args.splice(0, 1); + return TAPi18n.__(key, { ...hash, sprintf: args }); +}); diff --git a/i18n/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json similarity index 100% rename from i18n/ar-EG.i18n.json rename to imports/i18n/data/ar-EG.i18n.json diff --git a/i18n/ar.i18n.json b/imports/i18n/data/ar.i18n.json similarity index 100% rename from i18n/ar.i18n.json rename to imports/i18n/data/ar.i18n.json diff --git a/i18n/bg.i18n.json b/imports/i18n/data/bg.i18n.json similarity index 100% rename from i18n/bg.i18n.json rename to imports/i18n/data/bg.i18n.json diff --git a/i18n/br.i18n.json b/imports/i18n/data/br.i18n.json similarity index 100% rename from i18n/br.i18n.json rename to imports/i18n/data/br.i18n.json diff --git a/i18n/ca.i18n.json b/imports/i18n/data/ca.i18n.json similarity index 100% rename from i18n/ca.i18n.json rename to imports/i18n/data/ca.i18n.json diff --git a/i18n/cs.i18n.json b/imports/i18n/data/cs.i18n.json similarity index 100% rename from i18n/cs.i18n.json rename to imports/i18n/data/cs.i18n.json diff --git a/i18n/da.i18n.json b/imports/i18n/data/da.i18n.json similarity index 100% rename from i18n/da.i18n.json rename to imports/i18n/data/da.i18n.json diff --git a/i18n/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json similarity index 100% rename from i18n/de-AT.i18n.json rename to imports/i18n/data/de-AT.i18n.json diff --git a/i18n/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json similarity index 100% rename from i18n/de-CH.i18n.json rename to imports/i18n/data/de-CH.i18n.json diff --git a/i18n/de.i18n.json b/imports/i18n/data/de.i18n.json similarity index 100% rename from i18n/de.i18n.json rename to imports/i18n/data/de.i18n.json diff --git a/i18n/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json similarity index 100% rename from i18n/el-GR.i18n.json rename to imports/i18n/data/el-GR.i18n.json diff --git a/imports/i18n/data/el.i18n.json b/imports/i18n/data/el.i18n.json new file mode 100644 index 000000000..7ab19efaa --- /dev/null +++ b/imports/i18n/data/el.i18n.json @@ -0,0 +1,1148 @@ +{ + "accept": "Αποδοχή", + "act-activity-notify": "Ειδοποίηση δραστηριότητας", + "act-addAttachment": "προσετέθη το συνημμένο __attachment__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-deleteAttachment": "διεγράφη το συνημμένο __attachment__ από την κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-addSubtask": "προστέθηκε η υποεργασία __subtask__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-addLabel": "Προστέθηκε η ετικέτα __label__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-addedLabel": "Προστέθηκε η ετικέτα __label__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-removeLabel": "Διεγράφη η ετικέτα __label__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__", + "act-removedLabel": "Διεγράφη η ετικέτα __label__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__", + "act-addChecklist": "προστέθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-addChecklistItem": "προστέθηκε το στοιχείο __checklistItem__ στη λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-removeChecklist": "διεγράφη η λίστα ελέγχου - checklist __checklist__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__", + "act-removeChecklistItem": "διεγράφη το στοιχείο __checklistItem__ από τη λίστα ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__\nεπιλέχθηκε το στοιχείο __checklistItem__ της λίστας ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-uncheckedItem": "αποεπιλέχθηκε το στοιχείο __checklistItem__ της λίστας ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-completeChecklist": "ολοκληρώθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-uncompleteChecklist": "σημάνθηκε ως ημιτελής η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-addComment": "προσέθεσε σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-editComment": "μετέβαλε σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-deleteComment": "διεγράφη σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-createBoard": "δημιουργήθηκε ο πίνακας __board__", + "act-createSwimlane": "δημιουργήθηκε η λωρίδα __swimlane__ στον πίνακα __board__", + "act-createCard": "δημιουργήθηκε η κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-createCustomField": "δημιουργήθηκε το προσαρμοσμένο πεδίο __customField__ στον πίνακα __board__", + "act-deleteCustomField": "διεγράφη το προσαρμοσμένο πεδίο __customField__ στον πίνακα __board__", + "act-setCustomField": "υπέστη επεξεργασία η τιμή του προσαρμοσμένου πεδίου __customField__: __customFieldValue__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-createList": "προστέθηκε η λίστα __list__ στον πίνακα __board__", + "act-addBoardMember": "προστέθηκε το μέλος __member__ στον πίνακα __board__", + "act-archivedBoard": "Ο πίνακας __board__ μεταφέρθηκε στο Αρχείο", + "act-archivedCard": "Η κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο", + "act-archivedList": "Η λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο", + "act-archivedSwimlane": "Η λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο", + "act-importBoard": "Εισήχθη ο πίνακας __board__", + "act-importCard": "εισήχθη η κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-importList": "εισήχθη η λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-joinMember": "προστέθηκε το μέλος __member__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-moveCard": "μετακίνησε την κάρτα __card__ στον πίνακα __board__ από τη λίστα __oldList__ της λωρίδας __oldSwimlane__ στη λίστα __list__ στη λωρίδα __swimlane__", + "act-moveCardToOtherBoard": "μετακίνησε την κάρτα __card__ από τη λίστα __oldList__ της λωρίδας __oldSwimlane__ του πίνακα __oldBoard__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-removeBoardMember": "αφαιρέθηκε το μέλος __member__ από τον πίνακα __board__", + "act-restoredCard": "επαναφορά της κάρτας __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-unjoinMember": "διαγραφή του μέλους __member__ από την κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Ενέργειες", + "activities": "Δραστηριότητες", + "activity": "Δραστηριότητα", + "activity-added": "προστέθηκε %s στο %s", + "activity-archived": "%s μετακινήθηκε στο Αρχείο", + "activity-attached": "επισυνάφθηκε %s στο %s", + "activity-created": "δημιουργήθηκε %s", + "activity-customfield-created": "δημιούργησε το προσαρμοσμένο πεδίο %s", + "activity-excluded": "εξαιρέθηκε %s από %s", + "activity-imported": "εισήχθη %s στο %s από %s", + "activity-imported-board": "εισήχθη %s από %s", + "activity-joined": "joined %s", + "activity-moved": "μετακινήθηκε το %s από %s στο %s", + "activity-on": "στό %s", + "activity-removed": "διεγράφη %s από %s", + "activity-sent": "εστάλη %s στο %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "προστέθηκε υποεργασία στο %s", + "activity-checked-item": "επιλέχθηκε %s στη λίστα ελέγχου - checlist %s του %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "προστέθηκε ένα στοιχείο λίστας ελέγου στη '%s' στο %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Προσθήκη", + "activity-checked-item-card": "επιλέχθηκε το %s στη λίστα ελέγχου - checklist %s", + "activity-unchecked-item-card": "αποεπιλέχθηκε το %s στη λίστα ελέγχου - checklist %s", + "activity-checklist-completed-card": "ολοκληρώθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "επεξεργασία σχολίου %s", + "activity-deleteComment": "διεγράφη το σχόλιο %s", + "activity-receivedDate": "η ημερομηνία λήψης άλλαξε σε %s από %s", + "activity-startDate": "η ημερομηνία έναρξης άλλαξε σε %s από %s", + "activity-dueDate": "υπέστη επεξεργασία η τιμή της προθεσμίας σε %s από %s", + "activity-endDate": "η ημερομηνία λήξης άλλαξε σε %s από %s", + "add-attachment": "Προσθήκη Συνημμένου", + "add-board": "Προσθήκη Πίνακα", + "add-template": "Add Template", + "add-card": "Προσθήκη Κάρτας", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Προσθήκη Λωρίδας", + "add-subtask": "Προσθήκη Υποεργασίας", + "add-checklist": "Προσθήκη Λίστας ελέγχου", + "add-checklist-item": "Προσθήκη ενός στοιχείου στη λίστα ελέγχου - checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Προσθήκη Ετικέτας", + "add-list": "Προσθήκη Λίστας", + "add-members": "Προσθήκη Μελών", + "added": "Προστέθηκε", + "addMemberPopup-title": "Μέλη", + "memberPopup-title": "Ρυθμίσεις Μελών", + "admin": "Διαχειριστής", + "admin-desc": "Μπορεί να δει, να επεξεργαστεί κάρτες, να διαγράψει μέλη και να μεταβάλει τις ρυθμίσεις του πίνακα.", + "admin-announcement": "Ανακοίνωση", + "admin-announcement-active": "Ενεργή Ανακοίνωση που είναι ορατή σε όλο το σύστημα", + "admin-announcement-title": "Ανακοίνωση από το Διαχειριστή Συστήματος", + "all-boards": "Όλοι οι πίνακες", + "and-n-other-card": "Και __count__ επιπλέον κάρτα", + "and-n-other-card_plural": "Και __count__ επιπλέον κάρτες", + "apply": "Εφαρμογή", + "app-is-offline": "Φορτώνει, παρακαλώ περιμένετε. Η ανανέωση της σελίδας θα προκαλέσει απώλεια δεδομένων. Αν η φόρτωση δεν επιτύχει, παρακαλούμε ελέγξτε ότι ο server δεν έχει σταματήσει.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Μετακίνηση στο Αρχείο", + "archive-all": "Μετακίνηση Όλων στο Αρχείο", + "archive-board": "Μετακίνηση Πίνακα στο Αρχείο", + "archive-card": "Μετακίνηση Κάρτας στο Αρχείο", + "archive-list": "Μετακίνηση Λίστας στο Αρχείο", + "archive-swimlane": "Μετακίνηση της Λωρίδας στο Αρχείο", + "archive-selection": "Μετακίνηση επιλογής στο Αρχείο", + "archiveBoardPopup-title": "Να μετακινηθεί ο Πίνακας στο Αρχείο;", + "archived-items": "Αρχείο", + "archived-boards": "Πίνακες στο Αρχείο", + "restore-board": "Επαναφορά Πίνακα", + "no-archived-boards": "Δεν υπάρχουν Πίνακες στο Αρχείο.", + "archives": "Αρχείο", + "template": "Πρότυπο", + "templates": "Πρότυπα", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Ανάθεση μέλους", + "attached": "επισυνάφθηκε", + "attachment": "Συνημμένο", + "attachment-delete-pop": "Η διαγραφή του συνημμένου είναι μόνιμη. Δεν υπάρχει δυνατότητα επαναφοράς.", + "attachmentDeletePopup-title": "Διαγραφή Συνημμένου;", + "attachments": "Συνημμένα", + "auto-watch": "Αυτόματη παρακολούθηση των πινάκων από τη στιγμή που δημιουργούνται.", + "avatar-too-big": "Το avatar είναι πολύ μεγάλο (μέγιστο 520KB)", + "back": "Πίσω", + "board-change-color": "Αλλαγή χρώματος", + "board-nb-stars": "%s αστέρια", + "board-not-found": "Ο πίνακας δε βρέθηκε", + "board-private-info": "Αυτός ο πίνακας θα είναι κρυφός.", + "board-public-info": "Αυτός ο πίνακας θα είναι δημόσιος.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Αλλαγή Φόντου Πίνακα", + "boardChangeTitlePopup-title": "Μετονομασία Πίνακα", + "boardChangeVisibilityPopup-title": "Αλλαγή Ορατότητας", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Ρυθμίσεις Πίνακα", + "boardChangeViewPopup-title": "Προβολή Πίνακα", + "boards": "Πίνακες", + "board-view": "Προβολή Πίνακα", + "board-view-cal": "Ημερολόγιο", + "board-view-swimlanes": "Λωρίδες", + "board-view-collapse": "Σύμπτυξη", + "board-view-gantt": "Διάγραμμα Gantt", + "board-view-lists": "Λίστες", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Ακύρωση", + "card-archived": "Αυτή η κάρτα μετακινήθηκε στο Αρχείο.", + "board-archived": "Αυτός ο πίνακας μετακινήθηκε στο Αρχείο.", + "card-comments-title": "Αυτή η κάρτα έχει %s σχόλιο.", + "card-delete-notice": "Η Διαγραφή είναι μόνιμη. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την κάρτα.", + "card-delete-pop": "Όλες οι ενέργειες θα αφαιρεθούν από τη ροή δραστηριοτήτων και δε θα μπορείτε να ξανανοίξετε την κάρτα. Δεν υπάρχει δυνατότητα επαναφοράς.", + "card-delete-suggest-archive": "Μπορείτε να μετακινήσετε μια κάρτα στο Αρχείο για να την αφαιρέσετε από τον πίνακα και να διατηρήσετε τη δραστηριότητα.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Έως", + "card-due-on": "Έως τις", + "card-spent": "Δαπανηθείς Χρόνος", + "card-edit-attachments": "Επεξεργασία συνημμένων", + "card-edit-custom-fields": "Επεξεργασία προσαρμοσμένων πεδίων", + "card-edit-labels": "Επεξεργασία ετικετών", + "card-edit-members": "Επεξεργασία μελών", + "card-labels-title": "Αλλαγή ετικετών για την κάρτα.", + "card-members-title": "Προσθήκη ή διαγραφή μελών του πίνακα από την κάρτα.", + "card-start": "Έναρξη", + "card-start-on": "Αρχίζει σε", + "cardAttachmentsPopup-title": "Συνημμένο Από", + "cardCustomField-datePopup-title": "Αλλαγή ημερομηνίας", + "cardCustomFieldsPopup-title": "Επεξεργασία προσαρμοσμένων πεδίων", + "cardStartVotingPopup-title": "Έναρξη ψηφοφορίας", + "positiveVoteMembersPopup-title": "Υποστηρικτές", + "negativeVoteMembersPopup-title": "Αντιτιθέμενοι", + "card-edit-voting": "Επεξεργασία ψηφοφορίας", + "editVoteEndDatePopup-title": "Αλλαγή της ημερομηνίας λήξης ψηφοφορίας", + "allowNonBoardMembers": "Επίτρεψε όλους τους συνδεδεμένους χρήστες", + "vote-question": "Ερώτηση ψηφοφορίας", + "vote-public": "Εμφάνισε ποιός ψήφισε τι", + "vote-for-it": "για αυτό", + "vote-against": "εναντίον", + "deleteVotePopup-title": "Διαγραφή ψήφου;", + "vote-delete-pop": "Μόνιμη Διαγραφή. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την ψήφο.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Διαγραφή Κάρτας;", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Ενέργειες κάρτας", + "cardLabelsPopup-title": "Ετικέτες", + "cardMembersPopup-title": "Μέλοι", + "cardMorePopup-title": "Περισσότερα", + "cardTemplatePopup-title": "Δημιουργία προτύπου", + "cards": "Κάρτες", + "cards-count": "Κάρτες", + "cards-count-one": "Κάρτα", + "casSignIn": "Σύνδεση χρήστη με CAS", + "cardType-card": "Κάρτα", + "cardType-linkedCard": "Συνδεδεμένη Κάρτα", + "cardType-linkedBoard": "Συνδεδεμένος Πίνακας", + "change": "Αλλαγή", + "change-avatar": "Αλλαγή Avatar", + "change-password": "Αλλαγή Κωδικού", + "change-permissions": "Αλλαγή δικαιωμάτων", + "change-settings": "Αλλαγή Ρυθμίσεων", + "changeAvatarPopup-title": "Αλλαγή Avatar", + "changeLanguagePopup-title": "Αλλαγή Γλώσσας", + "changePasswordPopup-title": "Αλλαγή Κωδικού", + "changePermissionsPopup-title": "Αλλαγή Δικαιωμάτων", + "changeSettingsPopup-title": "Αλλαγή Ρυθμίσεων", + "subtasks": "Υποεργασίες", + "checklists": "Λίστες Ελέγχου - Checklists", + "click-to-star": "Κλικ για να προσθέσετε αστεράκι στον πίνακα", + "click-to-unstar": "Κλικ για να αφαιρέσετε αστεράκι από τον πίνακα", + "clipboard": "Clipboard ή drag & drop", + "close": "Κλείσιμο", + "close-board": "Κλείσιμο Πίνακα", + "close-board-pop": "Μελλοντικά μπορείτε να επαναφέρετε τον πίνακα κάνοντας κλικ στο κουμπί \"Αρχειοθέτηση\" από την αρχική επικεφαλίδα.", + "close-card": "Close Card", + "color-black": "μαύρο", + "color-blue": "μπλε", + "color-crimson": "βυσσινί", + "color-darkgreen": "σκούρο πράσινο", + "color-gold": "χρυσό", + "color-gray": "γκρι", + "color-green": "πράσινο", + "color-indigo": "λουλάκι", + "color-lime": "λάιμ", + "color-magenta": "ματζέντα", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "πορτοκαλί", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "ροζ", + "color-plum": "plum", + "color-purple": "μωβ", + "color-red": "κόκκινο", + "color-saddlebrown": "saddlebrown", + "color-silver": "ασημί", + "color-sky": "ουρανός", + "color-slateblue": "slateblue", + "color-white": "λευκό", + "color-yellow": "κίτρινο", + "unset-color": "Unset", + "comment": "Σχόλιο", + "comment-placeholder": "Συγγραφή Σχολίου", + "comment-only": "Μόνο σχόλιο", + "comment-only-desc": "Μπορεί μόνο να σχολιάζει σε κάρτες.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "Χωρίς σχόλια", + "no-comments-desc": "Δε μπορεί να δει σχόλια και δραστηριότητες.", + "worker": "Worker", + "worker-desc": "Μπορεί μόνο να μετακινεί κάρτες, να αναθέτει μια κάρτα στον εαυτό του και να σχολιάζει.", + "computer": "Υπολογιστής", + "confirm-subtask-delete-dialog": "Είστε σίγουροι ότι θέλετε να σβήσετε την υποεργασία;", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Αντιγραφή του συνδέσμου της κάρτας στο clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Σύνδεση Κάρτας", + "searchElementPopup-title": "Αναζήτηση", + "copyCardPopup-title": "Αντιγραφή Κάρτας", + "copyChecklistToManyCardsPopup-title": "Αντιγραφή του Προτύπου Λίστας Ελέγχου - Checklist σε πολλές Κάρτες", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]", + "create": "Δημιουργία", + "createBoardPopup-title": "Δημιουργία Πίνακα", + "chooseBoardSourcePopup-title": "Εισαγωγή πίνακα", + "createLabelPopup-title": "Δημιουργία Ετικέτας", + "createCustomField": "Δημιουργία Πεδίου", + "createCustomFieldPopup-title": "Δημιουργία Πεδίου", + "current": "τρέχων", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Νόμισμα", + "custom-field-currency-option": "Κωδικός Νομίσματος", + "custom-field-date": "Ημερομηνία", + "custom-field-dropdown": "Λίστα επιλογών", + "custom-field-dropdown-none": "(κανένα)", + "custom-field-dropdown-options": "Επιλογές Λίστας", + "custom-field-dropdown-options-placeholder": "Πιέστε enter για να προσθέσετε περισσότερες επιλογές", + "custom-field-dropdown-unknown": "(άγνωστο)", + "custom-field-number": "Αριθμός", + "custom-field-text": "Κείμενο", + "custom-fields": "Προσαρμοσμένα Πεδία", + "date": "Ημερομηνία", + "decline": "Απόρριψη", + "default-avatar": "Default avatar", + "delete": "Διαγραφή", + "deleteCustomFieldPopup-title": "Διαγραφή Προσαρμοσμένου Πεδίου;", + "deleteLabelPopup-title": "Διαγραφή Ετικέτας;", + "description": "Περιγραφή", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Απόρριψη", + "done": "Ολοκληρώθηκε", + "download": "Λήψη", + "edit": "Επεξεργασία", + "edit-avatar": "Αλλαγή Avatar", + "edit-profile": "Επεξεργασία Προφίλ", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Αλλαγή ημερομηνίας έναρξης", + "editCardDueDatePopup-title": "Αλλαγή ημερομηνίας λήξης προθεσμίας", + "editCustomFieldPopup-title": "Επεξεργασία Πεδίου", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Αλλαγή δαπανηθέντος χρόνου", + "editLabelPopup-title": "Αλλαγή Ετικέτας", + "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης", + "editProfilePopup-title": "Επεξεργασία Προφίλ", + "email": "Email", + "email-enrollAccount-subject": "Ένας λογαριασμός δημιουργήθηκε για εσάς στο __siteName__", + "email-enrollAccount-text": "Χαίρετε __user__,\n\nΓια να ξεκινήσετε να χρησιμοποιείτε αυτή την υπηρεσία, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.", + "email-fail": "Η αποστολή του email απέτυχε", + "email-fail-text": "Σφάλμα κατά την αποστολή του email", + "email-invalid": "Μη έγκυρο email", + "email-invite": "Πρόσκληση μέσω Email", + "email-invite-subject": "__inviter__ σας έστειλε μια πρόσκληση", + "email-invite-text": "Αγαπητέ/ή __user__,\n\n__inviter__ σας προσκαλεί να λάβετε μέρος στον πίνακα \"__board__\" για να συνεργαστείτε.\n\nΠαρακαλούμε επιλέξτε τον παρακάτω σύνδεσμο:\n\n__url__\n\nΕυχαριστούμε.", + "email-resetPassword-subject": "Επαναφορά του κωδικού σας για το __siteName__", + "email-resetPassword-text": "Χαίρετε __user__,\n\nΓια να αλλάξετε τον κωδικό πρόσβασής σας, κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.", + "email-sent": "Εστάλη Email", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Χαίρετε __user__,\n\nΓια να επιβεβαιώσετε το email που χρησιμοποιεί ο λογαριασμός σας, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "Αυτός ο πίνακας δεν υφίσταται", + "error-board-notAdmin": "Πρέπει να είστε διαχειριστής του πίνακα αυτού για να προβείτε σε αυτό", + "error-board-notAMember": "Πρέπει να είστε μέλος του πίνακα αυτού για να προβείτε σε αυτό", + "error-json-malformed": "Το κείμενο δεν είναι έγκυρο JSON", + "error-json-schema": "Τα JSON δεδομένα σας δεν περιλαμβάνουν την ορθή πληροφορία στην ορθή μορφοποίηση", + "error-csv-schema": "Το CSV(Comma Separated Values)/TSV (Tab Separated Values) σας δεν περιλαμβάνει την ορθή πληροφορία σε ορθή μορφοποίηση", + "error-list-doesNotExist": "Η λίστα δεν υπάρχει", + "error-user-doesNotExist": "Ο χρήστης δεν υπάρχει", + "error-user-notAllowSelf": "Δε μπορείτε να αυτοπροσκληθείτε", + "error-user-notCreated": "Ο χρήστης δε δημιουργήθηκε", + "error-username-taken": "Το όνομα χρήστη είναι ήδη κατειλημμένο", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Το email είναι ήδη κατειλημμένο", + "export-board": "Εξαγωγή πίνακα", + "export-board-json": "Εξαγωγή πίνακα σε JSON", + "export-board-csv": "Εξαγωγή πίνακα σε CSV", + "export-board-tsv": "Εξαγωγή πίνακα σε TSV", + "export-board-excel": "Εξαγωγή πίνακα σε Excel", + "user-can-not-export-excel": "Ο χρήστης δε μπορεί να εξάγει σε Excel", + "export-board-html": "Εξαγωγή πίνακα σε HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Εξαγωγή πίνακα", + "exportCardPopup-title": "Export card", + "sort": "Ταξινόμηση", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Κάντε κλικ για να ταξινομήστε τη λίστα", + "list-sort-by": "Ταξινόμηση λίστας βάσει:", + "list-label-modifiedAt": "Τελευταία Προσπέλαση", + "list-label-title": "Ονομασία Λίστας", + "list-label-sort": "Η καθορισμένη σας Ταξινόμηση", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Φίλτρο", + "filter-cards": "Φιλτράρετε Κάρτες ή Λίστες", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Φιλτράρετε Λίστα βάσει Τίτλου", + "filter-clear": "Καθαρισμός φίλτρου", + "filter-labels-label": "Φίλτρο βάσει ετικέτας", + "filter-no-label": "Καμμία ετικέτα", + "filter-member-label": "Φίλτρο βάσει μέλους", + "filter-no-member": "Κανένα μέλος", + "filter-assignee-label": "Φίλτρο βάσει ανάθεσης μέλους", + "filter-no-assignee": "Κανένας ανατεθείς", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "Κανένα Προσαρμοσμένο Πεδίο", + "filter-show-archive": "Προβολή αρχειοθετημένων λιστών", + "filter-hide-empty": "Απόκρυψη άδειων λιστών", + "filter-on": "Φίλτρο Ενεργό", + "filter-on-desc": "Έχετε ενεργοποιημένο το φίλτρο καρτών σε αυτόν τον πίνακα. Κάνετε κλικ εδώ για να αλλάξετε το φίλτρο.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Άλλα φίλτρα", + "advanced-filter-label": "Φιλτράρισμα για Προχωρημένους", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Πλήρες Όνομα", + "header-logo-title": "Επιστροφή στη σελίδα των πινάκων σας.", + "hide-system-messages": "Απόκρυψη μηνυμάτων συστήματος", + "headerBarCreateBoardPopup-title": "Δημιουργία Πίνακα", + "home": "Αρχική", + "import": "Εισαγωγή", + "impersonate-user": "Impersonate user", + "link": "Σύνδεσμος", + "import-board": "Εισαγωγή πίνακα", + "import-board-c": "Εισαγωγή πίνακα", + "import-board-title-trello": "Εισαγωγή πίνακα από το Trello", + "import-board-title-wekan": "Εισαγωγή πίνακα από προηγούμενη εξαγωγή", + "import-board-title-csv": "Εισαγωγή πίνακα από CSV/TSV", + "from-trello": "Από το Trello", + "from-wekan": "Aπό προηγούμενη εξαγωγή", + "from-csv": "Από CSV/TSV", + "import-board-instruction-trello": "Στον πίνακα του Trello, πλοηγηθείτε στο 'Menu', έπειτα 'More', 'Print and Export', 'Export JSON' και αντιγράψτε το παραχθέν κείμενο.", + "import-board-instruction-csv": "Επικολλήστε τις Τιμές Διαχωρισμένες με Κόμμα (CSV)/ Τιμές Διαχωρισμένες με Tab (TSV) .", + "import-board-instruction-wekan": "Στον πίνακά σας, πλοηγηθείτε στο 'Menu', έπειτα 'Export board' και αντιγράψετε το κείμενο στο ληφθένα αρχείο.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Επικολλήστε τα ορθά JSON δεδομένα σας εδώ", + "import-csv-placeholder": "Επικολλήστε τα ορθά CSV/TSV δεδομένα σας εδώ", + "import-map-members": "Αντιστοίχιση μελών", + "import-members-map": "Ο εισαχθείς πίνακας έχει κάποια μέλη. Παρακαλούμε αντιστοιχίστε τα μέλη που θέλετε να εισάγετε στους χρήστες σας", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Αναθεώρηση αντιστοίχισης μελών", + "import-user-select": "Επιλέξτε τον ήδη υπάρχοντα χρήστη που επιθυμείτε να χρησιμοποιήσετε ως αυτό το μέλος", + "importMapMembersAddPopup-title": "Επιλογή μέλους", + "info": "Έκδοση", + "initials": "Αρχικά", + "invalid-date": "Λανθασμένη ημερομηνία", + "invalid-time": "Λανθασμένη ώρα", + "invalid-user": "Λανθασμένος χρήστης", + "joined": "joined", + "just-invited": "Μόλις προσκληθήκατε σε αυτόν τον πίνακα", + "keyboard-shortcuts": "Συντομεύσεις πληκτρολογίου", + "label-create": "Δημιουργία Ετικέτας", + "label-default": "%s ετικέτα (προεπιλογή)", + "label-delete-pop": "Δεν υπάρχει δυνατότητα επαναφοράς. Θα διαγραφεί η ετικέτα από όλες τις κάρτες και θα καταστραφεί το ιστορικό της.", + "labels": "Ετικέτες", + "language": "Γλώσσα", + "last-admin-desc": "Δε μπορείτε να μεταβάλετε ρόλους επειδή πρέπει να υπάρχει τουλάχιστον ένας διαχειριστής.", + "leave-board": "Αποχώρηση από Πίνακα", + "leave-board-pop": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από το __boardTitle__? Θα αφαιρεθείτε από όλες τις κάρτες αυτού του πίνακα.", + "leaveBoardPopup-title": "Αποχωρείτε απο τον Πίνακα;", + "link-card": "Σύνδεσμος σε αυτή την κάρτα", + "list-archive-cards": "Μεταφορά όλων των καρτών αυτής της λίστας στο Αρχείο", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Μεταφορά όλων των καρτών αυτής της λίστας", + "list-select-cards": "Επιλογή όλων των καρτών αυτής της λίστας", + "set-color-list": "Ρύθμιση Χρώματος", + "listActionPopup-title": "Ενέργειες Λίστας", + "settingsUserPopup-title": "Ρυθμίσεις Χρήστη", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Ενέργειες λωρίδας", + "swimlaneAddPopup-title": "Προσθήκη μιας Λωρίδας παρακάτω", + "listImportCardPopup-title": "Εισαγωγή μιας κάρτας Trello", + "listImportCardsTsvPopup-title": "Εισαγωγή Excel CSV/TSV", + "listMorePopup-title": "Περισσότερα", + "link-list": "Σύνδεσμος σε αυτή τη λίστα", + "list-delete-pop": "Όλες οι ενέργειες θα αφαιρεθούν από τη ροή δραστηριοτήτων και δε θα μπορείτε να ανακτήσετε τη λίστα. Δεν υπάρχει δυνατότητα επαναφοράς.", + "list-delete-suggest-archive": "Μπορείτε να μετακινήσετε μια λίστα στο Αρχείο για να την αφαιρέσετε από τον πίνακα και να διατηρήσετε τη δραστηριότητα.", + "lists": "Λίστες", + "swimlanes": "Λωρίδες", + "log-out": "Αποσύνδεση", + "log-in": "Σύνδεση", + "loginPopup-title": "Σύνδεση", + "memberMenuPopup-title": "Ρυθμίσεις Μελών", + "members": "Μέλοι", + "menu": "Μενού", + "move-selection": "Μετακίνηση επιλογής", + "moveCardPopup-title": "Μετακίνηση Κάρτας", + "moveCardToBottom-title": "Μετακίνηση στην Αρχή", + "moveCardToTop-title": "Μετακίνηση στο Τέλος", + "moveSelectionPopup-title": "Μετακίνηση επιλογής", + "multi-selection": "Πολλαπλή Επιλογή", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Πολλαπλή Επιλογή ενεργοποιημένη", + "muted": "Σίγαση", + "muted-info": "Δεν πρόκειται να ενημερωθείτε ποτέ για οποιεσδήποτε αλλαγές σε αυτόν τον πίνακα", + "my-boards": "Οι Πίνακες μου", + "name": "Όνομα", + "no-archived-cards": "Δεν υπάρχουν κάρτες στο Αρχείο.", + "no-archived-lists": "Δεν υπάρχουν λίστες στο Αρχείο.", + "no-archived-swimlanes": "Δεν υπάρχουν λωρίδες στο Αρχείο.", + "no-results": "Κανένα αποτέλεσμα", + "normal": "Κανονικό", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Η πρόσκληση δεν έχει λάβει αποδοχή ακόμη", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "προεραιτικό", + "or": "ή", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Η σελίδα δεν βρέθηκε.", + "password": "Κωδικός", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Συμμετέχει", + "preview": "Προεπισκόπηση", + "previewAttachedImagePopup-title": "Προεπισκόπηση", + "previewClipboardImagePopup-title": "Προεπισκόπηση", + "private": "Private", + "private-desc": "Ο πίνακας αυτός είναι προσωπικός. Μόνο άτομα που έχουν προστεθεί σε αυτόν τον πίνακα μπορούν να τον δουν και να τον μεταβάλλουν.", + "profile": "Προφίλ", + "public": "Δημόσιο", + "public-desc": "Αυτός ο πίνακας είναι δημόσιος. Είναι ορατός σε οποιονδήποτε κατέχει το σύνδεσμο προς αυτόν και θα εμφανίζεται σε μηχανές αναζήτησης όπως η Google. Ο πίνακας μπορεί να μεταβληθεί μόνο από άτομα που έχουν προστεθεί σε αυτόν.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Αφαίρεση Σκεπάσματος", + "remove-from-board": "Αφαίρεση από Πίνακα", + "remove-label": "Αφαίρεση Ετικέτας", + "listDeletePopup-title": "Διαγραφή Λίστας;", + "remove-member": "Αφαίρεση Μέλους", + "remove-member-from-card": "Αφαίρεση από την Κάρτα", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Αφαίρεση Μέλους;", + "rename": "Μετανομασία", + "rename-board": "Μετονομασία Πίνακα", + "restore": "Επαναφορά", + "save": "Αποθήκευση", + "search": "Αναζήτηση", + "rules": "Κανόνες", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Επιλέξτε Χρώμα", + "select-board": "Επιλογή Πίνακα", + "set-wip-limit-value": "Προσδιορισμός ορίου στο μέγιστο αριθμό εργασιών σε αυτή τη λίστα.", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Καθαρισμός φίλτρων", + "shortcut-close-dialog": "Κλείσιμο Διαλόγου", + "shortcut-filter-my-cards": "Φιλτράρισμα των καρτών μου", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Άνοιγμα Πλευρικού Μενού", + "sidebar-close": "Κλείσιμο Πλευρικού Μενού", + "signupPopup-title": "Δημιουργία Λογαριασμού", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Εγγραφή", + "team": "Ομάδα", + "this-board": "αυτόν τον πίνακα", + "this-card": "αυτή η κάρτα", + "spent-time-hours": "Δαπανηθείς Χρόνος (ώρες)", + "overtime-hours": "Υπερωρία (ώρες)", + "overtime": "Υπερωρία", + "has-overtime-cards": "Έχει κάρτες με υπερωρία", + "has-spenttime-cards": "Έχει κάρτες με δαπανηθέντα χρόνο", + "time": "Ώρα", + "title": "Τίτλος", + "tracking": "Καταγραφή", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Τύπος", + "unassign-member": "Απο-ανάθεση μέλους", + "unsaved-description": "Έχετε μια μη αποθηκευμένη περιγραφή.", + "unwatch": "Unwatch", + "upload": "Μεταφόρτωση", + "upload-avatar": "Μεταφόρτωση ενός avatar", + "uploaded-avatar": "Μεταφόρτωσε ένα avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Όνομα Χρήστη", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Παρακολούθηση", + "watching": "Παρακολουθούν", + "watching-info": "Θα ενημερωθείτε για οποιαδήποτε αλλαγή σε αυτόν τον πίνακα", + "welcome-board": "Πίνακας Καλωσορίσματος", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Πρότυπα Καρτών", + "list-templates-swimlane": "Πρότυπα Λίστας", + "board-templates-swimlane": "Πρότυπα Πινάκων", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Ρυθμίσεις", + "people": "Άνθρωποι", + "registration": "Εγγραφή", + "disable-self-registration": "Απενεργοποίηση Αυτό-Εγγραφής", + "invite": "Πρόσκληση", + "invite-people": "Πρόσκάλεσε Ανθρώπους", + "to-boards": "Στον πίνακα(ες)", + "email-addresses": "Email Διευθύνσεις", + "smtp-host-description": "Η διεύθυνση του SMTP server που διαχειρίζεται τα emails σας.", + "smtp-port-description": "Η πόρτα που ο SMTP server χρησιμοποιεί για τα εξερχόμενα emails.", + "smtp-tls-description": "Ενεργοποίηση υποστήριξης TLS για το SMTP server", + "smtp-host": "Διακομιστής SMTP (host)", + "smtp-port": "Πόρτα SMTP (Port)", + "smtp-username": "Όνομα Χρήστη", + "smtp-password": "Κωδικός", + "smtp-tls": "TLS υποστήριξη", + "send-from": "Από", + "send-smtp-test": "Στείλε ένα δοκιμαστικό email στον εαυτό σου", + "invitation-code": "Κωδικός Πρόσκλησης", + "email-invite-register-subject": "__inviter__ σας έστειλε μια πρόσκληση", + "email-invite-register-text": "Αγαπητέ __user__,\n\n__inviter__ σας προσκαλεί για να συμμετάσχετε στον πίνακα kanban.\n\nΠαρακαλούμε πιέστε την παρακάτω διεύθυνση:\n__url__\n\nΟ κωδικός πρόσκλησής σας είναι: __icode__\n\nΕυχαριστούμε.", + "email-smtp-test-subject": "SMTP Δοκιμαστικό Email", + "email-smtp-test-text": "Στείλατε επιτυχώς ένα email", + "error-invitation-code-not-exist": "Ο κωδικός πρόσκλησης δεν υπάρχει", + "error-notAuthorized": "Δεν έχετε εξουσιοδότηση για να δείτε αυτή τη σελίδα.", + "webhook-title": "Όνομα Webhook", + "webhook-token": "Token (Προεραιτικό για Αυθεντικοποίηση)", + "outgoing-webhooks": "Εξερχόμενα Webhooks", + "bidirectional-webhooks": "Αμφίδρομα Webhooks", + "outgoingWebhooksPopup-title": "Εξερχόμενα Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Απενεργοποίηση αυτού του Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "Νέο Εξερχόμενο Webhook", + "no-name": "(Άγνωστο)", + "Node_version": "Έκδοση Node", + "Meteor_version": "Έκδοση Meteor", + "MongoDB_version": "Έκδοση MongoDB", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog ενεργοποιημένο", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "ημέρες", + "hours": "ώρες", + "minutes": "λεπτά", + "seconds": "δευτερόλεπτα", + "show-field-on-card": "Προβολή αυτού του πεδίου στην κάρτα", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Ναι", + "no": "Όχι", + "accounts": "Λογαριασμοί", + "accounts-allowEmailChange": "Επίτρεψε Αλλαγή Email", + "accounts-allowUserNameChange": "Επίτρεψε Αλλαγή Ονόματος χρήστη", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Δημιουργήθηκε στις", + "modifiedAt": "Modified at", + "verified": "Επιβεβαιώθηκε", + "active": "Ενεργό", + "card-received": "Ελήφθη", + "card-received-on": "Ελήφθη στις", + "card-end": "Τέλος", + "card-end-on": "Λήγει στις", + "editCardReceivedDatePopup-title": "Αλλαγή ημερομηνίας λήψης", + "editCardEndDatePopup-title": "Αλλαγή ημερομηνίας λήξης", + "setCardColorPopup-title": "Ρύθμιση χρώματος", + "setCardActionsColorPopup-title": "Επιλέξτε ένα χρώμα", + "setSwimlaneColorPopup-title": "Επιλέξτε ένα χρώμα", + "setListColorPopup-title": "Επιλέξτε ένα χρώμα", + "assigned-by": "Ανατέθηκε Από", + "requested-by": "Αιτήθηκε Από", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Διαγραφή Πίνακα;", + "delete-board": "Διαγραφή Πίνακα", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Προεπιλογή", + "queue": "Ουρά αναμονής", + "subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)", + "card-settings": "Ρυθμίσεις Κάρτας", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Μητρική κάρτα", + "source-board": "Κάρτα προέλευσης", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "διεγράφη ετικέτα '%s' από %s", + "activity-delete-attach": "διεγράφη ένα συνημμένο από %s", + "activity-added-label-card": "προσετέθη ετικέτα '%s'", + "activity-removed-label-card": "διεγράφη ετικέτα '%s'", + "activity-delete-attach-card": "διεγραφη ένα συνημμένο", + "activity-set-customfield": "ανάθεση τιμής του custom πεδίου '%s' στο '%s' στο %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Κανόνας", + "r-add-trigger": "Add trigger", + "r-add-action": "Προσθήκη ενέργειας", + "r-board-rules": "Κανόνες πίνακα", + "r-add-rule": "Προσθήκη κανόνα", + "r-view-rule": "Προβολή κανόνα", + "r-delete-rule": "Διαγραφή κανόνα", + "r-new-rule-name": "Νέος τίτλος κανόνα", + "r-no-rules": "Κανένας κανόνας", + "r-trigger": "Trigger", + "r-action": "Ενέργεια", + "r-when-a-card": "Όταν μία κάρτα", + "r-is": "είναι", + "r-is-moved": "έχει μετακινηθεί", + "r-added-to": "Προσετέθη στο", + "r-removed-from": "Διεγράφη από", + "r-the-board": "ο πίνακας", + "r-list": "λίστα", + "list": "List", + "set-filter": "Καθορισμός Φίλτρου", + "r-moved-to": "Μετακινήθηκε σε", + "r-moved-from": "Μετακινήθηκε από", + "r-archived": "Μετακινήθηκε στο Αρχείο", + "r-unarchived": "Επαναφέρθηκε από το Αρχείο", + "r-a-card": "μία κάρτα", + "r-when-a-label-is": "Όταν μια ετικέτα είναι", + "r-when-the-label": "Όταν η ετικέτα", + "r-list-name": "όνομα λίστα", + "r-when-a-member": "Όταν ένα μέλος είναι", + "r-when-the-member": "Όταν το μέλος", + "r-name": "όνομα", + "r-when-a-attach": "Όταν ένα συνημμένο", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Μετακίνηση στο Αρχείο", + "r-unarchive": "Επαναφορά από το Αρχείο", + "r-card": "card", + "r-add": "Προσθήκη", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Μετακίνηση κάρτας στην αρχή της λίστας της", + "r-d-move-to-top-spec": "Μετακίνηση κάρτας στην αρχή της λίστας", + "r-d-move-to-bottom-gen": "Μετακίνηση κάρτας στο τέλος της λίστας της", + "r-d-move-to-bottom-spec": "Μετακίνηση κάρτας στο τέλος της λίστας", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Μετακίνηση κάρτας στο Αρχείο", + "r-d-unarchive": "Επαναφορά κάρτας από το Αρχείο", + "r-d-add-label": "Προσθήκη ετικέτας", + "r-d-remove-label": "Αφαίρεση ετικέτας", + "r-create-card": "Δημιουργία νέας κάρτας", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Επιλογή στοιχείου", + "r-d-uncheck-one": "Αποεπιλογή στοιχείου", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Προσθήκη λίστας ελέγχου", + "r-d-remove-checklist": "Διαγραφή λίστας ελέγχου", + "r-by": "by", + "r-add-checklist": "Προσθήκη λίστας ελέγχου", + "r-with-items": "με στοιχεία", + "r-items-list": "στοιχείο1,στοιχείο2,στοιχείο3", + "r-add-swimlane": "Προσθήκη λωρίδας", + "r-swimlane-name": "ονομασία λωρίδας", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "Όταν η κάρτα μετακινηθεί σε μια άλλη λίστα", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after start", + "add-custom-html-before-body-end": "Add Custom HTML before end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Κάρτα", + "board": "Board", + "context-separator": "/", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "λίστα", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Αριθμός", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists" +} \ No newline at end of file diff --git a/i18n/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json similarity index 100% rename from i18n/en-DE.i18n.json rename to imports/i18n/data/en-DE.i18n.json diff --git a/i18n/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json similarity index 100% rename from i18n/en-GB.i18n.json rename to imports/i18n/data/en-GB.i18n.json diff --git a/i18n/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json similarity index 100% rename from i18n/en-IT.i18n.json rename to imports/i18n/data/en-IT.i18n.json diff --git a/i18n/en.i18n.json b/imports/i18n/data/en.i18n.json similarity index 100% rename from i18n/en.i18n.json rename to imports/i18n/data/en.i18n.json diff --git a/i18n/eo.i18n.json b/imports/i18n/data/eo.i18n.json similarity index 100% rename from i18n/eo.i18n.json rename to imports/i18n/data/eo.i18n.json diff --git a/i18n/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json similarity index 100% rename from i18n/es-AR.i18n.json rename to imports/i18n/data/es-AR.i18n.json diff --git a/i18n/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json similarity index 100% rename from i18n/es-CL.i18n.json rename to imports/i18n/data/es-CL.i18n.json diff --git a/i18n/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json similarity index 100% rename from i18n/es-LA.i18n.json rename to imports/i18n/data/es-LA.i18n.json diff --git a/i18n/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json similarity index 100% rename from i18n/es-MX.i18n.json rename to imports/i18n/data/es-MX.i18n.json diff --git a/i18n/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json similarity index 100% rename from i18n/es-PE.i18n.json rename to imports/i18n/data/es-PE.i18n.json diff --git a/i18n/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json similarity index 100% rename from i18n/es-PY.i18n.json rename to imports/i18n/data/es-PY.i18n.json diff --git a/i18n/es.i18n.json b/imports/i18n/data/es.i18n.json similarity index 100% rename from i18n/es.i18n.json rename to imports/i18n/data/es.i18n.json diff --git a/i18n/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json similarity index 100% rename from i18n/et-EE.i18n.json rename to imports/i18n/data/et-EE.i18n.json diff --git a/i18n/eu.i18n.json b/imports/i18n/data/eu.i18n.json similarity index 100% rename from i18n/eu.i18n.json rename to imports/i18n/data/eu.i18n.json diff --git a/i18n/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json similarity index 100% rename from i18n/fa-IR.i18n.json rename to imports/i18n/data/fa-IR.i18n.json diff --git a/i18n/fa.i18n.json b/imports/i18n/data/fa.i18n.json similarity index 100% rename from i18n/fa.i18n.json rename to imports/i18n/data/fa.i18n.json diff --git a/i18n/fi.i18n.json b/imports/i18n/data/fi.i18n.json similarity index 100% rename from i18n/fi.i18n.json rename to imports/i18n/data/fi.i18n.json diff --git a/i18n/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json similarity index 100% rename from i18n/fr-CH.i18n.json rename to imports/i18n/data/fr-CH.i18n.json diff --git a/i18n/fr.i18n.json b/imports/i18n/data/fr.i18n.json similarity index 100% rename from i18n/fr.i18n.json rename to imports/i18n/data/fr.i18n.json diff --git a/i18n/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json similarity index 100% rename from i18n/gl-ES.i18n.json rename to imports/i18n/data/gl-ES.i18n.json diff --git a/i18n/gl.i18n.json b/imports/i18n/data/gl.i18n.json similarity index 100% rename from i18n/gl.i18n.json rename to imports/i18n/data/gl.i18n.json diff --git a/i18n/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json similarity index 100% rename from i18n/gu-IN.i18n.json rename to imports/i18n/data/gu-IN.i18n.json diff --git a/i18n/he.i18n.json b/imports/i18n/data/he.i18n.json similarity index 100% rename from i18n/he.i18n.json rename to imports/i18n/data/he.i18n.json diff --git a/i18n/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json similarity index 100% rename from i18n/hi-IN.i18n.json rename to imports/i18n/data/hi-IN.i18n.json diff --git a/i18n/hi.i18n.json b/imports/i18n/data/hi.i18n.json similarity index 100% rename from i18n/hi.i18n.json rename to imports/i18n/data/hi.i18n.json diff --git a/i18n/hr.i18n.json b/imports/i18n/data/hr.i18n.json similarity index 100% rename from i18n/hr.i18n.json rename to imports/i18n/data/hr.i18n.json diff --git a/i18n/hu.i18n.json b/imports/i18n/data/hu.i18n.json similarity index 100% rename from i18n/hu.i18n.json rename to imports/i18n/data/hu.i18n.json diff --git a/i18n/hy.i18n.json b/imports/i18n/data/hy.i18n.json similarity index 100% rename from i18n/hy.i18n.json rename to imports/i18n/data/hy.i18n.json diff --git a/i18n/id.i18n.json b/imports/i18n/data/id.i18n.json similarity index 100% rename from i18n/id.i18n.json rename to imports/i18n/data/id.i18n.json diff --git a/i18n/ig.i18n.json b/imports/i18n/data/ig.i18n.json similarity index 100% rename from i18n/ig.i18n.json rename to imports/i18n/data/ig.i18n.json diff --git a/i18n/it.i18n.json b/imports/i18n/data/it.i18n.json similarity index 100% rename from i18n/it.i18n.json rename to imports/i18n/data/it.i18n.json diff --git a/i18n/ja.i18n.json b/imports/i18n/data/ja.i18n.json similarity index 100% rename from i18n/ja.i18n.json rename to imports/i18n/data/ja.i18n.json diff --git a/i18n/ka.i18n.json b/imports/i18n/data/ka.i18n.json similarity index 100% rename from i18n/ka.i18n.json rename to imports/i18n/data/ka.i18n.json diff --git a/i18n/km.i18n.json b/imports/i18n/data/km.i18n.json similarity index 100% rename from i18n/km.i18n.json rename to imports/i18n/data/km.i18n.json diff --git a/i18n/ko.i18n.json b/imports/i18n/data/ko.i18n.json similarity index 100% rename from i18n/ko.i18n.json rename to imports/i18n/data/ko.i18n.json diff --git a/i18n/lt.i18n.json b/imports/i18n/data/lt.i18n.json similarity index 100% rename from i18n/lt.i18n.json rename to imports/i18n/data/lt.i18n.json diff --git a/i18n/lv.i18n.json b/imports/i18n/data/lv.i18n.json similarity index 100% rename from i18n/lv.i18n.json rename to imports/i18n/data/lv.i18n.json diff --git a/i18n/mk.i18n.json b/imports/i18n/data/mk.i18n.json similarity index 100% rename from i18n/mk.i18n.json rename to imports/i18n/data/mk.i18n.json diff --git a/i18n/mn.i18n.json b/imports/i18n/data/mn.i18n.json similarity index 100% rename from i18n/mn.i18n.json rename to imports/i18n/data/mn.i18n.json diff --git a/i18n/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json similarity index 100% rename from i18n/ms-MY.i18n.json rename to imports/i18n/data/ms-MY.i18n.json diff --git a/i18n/nb.i18n.json b/imports/i18n/data/nb.i18n.json similarity index 100% rename from i18n/nb.i18n.json rename to imports/i18n/data/nb.i18n.json diff --git a/i18n/nl.i18n.json b/imports/i18n/data/nl.i18n.json similarity index 100% rename from i18n/nl.i18n.json rename to imports/i18n/data/nl.i18n.json diff --git a/i18n/oc.i18n.json b/imports/i18n/data/oc.i18n.json similarity index 100% rename from i18n/oc.i18n.json rename to imports/i18n/data/oc.i18n.json diff --git a/i18n/pa.i18n.json b/imports/i18n/data/pa.i18n.json similarity index 100% rename from i18n/pa.i18n.json rename to imports/i18n/data/pa.i18n.json diff --git a/i18n/pl.i18n.json b/imports/i18n/data/pl.i18n.json similarity index 100% rename from i18n/pl.i18n.json rename to imports/i18n/data/pl.i18n.json diff --git a/i18n/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json similarity index 100% rename from i18n/pt-BR.i18n.json rename to imports/i18n/data/pt-BR.i18n.json diff --git a/i18n/pt.i18n.json b/imports/i18n/data/pt.i18n.json similarity index 100% rename from i18n/pt.i18n.json rename to imports/i18n/data/pt.i18n.json diff --git a/i18n/ro.i18n.json b/imports/i18n/data/ro.i18n.json similarity index 100% rename from i18n/ro.i18n.json rename to imports/i18n/data/ro.i18n.json diff --git a/i18n/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json similarity index 100% rename from i18n/ru-UA.i18n.json rename to imports/i18n/data/ru-UA.i18n.json diff --git a/i18n/ru.i18n.json b/imports/i18n/data/ru.i18n.json similarity index 100% rename from i18n/ru.i18n.json rename to imports/i18n/data/ru.i18n.json diff --git a/i18n/sk.i18n.json b/imports/i18n/data/sk.i18n.json similarity index 100% rename from i18n/sk.i18n.json rename to imports/i18n/data/sk.i18n.json diff --git a/i18n/sl.i18n.json b/imports/i18n/data/sl.i18n.json similarity index 100% rename from i18n/sl.i18n.json rename to imports/i18n/data/sl.i18n.json diff --git a/i18n/sr.i18n.json b/imports/i18n/data/sr.i18n.json similarity index 100% rename from i18n/sr.i18n.json rename to imports/i18n/data/sr.i18n.json diff --git a/i18n/sv.i18n.json b/imports/i18n/data/sv.i18n.json similarity index 100% rename from i18n/sv.i18n.json rename to imports/i18n/data/sv.i18n.json diff --git a/i18n/sw.i18n.json b/imports/i18n/data/sw.i18n.json similarity index 100% rename from i18n/sw.i18n.json rename to imports/i18n/data/sw.i18n.json diff --git a/i18n/ta.i18n.json b/imports/i18n/data/ta.i18n.json similarity index 100% rename from i18n/ta.i18n.json rename to imports/i18n/data/ta.i18n.json diff --git a/i18n/th.i18n.json b/imports/i18n/data/th.i18n.json similarity index 100% rename from i18n/th.i18n.json rename to imports/i18n/data/th.i18n.json diff --git a/i18n/tr.i18n.json b/imports/i18n/data/tr.i18n.json similarity index 100% rename from i18n/tr.i18n.json rename to imports/i18n/data/tr.i18n.json diff --git a/i18n/uk-UA.i18n.json b/imports/i18n/data/ua-UA.i18n.json similarity index 100% rename from i18n/uk-UA.i18n.json rename to imports/i18n/data/ua-UA.i18n.json diff --git a/i18n/uk.i18n.json b/imports/i18n/data/ua.i18n.json similarity index 100% rename from i18n/uk.i18n.json rename to imports/i18n/data/ua.i18n.json diff --git a/i18n/vi.i18n.json b/imports/i18n/data/vi.i18n.json similarity index 100% rename from i18n/vi.i18n.json rename to imports/i18n/data/vi.i18n.json diff --git a/i18n/zh-CN.i18n.json b/imports/i18n/data/zh-CN.i18n.json similarity index 100% rename from i18n/zh-CN.i18n.json rename to imports/i18n/data/zh-CN.i18n.json diff --git a/i18n/zh-HK.i18n.json b/imports/i18n/data/zh-HK.i18n.json similarity index 100% rename from i18n/zh-HK.i18n.json rename to imports/i18n/data/zh-HK.i18n.json diff --git a/i18n/zh-TW.i18n.json b/imports/i18n/data/zh-TW.i18n.json similarity index 100% rename from i18n/zh-TW.i18n.json rename to imports/i18n/data/zh-TW.i18n.json diff --git a/imports/i18n/index.js b/imports/i18n/index.js new file mode 100644 index 000000000..cc42e80aa --- /dev/null +++ b/imports/i18n/index.js @@ -0,0 +1,14 @@ +import { TAPi18n } from './tap'; +import './accounts'; +import './moment'; + +if (Meteor.isClient) { + import './blaze'; +} + +export { TAPi18n }; + +(async () => { + await TAPi18n.init(); +})(); + diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js new file mode 100644 index 000000000..48a421de6 --- /dev/null +++ b/imports/i18n/languages.js @@ -0,0 +1,470 @@ +export default { + "ar-EG": { + code: "ar", + isoCode: "ar-EG", + name: "مَصرى", + load: () => import('./data/ar-EG.i18n.json'), + }, + "ar": { + code: "ar", + isoCode: "ar", + name: "ar", + load: () => import('./data/ar.i18n.json'), + }, + "bg": { + code: "bg", + isoCode: "bg", + name: "bg", + load: () => import('./data/bg.i18n.json'), + }, + "br": { + code: "br", + isoCode: "br", + name: "Brezhoneg", + load: () => import('./data/xxx.i18n.json'), + }, + "ca": { + code: "ca", + isoCode: "ca", + name: "ca", + load: () => import('./data/ca.i18n.json'), + }, + "cs": { + code: "cs", + isoCode: "cs", + name: "cs", + load: () => import('./data/cs.i18n.json'), + }, + "da": { + code: "da", + isoCode: "da", + name: "da", + load: () => import('./data/da.i18n.json'), + }, + "de-AT": { + code: "de", + isoCode: "de-AT", + name: "Deutsch (Österreich)", + load: () => import('./data/de-AT.i18n.json'), + }, + "de-CH": { + code: "de", + isoCode: "de-CH", + name: "Deutsch (Schweiz)", + load: () => import('./data/de-CH.i18n.json'), + }, + "de": { + code: "de", + isoCode: "de", + name: "Deutsch", + load: () => import('./data/de.i18n.json'), + }, + "el-GR": { + code: "el", + isoCode: "el-GR", + name: "Ελληνικά (Ελλάδα)", + load: () => import('./data/el-GR.i18n.json'), + }, + "el": { + code: "el", + isoCode: "el", + name: "el", + load: () => import('./data/el.i18n.json'), + }, + "en-DE": { + code: "en", + isoCode: "en-DE", + name: "English (Germany)", + load: () => import('./data/en-DE.i18n.json'), + }, + "en-GB": { + code: "en", + isoCode: "en-GB", + name: "English (Great Britain)", + load: () => import('./data/en-GB.i18n.json'), + }, + "en-IT": { + code: "en", + isoCode: "en-IT", + name: "English (Italy)", + load: () => import('./data/en-IT.i18n.json'), + }, + "en": { + code: "en", + isoCode: "en", + name: "English", + load: () => import('./data/en.i18n.json'), + }, + "eo": { + code: "eo", + isoCode: "eo", + name: "eo", + load: () => import('./data/eo.i18n.json'), + }, + "es-AR": { + code: "es", + isoCode: "es-AR", + name: "español de Argentina", + load: () => import('./data/es-AR.i18n.json'), + }, + "es-CL": { + code: "es", + isoCode: "es-CL", + name: "español de Chile", + load: () => import('./data/es-CL.i18n.json'), + }, + "es-LA": { + code: "es", + isoCode: "es-LA", + name: "español de América Latina", + load: () => import('./data/es-LA.i18n.json'), + }, + "es-MX": { + code: "es", + isoCode: "es-MX", + name: "español de México", + load: () => import('./data/es-MX.i18n.json'), + }, + "es-PE": { + code: "es", + isoCode: "es-PE", + name: "español de Perú", + load: () => import('./data/es-PE.i18n.json'), + }, + "es-PY": { + code: "es", + isoCode: "es-PY", + name: "español de Paraguayo", + load: () => import('./data/es-PY.i18n.json'), + }, + "es": { + code: "es", + isoCode: "es", + name: "español", + load: () => import('./data/es.i18n.json'), + }, + "et-EE": { + code: "et", + isoCode: "et-EE", + name: "eesti keel (Eesti)", + load: () => import('./data/et-EE.i18n.json'), + }, + "eu": { + code: "eu", + isoCode: "eu", + name: "eu", + load: () => import('./data/eu.i18n.json'), + }, + "fa-IR": { + code: "fa", + isoCode: "fa-IR", + name: "فارسی/پارسی (ایران\u200e)", + load: () => import('./data/fa-IR.i18n.json'), + }, + "fa": { + code: "fa", + isoCode: "fa", + name: "fa", + load: () => import('./data/fa.i18n.json'), + }, + "fi-FI": { + code: "fi", + isoCode: "fi-FI", + name: "Suomi", + load: () => import('./data/fi-FI.i18n.json'), + }, + "fr-BE": { + code: "fr", + isoCode: "fr-BE", + name: "Français (Belgique)", + load: () => import('./data/fr-BE.i18n.json'), + }, + "fr-CA": { + code: "fr", + isoCode: "fr-CA", + name: "Français (Canada)", + load: () => import('./data/fr-CA.i18n.json'), + }, + "fr-CH": { + code: "fr", + isoCode: "fr-CH", + name: "Français (Schweiz)", + load: () => import('./data/fr-CH.i18n.json'), + }, + "fr": { + code: "fr", + isoCode: "fr", + name: "Français", + load: () => import('./data/fr.i18n.json'), + }, + "gl-ES": { + code: "gl", + isoCode: "gl-ES", + name: "Galego (España)", + load: () => import('./data/gl-ES.i18n.json'), + }, + "gl": { + code: "gl", + isoCode: "gl", + name: "Galego", + load: () => import('./data/gl.i18n.json'), + }, + "gu-IN": { + code: "gu", + isoCode: "gu-IN", + name: "ગુજરાતી", + load: () => import('./data/gu-IN.i18n.json'), + }, + "he": { + code: "he", + isoCode: "he", + name: "he", + load: () => import('./data/he.i18n.json'), + }, + "hi-IN": { + code: "hi", + isoCode: "hi-IN", + name: "हिंदी (भारत)", + load: () => import('./data/hi-IN.i18n.json'), + }, + "hi": { + code: "hi", + isoCode: "hi", + name: "hi", + load: () => import('./data/hi.i18n.json'), + }, + "hr": { + code: "hr", + isoCode: "hr", + name: "hr", + load: () => import('./data/hr.i18n.json'), + }, + "hu": { + code: "hu", + isoCode: "hu", + name: "hu", + load: () => import('./data/hu.i18n.json'), + }, + "hy": { + code: "hy", + isoCode: "hy", + name: "hy", + load: () => import('./data/hy.i18n.json'), + }, + "id": { + code: "id", + isoCode: "id", + name: "id", + load: () => import('./data/id.i18n.json'), + }, + "ig": { + code: "ig", + isoCode: "ig", + name: "Igbo", + load: () => import('./data/ig.i18n.json'), + }, + "it": { + code: "it", + isoCode: "it", + name: "it", + load: () => import('./data/it.i18n.json'), + }, + "ja": { + code: "ja", + isoCode: "ja", + name: "ja", + load: () => import('./data/ja.i18n.json'), + }, + "ka": { + code: "ka", + isoCode: "ka", + name: "ka", + load: () => import('./data/ka.i18n.json'), + }, + "km": { + code: "km", + isoCode: "km", + name: "km", + load: () => import('./data/km.i18n.json'), + }, + "ko": { + code: "ko", + isoCode: "ko", + name: "ko", + load: () => import('./data/ko.i18n.json'), + }, + "lt": { + code: "lt", + isoCode: "lt", + name: "lt", + load: () => import('./data/lt.i18n.json'), + }, + "lv": { + code: "lv", + isoCode: "lv", + name: "Latviešu", + load: () => import('./data/lv.i18n.json'), + }, + "mk": { + code: "mk", + isoCode: "mk", + name: "mk", + load: () => import('./data/mk.i18n.json'), + }, + "mn": { + code: "mn", + isoCode: "mn", + name: "mn", + load: () => import('./data/mn.i18n.json'), + }, + "ms-MY": { + code: "ms", + isoCode: "ms-MY", + name: "بهاس ملايو", + load: () => import('./data/ms-MY.i18n.json'), + }, + "nb": { + code: "nb", + isoCode: "nb", + name: "nb", + load: () => import('./data/nb.i18n.json'), + }, + "nl": { + code: "nl", + isoCode: "nl", + name: "nl", + load: () => import('./data/nl.i18n.json'), + }, + "oc": { + code: "oc", + isoCode: "oc", + name: "Occitan", + load: () => import('./data/oc.i18n.json'), + }, + "pa": { + code: "pa", + isoCode: "pa", + name: "pa", + load: () => import('./data/pa.i18n.json'), + }, + "pl": { + code: "pl", + isoCode: "pl", + name: "pl", + load: () => import('./data/pl.i18n.json'), + }, + "pt-BR": { + code: "pt", + isoCode: "pt-BR", + name: "pt-BR", + load: () => import('./data/pt-BR.i18n.json'), + }, + "pt": { + code: "pt", + isoCode: "pt", + name: "pt", + load: () => import('./data/pt.i18n.json'), + }, + "ro": { + code: "ro", + isoCode: "ro", + name: "ro", + load: () => import('./data/ro.i18n.json'), + }, + "ru-UA": { + code: "ru", + isoCode: "ru-UA", + name: "Русский (Украина)", + load: () => import('./data/ru-UA.i18n.json'), + }, + "ru": { + code: "ru", + isoCode: "ru", + name: "Русский", + load: () => import('./data/ru.i18n.json'), + }, + "sk": { + code: "sk", + isoCode: "sk", + name: "sk", + load: () => import('./data/sk.i18n.json'), + }, + "sl": { + code: "sl", + isoCode: "sl", + name: "sl", + load: () => import('./data/sl.i18n.json'), + }, + "sr": { + code: "sr", + isoCode: "sr", + name: "sr", + load: () => import('./data/sr.i18n.json'), + }, + "sv": { + code: "sv", + isoCode: "sv", + name: "sv", + load: () => import('./data/sv.i18n.json'), + }, + "sw": { + code: "sw", + isoCode: "sw", + name: "sw", + load: () => import('./data/sw.i18n.json'), + }, + "ta": { + code: "ta", + isoCode: "ta", + name: "ta", + load: () => import('./data/ta.i18n.json'), + }, + "th": { + code: "th", + isoCode: "th", + name: "th", + load: () => import('./data/th.i18n.json'), + }, + "tr": { + code: "tr", + isoCode: "tr", + name: "tr", + load: () => import('./data/tr.i18n.json'), + }, + "ua-UA": { + code: "ua", + isoCode: "ua-UA", + name: "українська (Україна)", + load: () => import('./data/ua-UA.i18n.json'), + }, + "ua": { + code: "ua", + isoCode: "ua", + name: "українська (Україна)", + load: () => import('./data/ua.i18n.json'), + }, + "vi": { + code: "vi", + isoCode: "vi", + name: "vi", + load: () => import('./data/vi.i18n.json'), + }, + "zh-CN": { + code: "zh", + isoCode: "zh-CN", + name: "zh-CN", + load: () => import('./data/zh-CN.i18n.json'), + }, + "zh-HK": { + code: "zh", + isoCode: "zh-HK", + name: "zh-HK", + load: () => import('./data/zh-HK.i18n.json'), + }, + "zh-TW": { + code: "zh", + isoCode: "zh-TW", + name: "繁體中文(台灣)", + load: () => import('./data/zh-TW.i18n.json'), + } +}; diff --git a/imports/i18n/moment.js b/imports/i18n/moment.js new file mode 100644 index 000000000..998e45f86 --- /dev/null +++ b/imports/i18n/moment.js @@ -0,0 +1,13 @@ +import { Tracker } from 'meteor/tracker'; +import moment from 'moment/min/moment-with-locales'; +import { TAPi18n } from './tap'; + +// Reactively adjust Moment.js translations +Tracker.autorun(() => { + const language = TAPi18n.getLanguage(); + try { + moment.locale(language); + } catch (err) { + console.error(err); + } +}); diff --git a/imports/i18n/tap.js b/imports/i18n/tap.js new file mode 100644 index 000000000..4fa632a84 --- /dev/null +++ b/imports/i18n/tap.js @@ -0,0 +1,60 @@ +import { Meteor } from 'meteor/meteor'; +import { ReactiveVar } from 'meteor/reactive-var'; +import i18next from 'i18next'; +import sprintf from 'i18next-sprintf-postprocessor'; +import languages from './languages'; + +const DEFAULT_NAMESPACE = 'translation'; +const DEFAULT_LANGUAGE = 'en'; + +// Carefully reproduced tap:i18n API +export const TAPi18n = { + i18n: null, + current: new ReactiveVar(DEFAULT_LANGUAGE), + async init() { + this.i18n = i18next.createInstance().use(sprintf); + await this.i18n.init({ + fallbackLng: DEFAULT_LANGUAGE, + cleanCode: true, + debug: Meteor.isDevelopment, + supportedLngs: Object.values(languages).map(({ isoCode }) => isoCode), + ns: DEFAULT_NAMESPACE, + defaultNs: DEFAULT_NAMESPACE, + postProcess: ["sprintf"], + // Default values to match tap:i18n behaviour + interpolation: { + prefix: '__', + suffix: '__', + escapeValue: false, + }, + resources: {}, + }); + // Load the current language data + await TAPi18n.loadLanguage(DEFAULT_LANGUAGE); + }, + getSupportedLanguages() { + return Object.values(languages).map(({ name, code, isoCode }) => ({ name, code, isoCode })); + }, + getLanguage() { + return this.current.get(); + }, + async loadLanguage(language) { + if (language in languages && 'load' in languages[language]) { + const data = await languages[language].load(); + this.i18n.addResourceBundle(language, DEFAULT_NAMESPACE, data); + } + }, + async setLanguage(language) { + await this.loadLanguage(language); + await this.i18n.changeLanguage(language); + this.current.set(language); + }, + // Return translation by key + __(key, options, language) { + this.current.dep.depend(); + return this.i18n.t(key, { + ...options, + lng: language, + }); + } +}; diff --git a/models/boards.js b/models/boards.js index 5ca2a8e5f..582d04789 100644 --- a/models/boards.js +++ b/models/boards.js @@ -1,3 +1,5 @@ +import escapeForRegex from 'escape-string-regexp'; +import { TAPi18n } from '/imports/i18n'; import { ALLOWED_BOARD_COLORS, ALLOWED_COLORS, @@ -7,7 +9,6 @@ import { } from '/config/const'; import Users from "./users"; -const escapeForRegex = require('escape-string-regexp'); Boards = new Mongo.Collection('boards'); /** diff --git a/models/cards.js b/models/cards.js index 142b738a4..c17bc546a 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1,3 +1,4 @@ +import moment from 'moment'; import { ALLOWED_COLORS, TYPE_CARD, diff --git a/models/exportExcel.js b/models/exportExcel.js index f7f861141..dabc49526 100644 --- a/models/exportExcel.js +++ b/models/exportExcel.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { runOnServer } from './runOnServer'; runOnServer(function() { @@ -49,12 +50,12 @@ runOnServer(function() { isAdmin: true, }); } - + let userLanguage = 'en'; if(user && user.profile){ userLanguage = user.profile.language } - + const exporterExcel = new ExporterExcel(boardId, userLanguage); if (exporterExcel.canExport(user) || impersonateDone) { if (impersonateDone) { diff --git a/models/exportPDF.js b/models/exportPDF.js index e698d2f52..eceffc9c9 100644 --- a/models/exportPDF.js +++ b/models/exportPDF.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import { runOnServer } from './runOnServer'; runOnServer(function() { diff --git a/models/exporter.js b/models/exporter.js index f05b86881..4aefa4153 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -1,4 +1,6 @@ +import moment from 'moment'; const Papa = require('papaparse'); +import { TAPi18n } from '/imports/i18n'; // exporter maybe is broken since Gridfs introduced, add fs and path export class Exporter { @@ -209,7 +211,7 @@ export class Exporter { delimiter: userDelimiter, header: true, newline: "\r\n", - skipEmptyLines: false, + skipEmptyLines: false, escapeFormulae: true, }; diff --git a/models/server/ExporterExcel.js b/models/server/ExporterExcel.js index 1f0736acf..e5656626f 100644 --- a/models/server/ExporterExcel.js +++ b/models/server/ExporterExcel.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; import { createWorkbook } from './createWorkbook'; // exporter maybe is broken since Gridfs introduced, add fs and path @@ -432,7 +434,7 @@ class ExporterExcel { //add blank row ws.addRow().values = ['', '', '', '', '', '']; - + //add board description ws.addRow().values = [ TAPi18n.__('description','',this.userLanguage), @@ -442,7 +444,7 @@ class ExporterExcel { ws.mergeCells('B3:H3'); ws.getRow(3).height = 40; // In MS Excel, we can't use the AutoFit feature on a column that contains a cell merged with cells in other columns. - // Likewise, we can't use AutoFit on a row that contains a cell merged with cells in other rows. + // Likewise, we can't use AutoFit on a row that contains a cell merged with cells in other rows. ws.getRow(3).font = { name: TAPi18n.__('excel-font'), size: 10, @@ -459,7 +461,7 @@ class ExporterExcel { vertical: 'middle', }; cellCenter('A3'); - + //add blank row ws.addRow().values = ['', '', '', '', '', '']; @@ -494,7 +496,7 @@ class ExporterExcel { }, numFmt: 'yyyy/mm/dd hh:mm:ss', }; - + cellCenter('A5'); cellCenter('B5'); cellCenter('C5'); @@ -502,7 +504,7 @@ class ExporterExcel { cellCenter('E5'); cellLeft('F5'); ws.getRow(5).height = 20; - + allBorder('A5'); allBorder('B5'); allBorder('C5'); @@ -786,7 +788,7 @@ class ExporterExcel { }, }; } - + //add title line ws2.mergeCells('A1:F1'); ws2.getCell('A1').value = result.title; @@ -813,7 +815,7 @@ class ExporterExcel { TAPi18n.__('card','',this.userLanguage), TAPi18n.__('owner','',this.userLanguage), TAPi18n.__('createdAt','',this.userLanguage), - TAPi18n.__('last-modified-at','',this.userLanguage), + TAPi18n.__('last-modified-at','',this.userLanguage), ]; ws2.getRow(3).height = 20; ws2.getRow(3).font = { diff --git a/models/settings.js b/models/settings.js index 91cd1d183..e24804c3c 100644 --- a/models/settings.js +++ b/models/settings.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; //var nodemailer = require('nodemailer'); // Sandstorm context is detected using the METEOR_SETTINGS environment variable diff --git a/models/trelloCreator.js b/models/trelloCreator.js index 98179b81f..5f591c46a 100644 --- a/models/trelloCreator.js +++ b/models/trelloCreator.js @@ -1,3 +1,6 @@ +import moment from 'moment'; +import { TAPi18n } from '/imports/i18n'; + const DateString = Match.Where(function(dateAsString) { check(dateAsString, String); return moment(dateAsString, moment.ISO_8601).isValid(); diff --git a/models/users.js b/models/users.js index 331a801b4..b42f6fe39 100644 --- a/models/users.js +++ b/models/users.js @@ -1,5 +1,6 @@ //var nodemailer = require('nodemailer'); import { SyncedCron } from 'meteor/percolate:synced-cron'; +import { TAPi18n } from '/imports/i18n'; import ImpersonatedUsers from './impersonatedUsers'; // Sandstorm context is detected using the METEOR_SETTINGS environment variable diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 310230e7c..7aaf7f6eb 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -1,3 +1,5 @@ +import moment from 'moment'; + const DateString = Match.Where(function(dateAsString) { check(dateAsString, String); return moment(dateAsString, moment.ISO_8601).isValid(); diff --git a/package-lock.json b/package-lock.json index 14f4bb162..b34180672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -449,6 +449,14 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } } }, "asn1": { @@ -693,6 +701,14 @@ "type-detect": "^4.0.5" } }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "requires": { + "check-error": "^1.0.2" + } + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -721,8 +737,7 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, "clone": { "version": "2.1.2", @@ -1802,6 +1817,29 @@ } } }, + "i18next": { + "version": "21.6.16", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz", + "integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==", + "requires": { + "@babel/runtime": "^7.17.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" + }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2212,6 +2250,11 @@ "lodash.template": "^4.5.0" } }, + "meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, "meteor-node-stubs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", @@ -3449,6 +3492,11 @@ } } }, + "sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3479,12 +3527,6 @@ "memory-pager": "^1.0.2" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "string-width": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.0.tgz", diff --git a/package.json b/package.json index 04d022d97..32c03530a 100644 --- a/package.json +++ b/package.json @@ -28,13 +28,16 @@ "bcryptjs": "^2.4.3", "bson": "^4.4.1", "bunyan": "^1.8.15", - "core-js": "^2.6.12", - "dompurify": "^2.3.0", + "chai-as-promised": "^7.1.1", + "core-js": "^3.18.2", + "dompurify": "^2.3.2", "es6-promise": "^4.2.4", "escape-string-regexp": "^5.0.0", "exceljs": "^4.2.1", "fibers": "^5.0.0", "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", + "i18next": "^21.6.16", + "i18next-sprintf-postprocessor": "^0.2.2", "jquery": "^2.2.4", "jquery-ui": "^1.13.0", "jquery-ui-touch-punch": "^0.2.3", @@ -42,6 +45,7 @@ "ldapjs": "^2.3.1", "markdown-it": "^12.3.2", "markdown-it-emoji": "^2.0.0", + "meteor-accounts-t9n": "^2.6.0", "meteor-node-stubs": "^1.1.0", "moment": "^2.29.1", "mongodb": "^3.7.3", @@ -50,7 +54,9 @@ "papaparse": "^5.3.1", "qs": "^6.10.1", "simpl-schema": "^1.12.0", - "source-map-support": "^0.5.19" + "sinon-chai": "^3.7.0", + "source-map-support": "^0.5.20", + "uuid": "^8.3.2" }, "meteor": { "testModule": "tests/main.js" diff --git a/packages/wekan-tap-i18n/ChangeLog b/packages/wekan-tap-i18n/ChangeLog deleted file mode 100644 index e58de9fd7..000000000 --- a/packages/wekan-tap-i18n/ChangeLog +++ /dev/null @@ -1,216 +0,0 @@ -2016.05.24, Version 1.8.1 - -* Avoid race condition in setLanguage method. Fixes #86, thanks @mpowaga - -2016.03.14, Version 1.8.0 - -* YAML translations files support, thanks @karfield @nscarcella - -2015.10.06, Version 1.7.0 - -* Ready for Meteor v1.2 - -2015.09.19, Version 1.6.1 - -* [BUGFIX] Fix compiler's output path, thanks @glyphing - -2015.07.24, Version 1.6.0 - -* Implement project-tap.i18n's preloaded_langs option -* Improve Chinese dialects names - -2015.07.06, Version 1.5.1 - -* Register server side translator for fallback language correctly, fix #82 - -2015.05.08, Version 1.5.0 - -* Make TAPi18n a constructor instead of object, inherit from EventEmitter -* Make the lang option alias to the lng option in tap:i18n translator functions -* Allow translation to a specific language on the client -* [BUGFIX] Allow pre Meteor.startup() server side translations, resolves #56 -* [BUGFIX] Allow 0 as first argument of sprintf args. fix #43 -* [MINOR] i18next: Fix plurals function for Mandinka @hamoid -* [MINOR] README: Added note about dot notation @SachaG -* [MINOR] Correct name for Ukrainina language @shkomg -* [MINOR] Travis CI: Stop testing node v0.8 - -2015.02.28, Version 1.4.1 - -* [bugfix] Under cordova ensure absoluteUrl have no trailing / - -2015.02.05, Version 1.4.0 - -* Add Cordova support (requires internet connection) - -2015.01.16, Version 1.3.2 - -* Use simple-schema 1.3.0 - -2015.01.14, Version 1.3.1 - -* [bugfix] getLanguages() should return languages defined as supported in - project-tap.i18n even if there is no *.i18n.json for these languages in - the project level -* [bugfix] getLanguages() shouldn't return non-supported languages Fix #38 -* Use cfs:http-methods@0.0.27 instead of tap:http-methods@0.0.23 - -2015.01.11, Version 1.3.0 - -* Fix language_names object keys, fix #36 -* Disable TAPi18next cookie feature that caused anomalies -* Introduce TAPi18n.loadTranslations - -2014.11.25, Version 1.2.1 - -* Register helpers with Template.template.helpers() -* [bugfix] fix the package templates detection (got broken by a Meteor API change) - -2014.11.25, Version 1.2.0 - -* package-tap.i18n: Introduce the namespace option - -2014.11.22, Version 1.1.1 - -* [bugfix] build plugin: don't assign _ var to global namespace. Thanks -@smeijer . #30 - -2014.11.18, Version 1.1.0 - -* Allow the use of comments in *.i18n.json files -* [MINOR] package.js: use METEOR@0.9.4, and the stable version of registerBuildPlugin -* [MINOR] fix a symbolic link -* [MINOR] add to the tree files that were missing due to wrong .gitignore - -2014.09.25, Version 1.0.7 - -* [bugfix] Packages non-fallback languages now load see issue #13 Thanks - to @francocatena . -* [bugfix] tap:i18n files of packages under /packages directory now load - correctly - -2014.09.24, Version 1.0.6, 304e1ee00e2916646bf672fd53ef5a6cceb69db4 - -* [bugfix] Project level: Make loading of tap:i18n files insensitive to order by - Registering template helpers as soon as tap:i18n gets enabled and not on - Meteor.ready() . Thanks to @danieljonce for reporting this issue - -2014.09.24, Version 1.0.5, df044dc3523d1ebb608f1e115a31539b4ba42742 - -* Project level: languages files should be common to server and client -* Fix unitests - add languages files to the tree -* Remove redundant output from i18n.json and project-tap.i18n compilers - -2014.09.19, Version 1.0.4, 4d843a11cf757ef6d2ff6534a1c6b757b91eedda - -* [bugfix] each language file should have its own output path - (this bug prevented multiple files per language in the app level) - -2014.09.16, Version 1.0.3, 888f3dd5066e320513a76f5bb1ce711a7a84478d - -* [bugfix] TAPi18n.getLanguages() format is now compatible with docs - -2014.09.10, Version 1.0.2, 66fcd441f3b6a107db0aa32c8f3ea9692c1c8c09 - -* [bugfix] compiler: fix error for invalid JSON - -2014.09.10, Version 1.0.1, 7f92b8fbd8ced171873b8afd70a808f51167e7ac - -* Allow project-tap.i18n's supported_languages to have a lang with no -translation files -* [bugfix] tap-i18n compiler: init compiler_configuration upon a rebuild - -2014.09.09, Version 1.0.0, 5964838f9ab085136d45899d38bb126958c3deda - -* Build plugin rewritten -* tap-i18n now fully support Meteor v0.9 -* Ready to be used with Cordova -* **New Features:** -* Server side internationalization is now supported. -* The template translation helper name (_) and the package translation function -name (__) are now customizable. -* Transparent bundling, no need for special procedures for deploying project -that uses tap-i18n. -* Language files and project-tap.i18n can now be located anywhere in the project tree. -* A project/package can now have more than one language file for the same -language. -* getLanguages() now works in both server and client. -* **Backward compatibility:** -* package i18n files now have to be added to both the client and the server -architectures, not only the client. -* The base language of a dialects are no longer added automatically as a supported -language. -* project-tap.i18n: languages_files_dir and build_files_path properties are now -obsolete. browser_path property renamed to cdn_path. -* package-tap.i18n: languages_files_dir is now obsolete. - -2014.08.30, Version 0.9.2, 742e44f659dfb7800d332bf4b2aa990e6f220d36 - -* Bugfix: Build plugin should consider projects with a *:i18n package as tap:i18n enabled -* Use tap:http-methods instead of raix:http-methods which isn't ready for v0.9.0 - -2014.08.30, Version 0.9.0, 118aa825e76165aac9df9f3153fbb8edc044a864 - -* tap-i18n is now tap:i18n -* Migrate to Meteor v0.9 - -2014.08.11, Version 0.8.0, a500ae5c5c6da2aa0ccd56bfe407bfa9c8a77b62 - -* [MINOR] package.js: only use single quotes to enclose strings -* Do not require having a file for the base language of a dialect -* Build plugin: make sure isString before removeFileTrailingSeparator - -2014.07.30, Version 0.7.0, 7c414420e65cb67a9e49896826542db1815a257c - -* Refactor build plugin. Fix a rare bug causing the proj base lang not to load -* build plugin: catch all build errors and use compileStep.error to report them -* Do not build/load supported languages with no translation files - -2014.06.26, Version 0.6.0, 7e9685ce75165a6a5998f6f4643490fc1e14c166 - -* Introduce {{languageTag}} -* README: add instuctions for deploying tap-i18n projects to *.meteor.com -* tap-i18n now works in Meteor bundles - -2014.06.14, Version 0.5.1, 71a9ad595e972998e16d7cbd60fed699127464c3 - -* Bugfix: Trigger buildFilesOnce for .i18n.json files for the os arch so - TAPi18n.conf will get set if there is no project-tap.i18n - -2014.06.13, Version 0.5.0, 0d7ea8c3ac8307b3d48efc6c8b80b1ce2dd1e8b1 - -* Unittests now work on mac -* Introduce TAPi18n.getLanguages() - -2014.06.12, Version 0.4.0, f583aa179b559d447519c61dcdb019f05a0b10a3 - -* README restructured -* Set lisence to: MIT - -2014.06.11, Version 0.3.0, ba328abf4e057b60c82cfb455d183fe1ff4605cd - -* Refresh the clients when .i18n.json files change -* bugfix: build files if i18n.json files change for case we don't have - project-tap.i18n to trigger build -* Show debug meesages only if globals.debug is true or env variable - TAP_I18N_DEBUG is "true" -* project-tap.i18n ignore default_browser_path if build_files_path is null -* Fixes to README - -2014.06.10, Version 0.2.0, 50bb1e9643e8233438ff7614bb79ca3dd575a3a8 - -* Implement project-level translations -* For enabled tap-i18n projects use the http-methods package as the default - mean for serving unified languages files instead of /public -* API change: Consider projects with no project-tap.i18n as tap-i18n enabled -* API change: By default, regard all the languages we find translations for as - supported_languages -* API change: No package-level default language - en is our fallback_language - everywhere -* Improve the unittesting framework -* Naming: Use TAPi18n and TAPi18next instead of TapI18n and TapI18next -* Bugfix: don't add an error object when throwing exception if error - -2014.05.22, Version 0.1.0, 676f50f0bea154596cacf44c34c352b09aa1d215 - -* tap-i18n first release diff --git a/packages/wekan-tap-i18n/LICENSE b/packages/wekan-tap-i18n/LICENSE deleted file mode 100644 index 8d0265994..000000000 --- a/packages/wekan-tap-i18n/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 TAPevents Asia Limited <accounts@tapevents.com> - -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. \ No newline at end of file diff --git a/packages/wekan-tap-i18n/README.md b/packages/wekan-tap-i18n/README.md deleted file mode 100644 index 8219a6c58..000000000 --- a/packages/wekan-tap-i18n/README.md +++ /dev/null @@ -1,808 +0,0 @@ -# tap-i18n - -A comprehensive internationalization solution for Meteor - -### Internationalization for Meteor - -**tap-i18n** is a [Meteor](http://www.meteor.com) package that provides a comprehensive [i18n](http://www.i18nguy.com/origini18n.html) solution for Meteor apps and packages, -with the goal of standardizing the way package developers internationalize their -packages. - -[Watch a talk about tap:i18n & tap:i18n-db](https://www.youtube.com/watch?v=cu_dsoIc_0E) - -**Get involved in tap:i18n:** - -* [Mailing list](http://groups.google.com/d/forum/tap-i18n) -* [tap:i18n chat on Gitter](https://gitter.im/TAPevents/tap-i18n) -* [Roadmap](https://trello.com/b/w80JNkwf/tap-i18n-roadmap) -* [New features planning on Hackpad](https://hackpad.com/collection/DRzcZ7sBdZV) - -Developed by <a href="http://www.meteorspark.com"><img src="http://www.meteorspark.com/logo/logo-github.png" title="MeteorSpark" alt="MeteorSpark"></a> [Professional Meteor Services](http://www.meteorspark.com)<br/> for <a href="http://tapevents.com/"><img src="http://tapevents.com/wp-content/uploads/2015/02/TAPevents_logo_144px.png" title="TAPevents" alt="TAPevents" style='margin-top:10px'>  Leading Conference Technology</a>. - -**Related Packages:** - -* Check [tap:i18n-db](https://github.com/TAPevents/tap-i18n-db) for Meteor collections internationalization. -* Check [tap:i18n-ui](https://github.com/TAPevents/tap-i18n-ui) for bootstrap based UI components for tap:i18n. -* Check [tap:i18n-bundler](https://github.com/TAPevents/i18n-bundler) for Cordova & static file deployments. - -**Users of tap-i18n v0.9** and below, read [tap:i18n v1.0 New Features & Backward Compatibility](https://github.com/TAPevents/tap-i18n/wiki/tap:i18n-v1.0-New-Feautres-&-Backward-Compatibility) and update your app to v1.0 . - -## Contents - -- [Key Features](#key-features) -- [Quickstart](#quickstart) -- [Documentation & Examples](#documentation--examples) - - [TAPi18n API](#tapi18n-api) - - [The tap-i18n Helpers](#the-tap-i18n-helpers) - - [Languages Tags and Translations Prioritization](#languages-tags-and-translations-prioritization) - - [Structure of Languages Files](#structure-of-languages-files) - - [Configuring tap-i18n](#configuring-tap-i18n) - - [Disabling tap-i18n](#disabling-tap-i18n) - - [Using tap-i18n in Cordova apps](#using-tap-i18n-in-cordova-apps) -- [Developing Packages](#developing-packages) - - [tap-i18n Two Work Modes](#tap-i18n-two-work-modes) - - [Setup tap-i18n](#setup-tap-i18n) - - [Package Level tap-i18n Functions](#package-level-tap-i18n-functions) - - [Using tap-i18n in Your Package Templates](#using-tap-i18n-in-your-package-templates) -- [Unit Testing](#unit-testing) -- [License](#license) -- [Credits](#credits) - -## Key Features - -### All Encompassing - -tap-i18n is designed in a way that distinguishes the role of the package developer, that is, making the package available in multiple languages, from the role of the app developer which is to translate the app, but more importantly, to manage the app's internationalization aspects, such as: setting the supported languages for the project, setting the client language, configuring CDNs for language files, and so on. - -### Readable Syntax - -```handlebars -<div class="btn">{{_ "sign_up"}}</div> -``` - -### Advanced i18n - -tap-i18n uses [i18next v1.11](http://i18next.github.io/i18next/) as its internationalization engine and exposes all its capabilities to the Meteor's templates - variables, dialects, count/context aware keys, and more. - -**client/messages.html** - -```handlebars -<template name="messages_today"> - <p>{{_ "inbox_status" "Daniel" count=18}}</p> -</template> -``` - -**i18n/en.i18n.json** - -```json -{ - "inbox_status": "Hey, %s! You have received one new message today.", - "inbox_status_plural": "Hey, %s! You have received %s new messages today." -} -``` -See more examples below. - -### Transparent Namespacing - -You don't need to worry about domain prefixing or package conflicts when you translate your project or package. Behind the scenes we automatically generate scoped namespaces for you. - -### Ready to Scale - -* Translations are unified into a single JSON file per language that includes both package and project-level translations -* On-demand: translations are loaded only when they are needed -* 3rd Party CDN Support - - -## Quickstart - -**Step 1:** Install tap-i18n using meteor: - -```bash -$ meteor add tap:i18n -``` - -**Step 2:** Add translation helpers to your markup: - -**\*.html** - -```handlebars -<div>{{_ "hello"}}</div> -``` - -**Step 3:** Define translations in JSON or YAML format: - -**i18n/en.i18n.json** - -```json -{ "hello": "Hey there" } -``` - -**i18n/fr.i18n.json** - -```json -{ "hello": "Bonjour" } -``` - -**i18n/es.i18n.yml** - -```yaml -hello: Hola -``` - -Translations files should end with lang_tag.i18n.json/yml. - -You can split translations of a certain language to multiple files, we ignore -the prefixed text, e.g., we add the translations of menu.en.i18n.json in the -same way we add those of en.i18n.json . - -You can put languages files anywhere in your project tree, as long as they are -common to both your server and client - **do not put languages files under -/client, /server or /public**. - -Note: Languages files have to be saved in utf-8 encoding. - -**Step 4:** Initiate the client language on startup (optional) - -If you want the client to be served by a specific language on startup - -Assuming that you have a function getUserLanguage() that returns the language -for tag for the current user. - -```javascript -getUserLanguage = function () { - // Put here the logic for determining the user language - - return "fr"; -}; - -if (Meteor.isClient) { - Meteor.startup(function () { - Session.set("showLoadingIndicator", true); - - TAPi18n.setLanguage(getUserLanguage()) - .done(function () { - Session.set("showLoadingIndicator", false); - }) - .fail(function (error_message) { - // Handle the situation - console.log(error_message); - }); - }); -} -``` - -* If you won't set a language on startup your project will be served in the - fallback language: English -* You probably want to show a loading indicator until the language is ready (as - shown in the example), otherwise the templates in your projects will be in - English until the language will be ready - -## Documentation & Examples - -### TAPi18n API - -**TAPi18n.setLanguage(language\_tag) (Client)** - -Sets the client's translation language. - -Returns a jQuery deferred object that resolves if the language load -succeed and fails otherwise. - -**Notes:** - - * language\_tag has to be a supported Language. - * jQuery deferred docs: [jQuery Deferred](http://api.jquery.com/jQuery.Deferred/) - -**TAPi18n.getLanguage() (Client)** - -Returns the tag of the client's current language or null if -tap-i18n is not installed. - -If inside a reactive computation, invalidate the computation the next time the -client language get changed (by TAPi18n.setLanguage) - -**TAPi18n.getLanguages() (Anywhere)** - -Returns an object with all the supported languages and their names. - -A language is considred supported if it is in the supported_languages array of -the project-tap.i18n json. If supported_languages is null or not defined in -project-tap.i18n we consider all the languages we find *.i18n.json/yml files to as -supported. - -The returned object is in the following format: - -```javascript -{ - 'en': { - 'name':'English', // Local name - 'en':'English' // English name - }, - 'zh': { - 'name':'中文' // Local name - 'en':'Chinese' // English name - } - . - . - . -} -``` - -**TAPi18n.__(key, options, lang_tag=null) (Anywhere)** - -*If `lang_tag` is null:* - -Translates key to the current client's language. If inside a reactive -computation, invalidate the computation the next time the client language get -changed (by TAPi18n.setLanguage). - -*Otherwise:* - -Translates key to lang_tag. if you use `lang_tag` you should use `__` in a -reactive computation since the string will be translated to the current client -language if a translator to lang_tag is not ready in the client (if called for -the first time with that lang_tag, or until language data load from the server -finishes) and will get invalidated (trigger reactivity) when the translator to -that lang_tag is ready to be used to translate the key. - -Using `i18next.t` `lng` option or `lang`, which we made as alias to `lang` in -tap:i18n, is equivalent to setting the `lang_tag` attribute. - -The function is a proxy to the i18next.t() method. -Refer to the [documentation of i18next.t()](http://i18next.github.io/i18next/pages/doc_features.html) -to learn about its possible options. (Make sure you refer to i18next v1.11 documentation and not v2) - -**On the server**, TAPi18n.__ is not a reactive resource. You have to specify -the language tag you want to translate the key to. - -**TAPi18n.loadTranslations(translations, namespace="project") (Anywhere)** - -Use *translations* in addition or instead of the translations defined in the -i18n.json files. Translations defined by loadTranslations will have priority -over those defined in language files (i18n.json) of *namespace* (the project, -or package name). - -To enjoy [the benefits of tap:i18n](#key-features), you should use language -files to internationalize your project whenever you can. - -Legitimate cases for *loadTranslations* are: - -* Allowing users to change the project translations -* Changing translations of 3rd party packages that you don't want to fork (see - the Note below). - -Example: - -```javascript -TAPi18n.loadTranslations( - { - es: { - meteor_status_waiting: "Desconectado" - }, - fr: { - meteor_status_failed: "La connexion au serveur a échoué" - } - }, - "francocatena:status" -); -``` - -**Arguments:** - -* `translations`: An object of the following format: - -```javascript -{ - 'lang-tag': { - 'translation-key1': 'translation', - 'translation-key2': 'translation', - ... - }, - ... -} -``` - -* `namespace="project"`: The namespace you want to add the translations to. by - default translations are added to the project namespace, if you want to - change a package translation use the package name as the namespace like the - above example. - -**Notes:** - -* **Adding support to a new language in your app:** You can't use - *addTranslations* in order to add support to a new language, that is, to allow - users to change the interface language of the app to that language. In order - to start support a new language in your app, you'll have to either add a - language file to that language (*.i18n.json file) or add that languages to your - project-tap.i18n file. - -* **Translating a package that uses tap:i18n to another language**: If you want - to add a new language to a 3rd party package (and you can't get it's owner to - merge your pull request) consider introducing a "translation" package in which - package-tap.i18n has the "namespace" options set to the package you are - translating. That way you can translate with languages files instead of - *addTranslations* and share your translation package with others. - -### The tap-i18n Helpers - -### The \_ Helper - -To use tap-i18n to internationalize your templates you can use the \_ helper -that we set on the project's templates and on packages' templates for packages -that uses tap-i18n: - - {{_ "key" "sprintf_arg1" "sprintf_arg2" ... op1="option-value" op2="option-value" ... }} - -**You can customize the helper name, see "Configuring tap-i18n" section.** - -The translation files that will be used to translate key depends on the -template from which it is being used: -* If the helper is being used in a template that belongs to a package that uses - tap-i18n we'll always look for the translation in that package's translation - files. -* If the helper is being used in one of the project's templates we'll look for - the translation in the project's translation files (tap-i18n has to be - installed of course). - -**Usage Examples:** - -Assuming the client language is en. - -**Example 1:** Simple key: - - en.i18n.json: - ------------- - { - "click": "Click Here", - "html_key": "<b>BOLD</b>" - } - - page.html: - ---------- - <template name="x"> - {{_ "click"}} - {{{_ "html_key"}}} <!-- Note that we use triple {{{ for html rendering --> - </template> - - output: - ------- - Click Here - <b>BOLD</b> - -**Example 2:** Simple key specific language: - - en.i18n.json: - ------------- - { - "click": "Click Here" - } - - fr.i18n.json: - ------------- - { - "click": "Cliquez Ici" - } - - page.html (lng and lang options are the same in tap:i18n you can use both): - ---------- - <template name="x"> - {{_ "click" lang="fr"}} - </template> - - <template name="x"> - {{_ "click" lng="fr"}} - </template> - - output: - ------- - Cliquez Ici - -**Example 3:** Sprintf: - - en.i18n.json: - ------------- - { - "hello": "Hello %s, your last visit was on: %s" - } - - page.html: - ---------- - <template name="x"> - {{_ "hello" "Daniel" "2014-05-22"}} - </template> - - output: - ------- - Hello Daniel, your last visit was on: 2014-05-22 - -**Example 4:** Named variables and sprintf: - - en.i18n.json: - ------------- - { - "hello": "Hello __user_name__, your last visit was on: %s" - } - - page.html: - ---------- - <template name="x"> - {{_ "hello" "2014-05-22" user_name="Daniel"}} - </template> - - output: - ------- - Hello Daniel, your last visit was on: 2014-05-22 - -**Note:** Named variables have to be after all the sprintf parameters. - -**Example 5:** Named variables, sprintf, singular/plural: - - en.i18n.json: - ------------- - { - "inbox_status": "__username__, You have a new message (inbox last checked %s)", - "inbox_status_plural": "__username__, You have __count__ new messages (last checked %s)" - } - - page.html: - ---------- - <template name="x"> - {{_ "inbox_status" "2014-05-22" username="Daniel" count=1}} - {{_ "inbox_status" "2014-05-22" username="Chris" count=4}} - </template> - - output: - ------- - Daniel, You have a new message (inbox last checked 2014-05-22) - Chris, You have 4 new messages (last checked 2014-05-22) - -**Example 6:** Singular/plural, context: - - en.i18n.json: - ------------- - { - "actors_count": "There is one actor in the movie", - "actors_count_male": "There is one actor in the movie", - "actors_count_female": "There is one actress in the movie", - "actors_count_plural": "There are __count__ actors in the movie", - "actors_count_male_plural": "There are __count__ actors in the movie", - "actors_count_female_plural": "There are __count__ actresses in the movie", - } - - page.html: - ---------- - <template name="x"> - {{_ "actors_count" count=1 }} - {{_ "actors_count" count=1 context="male" }} - {{_ "actors_count" count=1 context="female" }} - {{_ "actors_count" count=2 }} - {{_ "actors_count" count=2 context="male" }} - {{_ "actors_count" count=2 context="female" }} - </template> - - output: - ------- - There is one actor in the movie - There is one actor in the movie - There is one actress in the movie - There are 2 actors in the movie - There are 2 actors in the movie - There are 2 actresses in the movie - -* Refer to the [documentation of i18next.t() v1.11](http://i18next.github.io/i18next/pages/doc_features.html) - to learn more about its possible options. (Make sure you refer to i18next v1.11 documentation and not v2) -* The translation will get updated automatically after calls to - TAPi18n.setLanguage(). - -### More helpers - -**{{languageTag}}:** - -The {{languageTag}} helper calls TAPi18n.getLanguage(). - -It's useful when you need to load assets depending on the current language, for -example: - -```handlebars -<template name="example"> - <img src="welcome_{{languageTag}}.png"> -</template> -``` - -### Languages Tags and Translations Prioritization - -We use the [IETF language tag system](http://en.wikipedia.org/wiki/IETF_language_tag) -for languages tagging. With it developers can refer to a certain language or -pick one of its dialects. - -Example: A developer can either refer to English in general using: "en" or to -use the Great Britain dialect with "en-GB". - -**If tap-i18n is install** we'll attempt to look for a translation of a certain -string in the following order: -* Language dialect, if specified ("pt-BR") -* Base language ("pt") -* Base English ("en") - -**Notes:** - -* We currently support only one dialect level. e.g. nan-Hant-TW is not - supported. -* "en-US" is the dialect we use for the base English translations "en". -* If tap-i18n is not installed, packages will be served in English, the fallback language. - -### Structure of Languages Files - -Languages files should be named: arbitrary.text.lang_tag.i18n.json . e.g., en.i18n.json, menu.pt-BR.i18n.json. - -You can have more than one file for the same language. - -You can put languages files anywhere in your project tree, as long as they are -common to both your server and client - **do not put languages files under -/client, /server or /public**. - -Example for languages files: - - en.i18n.json - { - "sky": "Sky", - "color": "Color" - } - - pt.i18n.json - { - "sky": "Céu", - "color": "Cor" - } - - fr.i18n.json - { - "sky": "Ciel" - } - - en-GB.i18n.json - { - "color": "Colour" - } - -* Do not use colons and periods (see note below) in translation keys. -* To avoid translation bugs all the keys in your package must be translated to - English ("en") which is the fallback language we use if tap-i18n is not installed, - or when we can't find a translation for a certain key. -* In the above example there is no need to translate "sky" in en-GB which is the - same in en. Remember that thanks to the Languages Tags and Translations - Prioritization (see above) if a translation for a certain key is the same for a - language and one of its dialects you don't need to translate it again in the - dialect file. -* The French file above have no translation for the color key above, it will - fallback to English. -* Check [i18next features documentation](http://i18next.github.io/i18next/pages/doc_features.html) for - more advanced translations structures you can use in your JSONs files (Such as - variables, plural form, etc.). (Make sure you refer to i18next v1.11 documentation and not v2) - -#### A note about dot notation - -Note that `{_ "foo.bar"}` will be looked under `{foo: {bar: "Hello World"}}`, and not under `"foo.bar"`. - -### Configuring tap-i18n - -To configure tap-i18n add to it a file named **project-tap.i18n**. - -This JSON can have the following properties. All of them are optional. The values bellow -are the defaults. - - project-root/project-tap.i18n - ----------------------------- - { - "helper_name": "_", - "supported_languages": null, - "i18n_files_route": "/tap-i18n", - "cdn_path": null, - "preloaded_langs": [] - } - -Options: - -**helper\_name:** the name for the templates' translation helper. - -**supported\_languages:** A list of languages tags you want to make available on -your project. If null, all the languages we'll find translation files for, in the -project, will be available. - -**build\_files\_path:** Can be an absolute path or relative to the project's root. If you change this value we assume you want to serve the files yourself (via cdn, or by other means) so we won't initiate the tap-i18n's built-in files server. Therefore if you set build\_files\_path you **must** set the browser\_path. - -**i18n\_files\_route:** The route in which the tap-i18n resources will be available in the project. - -**cdn\_path:** An alternative path from which you want tap-i18n resources to be loaded. Example: "http://cdn.example.com/tap-i18n". - -**preloaded_langs:** An array of languages tags. If isn't empty, a single synchronous ajax requrest will load the translation strings for all the languages tags listed. If you want to load all the supported languages set preloaded_langs to `["*"]` (`"*"` must be the first item of the array, the rest of the array will be ignored. `["zh-*"]` won't work). - -**Notes:** - -* We use AJAX to load the languages files so you'll have to set CORS on your CDN. - -### Disabling tap-i18n - -**Step 1:** Remove tap-i18n method calls from your project. - -**Step 2:** Remove tap-i18n package - -```bash -$ meteor remove tap:i18n -``` - -### Using tap-i18n in Cordova apps - -In order to use tap-i18n in a Cordova app you must set the `--server` flag -to your server's root url when building your project. - -```bash -$ meteor build --server="http://www.your-site-domain.com" -``` - -If your app should work when the user is offline, install the [tap:i18n-bundler](https://atmospherejs.com/tap/i18n-bundler) package and follow [its instructions](https://github.com/TAPevents/i18n-bundler#usage). - -## Developing Packages - -Though the decision to translate a package and to internationalize it is a -decision made by the **package** developer, the control over the -internationalization configurations are done by the **project** developer and -are global to all the packages within the project. - -Therefore if you wish to use tap-i18n to internationalize your Meteor -package your docs will have to refer projects developers that will use it to -the "Usage - Project Developers" section above to enable internationalization. -If the project developer won't enable tap-i18n your package will be served in -the fallback language English. - -### tap-i18n Two Work Modes - -tap-i18n can be used to internationalize projects and packages, but its -behavior is determined by whether or not it's installed on the project level. -We call these two work modes: *enabled* and *disabled*. - -When tap-i18n is disabled we don't unify the languages files that the packages -being used by the project uses, and serve all the packages in the fallback -language (English) - -### Setup tap-i18n - -In order to use tap-i18n to internationalize your package: - -**Step 1:** Add the package-tap.i18n configuration file: - -You can use empty file or an empty JSON object if you don't need to change them. - -The values below are the defaults. - - package_dir/package-tap.i18n - ---------------------------- - { - // The name for the translation function that - // will be available in package's namespace. - "translation_function_name": "__", - - // the name for the package templates' translation helper - "helper_name": "_", - - // directory for the translation files (without leading slash) - "languages_files_dir": "i18n", - - // tap:i18n automatically separates the translation strings of each package to a - // namespace dedicated to that package, which is used by the package's translation - // function and helper. Use the namespace option to set a custom namespace for - // the package. By using the name of another package you can use your package to - // add to that package or modify its translations. You can also set the namespace to - // "project" to add translations that will be available in the project level. - "namespace": null - } - -**Step 2:** Create your languages\_files\_dir: - -Example for the default languages\_files\_dir path and its structure: - - . - |--package_name - |----package.js - |----package-tap.i18n - |----i18n # Should be the same path as languages_files_dir option above - |------en.i18n.json - |------fr.i18n.json - |------pt.i18n.json - |------pt-BR.i18n.json - . - . - . - -NOTE: the file for the fallback language (`en.i18n.json`) **must** exist (it may be empty though). - -The leanest set up (for instance in a private package, where you keep the translations at the project level) is two empty files: `package-tap.i18n` and `i18n/en.i18n.json`. - -**Step 3:** Setup your package.js: - -Your package's package.js should be structured as follow: - - Package.on_use(function (api) { - api.use(["tap:i18n@1.0.7"], ["client", "server"]); - - . - . - . - - // You must load your package's package-tap.i18n before you load any - // template - api.add_files("package-tap.i18n", ["client", "server"]); - - // Templates loads (if any) - - // List your languages files so Meteor will watch them and rebuild your - // package as they change. - // You must load the languages files after you load your templates - - // otherwise the templates won't have the i18n capabilities (unless - // you'll register them with tap-i18n yourself, see below). - api.add_files([ - "i18n/en.i18n.json", - "i18n/fr.i18n.json", - "i18n/pt.i18n.json", - "i18n/pt-br.i18n.json" - ], ["client", "server"]); - }); - -Note: en, which is the fallback language, is the only language we integrate -into the clients bundle. All the other languages files will be loaded only -to the server bundle and will be served as part of the unified languages files, -that contain all the project's translations. - -### Package Level tap-i18n Functions - -The following functions are added to your package namespace by tap-i18n: - -**\_\_("key", options, lang_tag) (Anywhere)** - -Read documenation for `TAPi18n.__` above. - -**On the server**, TAPi18n.__ is not a reactive resource. You have to specify -the language tag you want to translate the key to. - -You can use package-tap.i18n to change the name of this function. - -**registerI18nHelper(template\_name) (Client)** - -**registerTemplate(template\_name) (Client) [obsolete alias, will be removed in future versions]** - -Register the \_ helper that maps to the \_\_ function for the -template with the given name. - -**Important:** As long as you load the package templates after you add package-tap.i18n -and before you start adding the languages files you won't need to register templates yourself. - -### Using tap-i18n in Your Package Templates - -See "The tap-i18n helper" section above. - -## Unit Testing - -See /unittest/test-packages/README.md . - -## License - -MIT - -## Author - -[Daniel Chcouri](http://theosp.github.io/) - -## Contributors - -* [Chris Hitchcott](https://github.com/hitchcott/) -* [Kevin Iamburg](http://www.slickdevelopment.com) -* [Abe Pazos](https://github.com/hamoid/) -* [@karfield](https://github.com/karfield/) -* [@nscarcella](https://github.com/nscarcella/) -* [@mpowaga](https://github.com/mpowaga/) - -## Credits - -* [i18next v1.11](http://i18next.github.io/i18next/) -* [simple-schema](https://github.com/aldeed/meteor-simple-schema) -* [http-methods](https://github.com/CollectionFS/Meteor-http-methods) diff --git a/packages/wekan-tap-i18n/TODO b/packages/wekan-tap-i18n/TODO deleted file mode 100644 index edc654412..000000000 --- a/packages/wekan-tap-i18n/TODO +++ /dev/null @@ -1,3 +0,0 @@ -TODO: - -* Add memcache layer to the integral file server diff --git a/packages/wekan-tap-i18n/lib/globals.js b/packages/wekan-tap-i18n/lib/globals.js deleted file mode 100644 index bc36ed4ca..000000000 --- a/packages/wekan-tap-i18n/lib/globals.js +++ /dev/null @@ -1,10 +0,0 @@ -// The globals object will be accessible to the build plugin, the server and -// the client - -globals = { - fallback_language: "en", - langauges_tags_regex: "([a-z]{2})(-[A-Z]{2})?", - project_translations_domain: "project", - browser_path: "/tap-i18n", - debug: false -}; diff --git a/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee b/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee deleted file mode 100644 index e3677703f..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compiler_configuration.coffee +++ /dev/null @@ -1,23 +0,0 @@ -# Note: same compiler can be used to compile more then one package (at least in v0.9.x) - -share.compiler_configuration = - fallback_language: globals.fallback_language - packages: [] # Each time we compile package-tap.i18n we push "package_name:arch" to this array - templates_registered_for: [] # Each time we register a template we push "package_name:arch" to this array - default_project_conf_inserted_for: [] # Keeps track of the archs we've inserted the default project conf for. - # Default project conf is inserted by the *.i18.json compiler to be used - # in case the project has no project-tap.i18n - project_tap_i18n_loaded_for: [] # Keeps track of the archs we've loaded project_tap_i18n for - - tap_i18n_input_files: [] - registerInputFile: (compileStep) -> - input_file = "#{compileStep.arch}:#{compileStep._fullInputPath}" - if input_file in @tap_i18n_input_files - # A new build cycle - @packages = [] - @templates_registered_for = [] - @default_project_conf_inserted_for = [] - @project_tap_i18n_loaded_for = [] - @tap_i18n_input_files = [] - - @tap_i18n_input_files.push(input_file) diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee deleted file mode 100644 index 37d6f3027..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.coffee +++ /dev/null @@ -1,18 +0,0 @@ -path = Npm.require "path" - -compilers = share.compilers - -Plugin.registerSourceHandler "i18n", (compileStep) -> - # Starting from Meteor v1.2 registerSourceHandler doesn't - # accept filenames as handlers. - # See: https://github.com/meteor/meteor/issues/3985 - # and: https://github.com/TAPevents/tap-i18n/issues/113 - # Below is a workaround until we refactor for v1.2 new - # build plugin API. - file_name = _.last compileStep.inputPath.split(path.sep) - - if file_name == "package-tap.i18n" - compilers.package_tap_i18n(compileStep) - - if file_name == "project-tap.i18n" - compilers.project_tap_i18n(compileStep) diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee deleted file mode 100644 index 86199b861..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.generic_compiler.coffee +++ /dev/null @@ -1,124 +0,0 @@ -path = Npm.require "path" - -helpers = share.helpers -compilers = share.compilers -compiler_configuration = share.compiler_configuration - -compilers.generic_compiler = (extension, helper) -> (compileStep) -> - compiler_configuration.registerInputFile(compileStep) - input_path = compileStep._fullInputPath - - language = path.basename(input_path).split(".").slice(0, -2).pop() - if _.isUndefined(language) or _.isEmpty(language) - compileStep.error - message: "Language-tag is not specified for *.i18n.`#{extension}' file: `#{input_path}'", - sourcePath: input_path - return - - if not RegExp("^#{globals.langauges_tags_regex}$").test(language) - compileStep.error - message: "Can't recognise '#{language}' as a language-tag: `#{input_path}'", - sourcePath: input_path - return - - translations = helper input_path, compileStep - - package_name = if helpers.isPackage(compileStep) then compileStep.packageName else globals.project_translations_domain - output = - """ - var _ = Package.underscore._, - package_name = "#{package_name}", - namespace = "#{package_name}"; - - if (package_name != "#{globals.project_translations_domain}") { - namespace = TAPi18n.packages[package_name].namespace; - } - - """ - - # only for project - if not helpers.isPackage(compileStep) - if /^(client|server)/.test(compileStep.inputPath) - compileStep.error - message: "Languages files should be common to the server and the client. Do not put them under /client or /server .", - sourcePath: input_path - return - - # add the language names to TAPi18n.languages_names - language_name = [language, language] - if language_names[language]? - language_name = language_names[language] - - if language != globals.fallback_language - # the name for the fallback_language is part of the getProjectConfJs()'s output - output += - """ - TAPi18n.languages_names["#{language}"] = #{JSON.stringify language_name}; - - """ - - # If this is a project but project-tap.i18n haven't compiled yet add default project conf - # for case there is no project-tap.i18n defined in this project. - # Reminder: we don't require projects to have project-tap.i18n - if not(helpers.isDefaultProjectConfInserted(compileStep)) and \ - not(helpers.isProjectI18nLoaded(compileStep)) - output += share.getProjectConfJs(share.project_i18n_schema.clean {}) # defined in project-tap.i18n.coffee - - helpers.markDefaultProjectConfInserted(compileStep) - - - # if fallback_language -> integrate, otherwise add to TAPi18n.translations if server arch. - if language == compiler_configuration.fallback_language - output += - """ - // integrate the fallback language translations - translations = {}; - translations[namespace] = #{JSON.stringify translations}; - TAPi18n._loadLangFileObject("#{compiler_configuration.fallback_language}", translations); - - """ - - if compileStep.archMatches "os" - if language != compiler_configuration.fallback_language - output += - """ - if(_.isUndefined(TAPi18n.translations["#{language}"])) { - TAPi18n.translations["#{language}"] = {}; - } - - if(_.isUndefined(TAPi18n.translations["#{language}"][namespace])) { - TAPi18n.translations["#{language}"][namespace] = {}; - } - - _.extend(TAPi18n.translations["#{language}"][namespace], #{JSON.stringify translations}); - - """ - - output += - """ - TAPi18n._registerServerTranslator("#{language}", namespace); - - """ - - # register i18n helper for templates, only once per web arch, only for packages - if helpers.isPackage(compileStep) - if compileStep.archMatches("web") and helpers.getCompileStepArchAndPackage(compileStep) not in compiler_configuration.templates_registered_for - output += - """ - var package_templates = _.difference(_.keys(Template), non_package_templates); - - for (var i = 0; i < package_templates.length; i++) { - var package_template = package_templates[i]; - - registerI18nTemplate(package_template); - } - - """ - compiler_configuration.templates_registered_for.push helpers.getCompileStepArchAndPackage(compileStep) - - output_path = compileStep.rootOutputPath + compileStep.inputPath.replace new RegExp("`#{extension}'$"), "js" - compileStep.addJavaScript - path: output_path, - sourcePath: input_path, - data: output, - bare: false \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee deleted file mode 100644 index fe65e24a0..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.json.coffee +++ /dev/null @@ -1,4 +0,0 @@ -helpers = share.helpers -compilers = share.compilers -compilers.i18n_json = compilers.generic_compiler('json', helpers.loadJSON) -Plugin.registerSourceHandler "i18n.json", compilers.i18n_json \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee deleted file mode 100644 index ec7e7f793..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/i18n.yml.coffee +++ /dev/null @@ -1,4 +0,0 @@ -helpers = share.helpers -compilers = share.compilers -compilers.i18n_yml = compilers.generic_compiler('yml', helpers.loadYAML) -Plugin.registerSourceHandler "i18n.yml", compilers.i18n_yml \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee deleted file mode 100644 index 45db1a679..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/package-tap.i18n.coffee +++ /dev/null @@ -1,95 +0,0 @@ -helpers = share.helpers -compilers = share.compilers -compiler_configuration = share.compiler_configuration - -schema = new SimpleSchema - translation_function_name: - type: String - defaultValue: "__" - label: "Translation Function Name" - optional: true - helper_name: - type: String - defaultValue: "_" - label: "Helper Name" - optional: true - namespace: - type: String - defaultValue: null - label: "Translations Namespace" - optional: true - -compilers.package_tap_i18n = (compileStep) -> - compiler_configuration.registerInputFile(compileStep) - input_path = compileStep._fullInputPath - - if helpers.isPackage(compileStep) - compileStep.error - message: "More than one package-tap.i18n found for package: #{compileStep.packageName}", - sourcePath: input_path - return - - if helpers.isProjectI18nLoaded(compileStep) - compileStep.error - message: "Can't compile package-tap.i18n if project-tap.i18n is present", - sourcePath: input_path - return - - if helpers.isDefaultProjectConfInserted(compileStep) - compileStep.error - message: "package-tap.i18n should be loaded before languages files (*.i18n.json)", - sourcePath: input_path - return - - helpers.markAsPackage(compileStep) - - package_tap_i18n = helpers.loadJSON input_path, compileStep - - if not package_tap_i18n? - package_tap_i18n = schema.clean {} - schema.clean package_tap_i18n - - try - check package_tap_i18n, schema - catch error - compileStep.error - message: "File `#{file_path}' is an invalid package-tap.i18n file (#{error})", - sourcePath: input_path - return - - package_name = compileStep.packageName - - if not package_tap_i18n.namespace? - package_tap_i18n.namespace = package_name - - namespace = package_tap_i18n.namespace - - package_i18n_js_file = - """ - TAPi18n.packages["#{package_name}"] = #{JSON.stringify(package_tap_i18n)}; - - // define package's translation function (proxy to the i18next) - #{package_tap_i18n.translation_function_name} = TAPi18n._getPackageI18nextProxy("#{namespace}"); - - """ - - if compileStep.archMatches "web" - package_i18n_js_file += - """ - // define the package's templates registrar - registerI18nTemplate = TAPi18n._getRegisterHelpersProxy("#{package_name}"); - registerTemplate = registerI18nTemplate; // XXX OBSOLETE, kept for backward compatibility will be removed in the future - - // Record the list of templates prior to package load - var _ = Package.underscore._; - non_package_templates = _.keys(Template); - - """ - - compileStep.addJavaScript - path: "package-i18n.js", - sourcePath: input_path, - data: package_i18n_js_file, - bare: false - -Plugin.registerSourceHandler "package-tap.i18n", compilers.package_tap_i18n \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee deleted file mode 100644 index 0187d7161..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/project-tap.i18n.coffee +++ /dev/null @@ -1,122 +0,0 @@ -helpers = share.helpers -compilers = share.compilers -compiler_configuration = share.compiler_configuration - -share.project_i18n_schema = schema = new SimpleSchema - helper_name: - type: String - defaultValue: "_" - label: "Helper Name" - optional: true - supported_languages: - type: [String] - label: "Supported Languages" - defaultValue: null - optional: true - i18n_files_route: - type: String - label: "Unified languages files path" - defaultValue: globals.browser_path - optional: true - preloaded_langs: - type: [String] - label: "Preload languages" - defaultValue: [] - optional: true - cdn_path: - type: String - label: "Unified languages files path on CDN" - defaultValue: null - optional: true - -getProjectConfJs = share.getProjectConfJs = (conf) -> - fallback_language_name = language_names[globals.fallback_language] - - project_conf_js = """ - TAPi18n._enable(#{JSON.stringify(conf)}); - TAPi18n.languages_names["#{globals.fallback_language}"] = #{JSON.stringify fallback_language_name}; - - """ - - # If we get a list of supported languages we must make sure that we'll have a - # language name for each one of its languages. - # - # Though languages names are added for every language we find i18n.json file - # for (by the i18n.json compiler). We shouldn't rely on the existence of - # *.i18n.json file for each supported language, because a language might be - # defined as supported even when it has no i18n.json files (it's especially - # true when tap:i18n is used with tap:i18n-db) - if conf.supported_languages? - for lang_tag in conf.supported_languages - if language_names[lang_tag]? - project_conf_js += """ - TAPi18n.languages_names["#{lang_tag}"] = #{JSON.stringify language_names[lang_tag]}; - - """ - - return project_conf_js - -compilers.project_tap_i18n = (compileStep) -> - compiler_configuration.registerInputFile(compileStep) - input_path = compileStep._fullInputPath - - if helpers.isPackage(compileStep) - compileStep.error - message: "Can't load project-tap.i18n in a package: #{compileStep.packageName}", - sourcePath: input_path - return - - if helpers.isProjectI18nLoaded(compileStep) - compileStep.error - message: "Can't have more than one project-tap.i18n", - sourcePath: input_path - return - - project_tap_i18n = helpers.loadJSON input_path, compileStep - - if not project_tap_i18n? - project_tap_i18n = schema.clean {} - schema.clean project_tap_i18n - - try - check project_tap_i18n, schema - catch error - compileStep.error - message: "File `#{file_path}' is an invalid project-tap.i18n file (#{error})", - sourcePath: input_path - return - - project_i18n_js_file = getProjectConfJs project_tap_i18n - - if compileStep.archMatches("web") and not _.isEmpty project_tap_i18n.preloaded_langs - preloaded_langs = "all" - if project_tap_i18n.preloaded_langs[0] != "*" - preloaded_langs = project_tap_i18n.preloaded_langs.join(",") - - project_i18n_js_file += - """ - $.ajax({ - type: 'GET', - url: "#{project_tap_i18n.i18n_files_route}/multi/#{preloaded_langs}.json", - dataType: 'json', - success: function(data) { - for (lang_tag in data) { - TAPi18n._loadLangFileObject(lang_tag, data[lang_tag]); - TAPi18n._loaded_languages.push(lang_tag); - } - }, - data: {}, - async: false - }); - - """ - - helpers.markProjectI18nLoaded(compileStep) - - compileStep.addJavaScript - path: "project-i18n.js", - sourcePath: input_path, - data: project_i18n_js_file, - bare: false - -Plugin.registerSourceHandler "project-tap.i18n", compilers.project_tap_i18n \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee b/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee deleted file mode 100644 index 6216e2839..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/compilers/share.coffee +++ /dev/null @@ -1 +0,0 @@ -share.compilers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js b/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js deleted file mode 100644 index 43d72f450..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/etc/language_names.js +++ /dev/null @@ -1,136 +0,0 @@ -language_names = { - "af": ["Afrikaans","Afrikaans"], - "ak": ["Akan","Akan"], - "sq": ["Albanian","Shqip"], - "am": ["Amharic","አማርኛ"], - "ar": ["Arabic","العربية"], - "hy": ["Armenian","Հայերեն"], - "rup": ["Aromanian","Armãneashce"], - "as": ["Assamese","অসমীয়া"], - "az": ["Azerbaijani","Azərbaycan dili"], - "az-TR": ["Azerbaijani (Turkey)","Azərbaycan Türkcəsi"], - "ba": ["Bashkir","башҡорт теле"], - "eu": ["Basque","Euskara"], - "bel": ["Belarusian","Беларуская мова"], - "bn": ["Bengali","বাংলা"], - "bs": ["Bosnian","Bosanski"], - "bg": ["Bulgarian","Български"], - "mya": ["Burmese","ဗမာစာ"], - "ca": ["Catalan","Català"], - "bal": ["Catalan (Balear)","Català (Balear)"], - "zh": ["Chinese","中文"], - "zh-CN": ["Chinese (China)","简体中文"], - "zh-HK": ["Chinese (Hong Kong)","繁體中文(香港)"], - "zh-TW": ["Chinese (Taiwan)","繁體中文(台灣)"], - "co": ["Corsican","corsu"], - "hr": ["Croatian","Hrvatski"], - "cs": ["Czech","čeština‎"], - "da": ["Danish","Dansk"], - "nl": ["Dutch","Nederlands"], - "nl-BE": ["Dutch (Belgium)","Nederlands (België)"], - "en": ["English","English"], - "en-AU": ["English (Australia)","English (Australia)"], - "en-CA": ["English (Canada)","English (Canada)"], - "en-GB": ["English (UK)","English (UK)"], - "eo": ["Esperanto","Esperanto"], - "et": ["Estonian","Eesti"], - "fo": ["Faroese","føroyskt"], - "fi": ["Finnish","Suomi"], - "fr-BE": ["French (Belgium)","Français de Belgique"], - "fr": ["French (France)","Français"], - "fy": ["Frisian","Frysk"], - "fuc": ["Fulah","Pulaar"], - "gl": ["Galician","Galego"], - "ka": ["Georgian","ქართული"], - "de": ["German","Deutsch"], - "el": ["Greek","Ελληνικά"], - "gn": ["Guaraní","Avañe'ẽ"], - "haw": ["Hawaiian","Ōlelo Hawaiʻi"], - "haz": ["Hazaragi","هزاره گی"], - "he": ["Hebrew","עברית"], - "hi": ["Hindi","हिन्दी"], - "hu": ["Hungarian","Magyar"], - "is": ["Icelandic","Íslenska"], - "id": ["Indonesian","Bahasa Indonesia"], - "ga": ["Irish","Gaelige"], - "it": ["Italian","Italiano"], - "ja": ["Japanese","日本語"], - "jv": ["Javanese","Basa Jawa"], - "kn": ["Kannada","ಕನ್ನಡ"], - "kk": ["Kazakh","Қазақ тілі"], - "km": ["Khmer","ភាសាខ្មែរ"], - "rw": ["Kinyarwanda","Kinyarwanda"], - "ky": ["Kirghiz","кыргыз тили"], - "ko": ["Korean","한국어"], - "ckb": ["Kurdish (Sorani)","كوردی‎"], - "lo": ["Lao","ພາສາລາວ"], - "lv": ["Latvian","latviešu valoda"], - "li": ["Limburgish","Limburgs"], - "lt": ["Lithuanian","Lietuvių kalba"], - "lb": ["Luxembourgish","Lëtzebuergesch"], - "mk": ["Macedonian","македонски јазик"], - "mg": ["Malagasy","Malagasy"], - "ms": ["Malay","Bahasa Melayu"], - "ml": ["Malayalam","മലയാളം"], - "mr": ["Marathi","मराठी"], - "xmf": ["Mingrelian","მარგალური ნინა"], - "mn": ["Mongolian","Монгол"], - "me": ["Montenegrin","Crnogorski jezik"], - "ne": ["Nepali","नेपाली"], - "nb": ["Norwegian (Bokmål)","Norsk bokmål"], - "nn": ["Norwegian (Nynorsk)","Norsk nynorsk"], - "os": ["Ossetic","Ирон"], - "ps": ["Pashto","پښتو"], - "fa": ["Persian","فارسی"], - "fa-AF": ["Persian (Afghanistan)","فارسی (افغانستان"], - "pl": ["Polish","Polski"], - "pt-BR": ["Portuguese (Brazil)","Português do Brasil"], - "pt": ["Portuguese (Portugal)","Português"], - "pa": ["Punjabi","ਪੰਜਾਬੀ"], - "rhg": ["Rohingya","Rohingya"], - "ro": ["Romanian","Română"], - "ru": ["Russian","Русский"], - "rue": ["Rusyn","Русиньскый"], - "sah": ["Sakha","Sakha"], - "sa-IN": ["Sanskrit","भारतम्"], - "srd": ["Sardinian","sardu"], - "gd": ["Scottish Gaelic","Gàidhlig"], - "sr": ["Serbian","Српски језик"], - "sd": ["Sindhi","سندھ"], - "si": ["Sinhala","සිංහල"], - "sk": ["Slovak","Slovenčina"], - "sl": ["Slovenian","slovenščina"], - "so": ["Somali","Afsoomaali"], - "azb": ["South Azerbaijani","گؤنئی آذربایجان"], - "es-AR": ["Spanish (Argentina)","Español de Argentina"], - "es-CL": ["Spanish (Chile)","Español de Chile"], - "es-CO": ["Spanish (Colombia)","Español de Colombia"], - "es-MX": ["Spanish (Mexico)","Español de México"], - "es-PE": ["Spanish (Peru)","Español de Perú"], - "es-PR": ["Spanish (Puerto Rico)","Español de Puerto Rico"], - "es": ["Spanish (Spain)","Español"], - "es-VE": ["Spanish (Venezuela)","Español de Venezuela"], - "su": ["Sundanese","Basa Sunda"], - "sw": ["Swahili","Kiswahili"], - "sv": ["Swedish","Svenska"], - "gsw": ["Swiss German","Schwyzerdütsch"], - "tl": ["Tagalog","Tagalog"], - "tg": ["Tajik","тоҷикӣ"], - "ta": ["Tamil","தமிழ்"], - "ta-LK": ["Tamil (Sri Lanka)","தமிழ்"], - "tt": ["Tatar","Татар теле"], - "te": ["Telugu","తెలుగు"], - "th": ["Thai","ไทย"], - "bo": ["Tibetan","བོད་སྐད"], - "tir": ["Tigrinya","ትግርኛ"], - "tr": ["Turkish","Türkçe"], - "tuk": ["Turkmen","Türkmençe"], - "ua": ["Ukrainian","Українська"], - "ug": ["Uighur","Uyƣurqə"], - "uk": ["Ukrainian","Українська"], - "ur": ["Urdu","اردو"], - "uz": ["Uzbek","O‘zbekcha"], - "vi": ["Vietnamese","Tiếng Việt"], - "wa": ["Walloon","Walon"], - "cy": ["Welsh","Cymraeg"] -}; diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee deleted file mode 100644 index 0ab5a6f58..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/helpers/compile_step_helpers.coffee +++ /dev/null @@ -1,23 +0,0 @@ -compiler_configuration = share.compiler_configuration - -_.extend share.helpers, - getCompileStepArchAndPackage: (compileStep) -> - "#{compileStep.packageName}:#{compileStep.arch}" - - markAsPackage: (compileStep) -> - compiler_configuration.packages.push @.getCompileStepArchAndPackage(compileStep) - - isPackage: (compileStep) -> - @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.packages - - markProjectI18nLoaded: (compileStep) -> - compiler_configuration.project_tap_i18n_loaded_for.push @.getCompileStepArchAndPackage(compileStep) - - isProjectI18nLoaded: (compileStep) -> - @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.project_tap_i18n_loaded_for - - markDefaultProjectConfInserted: (compileStep) -> - compiler_configuration.default_project_conf_inserted_for.push @.getCompileStepArchAndPackage(compileStep) - - isDefaultProjectConfInserted: (compileStep) -> - @.getCompileStepArchAndPackage(compileStep) in compiler_configuration.default_project_conf_inserted_for diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee deleted file mode 100644 index 74aff3ad7..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/helpers/helpers.coffee +++ /dev/null @@ -1 +0,0 @@ -share.helpers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee deleted file mode 100644 index 6ead9c015..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/helpers/load_json.coffee +++ /dev/null @@ -1,25 +0,0 @@ -fs = Npm.require 'fs' -JSON.minify = JSON.minify || Npm.require("node-json-minify") - -# loads a json from file_path -# -# returns undefined if file doesn't exist null if file is empty, parsed content otherwise -_.extend share.helpers, - loadJSON: (file_path, compileStep=null) -> - try # use try/catch to avoid the additional syscall to fs.existsSync - fstats = fs.statSync file_path - catch - return undefined - - if fstats.size == 0 - return null - - try - content = JSON.parse(JSON.minify(fs.readFileSync(file_path, "utf8"))) - catch error - if compileStep? - compileStep.error - message: "Can't load `#{file_path}' JSON", - sourcePath: compileStep._fullInputPath - - throw new Error "Can't load `#{file_path}' JSON" diff --git a/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee b/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee deleted file mode 100644 index 77f898c33..000000000 --- a/packages/wekan-tap-i18n/lib/plugin/helpers/load_yml.coffee +++ /dev/null @@ -1,25 +0,0 @@ -fs = Npm.require 'fs' -YAML = Npm.require 'yamljs' - -# loads a yml from file_path -# -# returns undefined if file doesn't exist null if file is empty, parsed content otherwise -_.extend share.helpers, - loadYAML: (file_path, compileStep=null) -> - try # use try/catch to avoid the additional syscall to fs.existsSync - fstats = fs.statSync file_path - catch - return undefined - - if fstats.size == 0 - return null - - try - content = YAML.load(file_path) - catch error - if compileStep? - compileStep.error - message: "Can't load `#{file_path}' YAML", - sourcePath: compileStep._fullInputPath - - throw new Error "Can't load `#{file_path}' YAML" diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee deleted file mode 100644 index 5437cb885..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-client.coffee +++ /dev/null @@ -1,198 +0,0 @@ -_.extend TAPi18n.prototype, - _languageSpecificTranslators: null - _languageSpecificTranslatorsTrackers: null - - _getLanguageFilePath: (lang_tag) -> - if not @_enabled() - return null - - path = if @.conf.cdn_path? then @.conf.cdn_path else @.conf.i18n_files_route - path = path.replace /\/$/, "" - if Meteor.isCordova and path[0] == "/" - path = Meteor.absoluteUrl().replace(/\/+$/, "") + path - - "#{path}/#{lang_tag}.json" - - _loadLanguage: (languageTag) -> - # Load languageTag and its dependencies languages to TAPi18next if we - # haven't loaded them already. - # - # languageTag dependencies languages are: - # * The base language if languageTag is a dialect. - # * The fallback language (en) if we haven't loaded it already. - # - # Returns a deferred object that resolves with no arguments if all files - # loaded successfully to TAPi18next and rejects with array of error - # messages otherwise - # - # Example: - # TAPi18n._loadLanguage("pt-BR") - # .done(function () { - # console.log("languageLoaded successfully"); - # }) - # .fail(function (messages) { - # console.log("Couldn't load languageTag", messages); - # }) - # - # The above example will attempt to load pt-BR, pt and en - - dfd = new $.Deferred() - - if not @_enabled() - return dfd.reject "tap-i18n is not enabled in the project level, check tap-i18n README" - - project_languages = @_getProjectLanguages() - - if languageTag in project_languages - if languageTag not in @_loaded_languages - loadLanguageTag = => - jqXHR = $.getJSON(@_getLanguageFilePath(languageTag)) - - jqXHR.done (data) => - @_loadLangFileObject(languageTag, data) - - @_loaded_languages.push languageTag - - dfd.resolve() - - jqXHR.fail (xhr, error_code) => - dfd.reject("Couldn't load language '#{languageTag}' JSON: #{error_code}") - - directDependencyLanguageTag = if "-" in languageTag then languageTag.replace(/-.*/, "") else fallback_language - - # load dependency language if it is part of the project and not the fallback language - if languageTag != fallback_language and directDependencyLanguageTag in project_languages - dependencyLoadDfd = @_loadLanguage directDependencyLanguageTag - - dependencyLoadDfd.done => - # All dependencies loaded successfully - loadLanguageTag() - - dependencyLoadDfd.fail (message) => - dfd.reject("Loading process failed since dependency language - '#{directDependencyLanguageTag}' failed to load: " + message) - else - loadLanguageTag() - else - # languageTag loaded already - dfd.resolve() - else - dfd.reject(["Language #{languageTag} is not supported"]) - - return dfd.promise() - - _registerHelpers: (package_name, template) -> - if package_name != globals.project_translations_domain - tapI18nextProxy = @_getPackageI18nextProxy(@packages[package_name].namespace) - else - tapI18nextProxy = @_getPackageI18nextProxy(globals.project_translations_domain) - - underscore_helper = (key, args...) -> - options = (args.pop()).hash - if not _.isEmpty(args) - options.sprintf = args - - tapI18nextProxy(key, options) - - # template specific helpers - if package_name != globals.project_translations_domain - # {{_ }} - if Template[template]? and Template[template].helpers? - helpers = {} - helpers[@packages[package_name].helper_name] = underscore_helper - Template[template].helpers(helpers) - - # global helpers - else - # {{_ }} - UI.registerHelper @conf.helper_name, underscore_helper - - # {{languageTag}} - UI.registerHelper "languageTag", () => @getLanguage() - - return - - _getRegisterHelpersProxy: (package_name) -> - # A proxy to _registerHelpers where the package_name is fixed to package_name - (template) => - @_registerHelpers(package_name, template) - - _prepareLanguageSpecificTranslator: (lang_tag) -> - dfd = (new $.Deferred()).resolve().promise() - - if lang_tag of @_languageSpecificTranslatorsTrackers - return dfd - - @_languageSpecificTranslatorsTrackers[lang_tag] = new Tracker.Dependency - - if not(lang_tag of @_languageSpecificTranslators) - dfd = @_loadLanguage(lang_tag) - .done => - @_languageSpecificTranslators[lang_tag] = @_getSpecificLangTranslator(lang_tag) - - @_languageSpecificTranslatorsTrackers[lang_tag].changed() - - return dfd - - _getPackageI18nextProxy: (package_name) -> - # A proxy to TAPi18next.t where the namespace is preset to the package's - - (key, options, lang_tag=null) => - # Devs get confused and use lang option instead of lng option, make lang - # alias of lng - if options?.lang? and not options?.lng? - options.lng = options.lang - - if options?.lng? and not lang_tag? - lang_tag = options.lng - # Remove options.lng so we won't pass it to the regular TAPi18next - # before the language specific translator is ready to keep behavior - # consistent. - # - # If lang is actually ready before the language specifc translator is - # ready, TAPi18next will translate to lang_tag if we won't remove - # options.lng. - delete options.lng - - if lang_tag? - @_prepareLanguageSpecificTranslator(lang_tag) - - @_languageSpecificTranslatorsTrackers[lang_tag].depend() - - if lang_tag of @_languageSpecificTranslators - return @_languageSpecificTranslators[lang_tag] "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options - else - return TAPi18next.t "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options - - # If inside a reactive computation, we want to invalidate the computation if the client lang changes - @_language_changed_tracker.depend() - - - TAPi18next.t "#{TAPi18n._getPackageDomain(package_name)}:#{key}", options - - _onceEnabled: () -> - @_registerHelpers globals.project_translations_domain - - _abortPreviousSetLang: null - setLanguage: (lang_tag) -> - self = @ - - @_abortPreviousSetLang?() - - isAborted = false - @_abortPreviousSetLang = -> isAborted = true - - @_loadLanguage(lang_tag).then => - if not isAborted - TAPi18next.setLng(lang_tag) - - @_language_changed_tracker.changed() - Session.set @_loaded_lang_session_key, lang_tag - - getLanguage: -> - if not @._enabled() - return null - - session_lang = Session.get @_loaded_lang_session_key - - if session_lang? then session_lang else @._fallback_language diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee deleted file mode 100644 index 23bc6e59f..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-common.coffee +++ /dev/null @@ -1,143 +0,0 @@ -fallback_language = globals.fallback_language - -TAPi18n = -> - EventEmitter.call @ - - @_fallback_language = fallback_language - - @_language_changed_tracker = new Tracker.Dependency - - @_loaded_languages = [fallback_language] # stores the loaded languages, the fallback language is loaded automatically - - @conf = null # If conf isn't null we assume that tap:i18n is enabled for the project. - # We assume conf is valid, we sterilize and validate it during the build process. - - @packages = {} # Stores the packages' package-tap.i18n jsons - - @languages_names = {} # Stores languages that we've found languages files for in the project dir. - # format: - # { - # lang_tag: [lang_name_in_english, lang_name_in_local_language] - # } - - @translations = {} # Stores the packages/project translations - Server side only - # fallback_language translations are not stored here - - - if Meteor.isClient - Session.set @_loaded_lang_session_key, null - - @_languageSpecificTranslators = {} - @_languageSpecificTranslatorsTrackers = {} - - if Meteor.isServer - @server_translators = {} - - Meteor.startup => - # If tap-i18n is enabled for that project - if @_enabled() - @_registerHTTPMethod() - - @__ = @_getPackageI18nextProxy(globals.project_translations_domain) - - TAPi18next.setLng fallback_language - - return @ - -Util.inherits TAPi18n, EventEmitter - -_.extend TAPi18n.prototype, - _loaded_lang_session_key: "TAPi18n::loaded_lang" - - _enable: (conf) -> - # tap:i18n gets enabled for a project once a conf file is set for it. - # It can be either a conf object that was set by project-tap.i18n file or - # a default conf, which is being added if the project has lang files - # (*.i18n.json) but not project-tap.i18n - @conf = conf - - @._onceEnabled() - - _onceEnabled: () -> - # The arch specific code can use this for procedures that should be performed once - # tap:i18n gets enabled (project conf file is being set) - return - - _enabled: -> - # read the comment of @conf - @conf? - - _getPackageDomain: (package_name) -> - package_name.replace(/:/g, "-") - - addResourceBundle: (lang_tag, package_name, translations) -> - TAPi18next.addResourceBundle(lang_tag, @_getPackageDomain(package_name), translations) - - _getSpecificLangTranslator: (lang) -> - current_lang = TAPi18next.lng() - - translator = null - TAPi18next.setLng lang, {fixLng: true}, (lang_translator) => - translator = lang_translator - - # Restore i18next lang that had been changed in the process of generating - # lang specific translator - TAPi18next.setLng current_lang - - return translator - - _getProjectLanguages: () -> - # Return an array of languages available for the current project - if @._enabled() - if _.isArray @.conf.supported_languages - return _.union([@._fallback_language], @.conf.supported_languages) - else - # If supported_languages is null, all the languages we found - # translations files to in the project level are considered supported. - # We use the @.languages_names array to tell which languages we found - # since for every i18n.json file we found in the project level we add - # an entry for its language to @.languages_names in the build process. - # - # We also know for certain that when tap-i18n is enabled the fallback - # lang is in @.languages_names - return _.keys @.languages_names - else - return [@._fallback_language] - - getLanguages: -> - if not @._enabled() - return null - - languages = {} - for lang_tag in @._getProjectLanguages() - languages[lang_tag] = - name: @.languages_names[lang_tag][1] - en: @.languages_names[lang_tag][0] - - languages - - _loadLangFileObject: (language_tag, data) -> - for package_name, package_keys of data - # Translations that are added by loadTranslations() have higher priority - package_keys = _.extend({}, package_keys, @_loadTranslations_cache[language_tag]?[package_name] or {}) - - @addResourceBundle(language_tag, package_name, package_keys) - - _loadTranslations_cache: {} - loadTranslations: (translations, namespace) -> - project_languages = @_getProjectLanguages() - - for language_tag, translation_keys of translations - if not @_loadTranslations_cache[language_tag]? - @_loadTranslations_cache[language_tag] = {} - - if not @_loadTranslations_cache[language_tag][namespace]? - @_loadTranslations_cache[language_tag][namespace] = {} - - _.extend(@_loadTranslations_cache[language_tag][namespace], translation_keys) - - @addResourceBundle(language_tag, namespace, translation_keys) - - if Meteor.isClient and @getLanguage() == language_tag - # Retranslate if session language updated - @_language_changed_tracker.changed() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee deleted file mode 100644 index 74aff3ad7..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-helpers.coffee +++ /dev/null @@ -1 +0,0 @@ -share.helpers = {} \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee deleted file mode 100644 index f51365a4e..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-init.coffee +++ /dev/null @@ -1 +0,0 @@ -TAPi18n = new TAPi18n() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee b/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee deleted file mode 100644 index 014e89d0d..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18n/tap_i18n-server.coffee +++ /dev/null @@ -1,85 +0,0 @@ -_.extend TAPi18n.prototype, - server_translators: null - - _registerServerTranslator: (lang_tag, package_name) -> - if @_enabled() - if not(lang_tag of @server_translators) - @server_translators[lang_tag] = @_getSpecificLangTranslator(lang_tag) - - # fallback language is integrated, and isn't part of @translations - if lang_tag != @_fallback_language - @addResourceBundle(lang_tag, package_name, @translations[lang_tag][package_name]) - - if not(@_fallback_language of @server_translators) - @server_translators[@_fallback_language] = @_getSpecificLangTranslator(@_fallback_language) - - _registerAllServerTranslators: () -> - for lang_tag in @_getProjectLanguages() - for package_name of @translations[lang_tag] - @_registerServerTranslator(lang_tag, package_name) - - _getPackageI18nextProxy: (package_name) -> - # A proxy to TAPi18next.t where the namespace is preset to the package's - (key, options, lang_tag=null) => - if not lang_tag? - # translate to fallback_language - return @server_translators[@_fallback_language] "#{@_getPackageDomain(package_name)}:#{key}", options - else if not(lang_tag of @server_translators) - console.log "Warning: language #{lang_tag} is not supported in this project, fallback language (#{@_fallback_language})" - return @server_translators[@_fallback_language] "#{@_getPackageDomain(package_name)}:#{key}", options - else - return @server_translators[lang_tag] "#{@_getPackageDomain(package_name)}:#{key}", options - - _registerHTTPMethod: -> - self = @ - - methods = {} - - if not self._enabled() - throw new Meteor.Error 500, "tap-i18n has to be enabled in order to register the HTTP method" - - methods["#{self.conf.i18n_files_route.replace(/\/$/, "")}/multi/:langs"] = - get: () -> - if not RegExp("^((#{globals.langauges_tags_regex},)*#{globals.langauges_tags_regex}|all).json$").test(@params.langs) - return @setStatusCode(401) - - langs = @params.langs.replace ".json", "" - - if langs == "all" - output = self.translations - else - output = {} - - langs = langs.split(",") - for lang_tag in langs - if lang_tag in self._getProjectLanguages() and \ - lang_tag != self._fallback_language # fallback language is integrated to the bundle - language_translations = self.translations[lang_tag] - - if language_translations? - output[lang_tag] = language_translations - - return JSON.stringify(output) - - methods["#{self.conf.i18n_files_route.replace(/\/$/, "")}/:lang"] = - get: () -> - if not RegExp("^#{globals.langauges_tags_regex}.json$").test(@params.lang) - return @setStatusCode(401) - - lang_tag = @params.lang.replace ".json", "" - - if lang_tag not in self._getProjectLanguages() or \ - lang_tag == self._fallback_language # fallback language is integrated to the bundle - return @setStatusCode(404) # not found - - language_translations = self.translations[lang_tag] - # returning {} if lang_tag is not in translations allows the project - # developer to force a language supporte with project-tap.i18n's - # supported_languages property, even if that language has no lang - # files. - return JSON.stringify(if language_translations? then language_translations else {}) - - HTTP.methods methods - - _onceEnabled: -> - @_registerAllServerTranslators() \ No newline at end of file diff --git a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js deleted file mode 100644 index dbf4f810b..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next-1.7.3.js +++ /dev/null @@ -1,2748 +0,0 @@ -// tap_i18next is a copy of i18next that expose i18next to the global namespace -// under the name name TAPi18next instead of i18n to (1) avoid interfering with other -// Meteor packages that might use i18n with different configurations than we do -// or worse - (2) using a different version of i18next -// -// setJqueryExt is disabled by default in TAPi18next -// sprintf is a default postProcess in TAPi18next -// -// TAPi18next is set outside of the singleton builder to make it available in the -// package level - -// i18next, v1.7.3 -// Copyright (c)2014 Jan Mühlemann (jamuhl). -// Distributed under MIT license -// http://i18next.com - -// set TAPi18next outside of the singleton builder to make it available in the package level -TAPi18next = {}; -(function() { - - // add indexOf to non ECMA-262 standard compliant browsers - if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { - "use strict"; - if (this == null) { - throw new TypeError(); - } - var t = Object(this); - var len = t.length >>> 0; - if (len === 0) { - return -1; - } - var n = 0; - if (arguments.length > 0) { - n = Number(arguments[1]); - if (n != n) { // shortcut for verifying if it's NaN - n = 0; - } else if (n != 0 && n != Infinity && n != -Infinity) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - } - if (n >= len) { - return -1; - } - var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); - for (; k < len; k++) { - if (k in t && t[k] === searchElement) { - return k; - } - } - return -1; - } - } - - // add lastIndexOf to non ECMA-262 standard compliant browsers - if (!Array.prototype.lastIndexOf) { - Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) { - "use strict"; - if (this == null) { - throw new TypeError(); - } - var t = Object(this); - var len = t.length >>> 0; - if (len === 0) { - return -1; - } - var n = len; - if (arguments.length > 1) { - n = Number(arguments[1]); - if (n != n) { - n = 0; - } else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - } - var k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); - for (; k >= 0; k--) { - if (k in t && t[k] === searchElement) { - return k; - } - } - return -1; - }; - } - - // Add string trim for IE8. - if (typeof String.prototype.trim !== 'function') { - String.prototype.trim = function() { - return this.replace(/^\s+|\s+$/g, ''); - } - } - - var root = this - , $ = root.jQuery || root.Zepto - , resStore = {} - , currentLng - , replacementCounter = 0 - , languages = [] - , initialized = false; - - - // Export the i18next object for **CommonJS**. - // If we're not in CommonJS, add `i18n` to the - // global object or to jquery. - if (typeof module !== 'undefined' && module.exports) { - module.exports = TAPi18next; - } else { - if ($) { - $.TAPi18next = $.TAPi18next || TAPi18next; - } - - root.TAPi18next = root.TAPi18next || TAPi18next; - } - // defaults - var o = { - lng: undefined, - load: 'all', - preload: [], - lowerCaseLng: false, - returnObjectTrees: false, - fallbackLng: ['dev'], - fallbackNS: [], - detectLngQS: 'setLng', - ns: 'translation', - fallbackOnNull: true, - fallbackOnEmpty: false, - fallbackToDefaultNS: false, - nsseparator: ':', - keyseparator: '.', - selectorAttr: 'data-i18n', - debug: false, - - resGetPath: 'locales/__lng__/__ns__.json', - resPostPath: 'locales/add/__lng__/__ns__', - - getAsync: true, - postAsync: true, - - resStore: undefined, - useLocalStorage: false, - localStorageExpirationTime: 7*24*60*60*1000, - - dynamicLoad: false, - sendMissing: false, - sendMissingTo: 'fallback', // current | all - sendType: 'POST', - - interpolationPrefix: '__', - interpolationSuffix: '__', - reusePrefix: '$t(', - reuseSuffix: ')', - pluralSuffix: '_plural', - pluralNotFound: ['plural_not_found', Math.random()].join(''), - contextNotFound: ['context_not_found', Math.random()].join(''), - escapeInterpolation: false, - - setJqueryExt: false, - defaultValueFromContent: true, - useDataAttrOptions: false, - cookieExpirationTime: undefined, - useCookie: true, - cookieName: 'TAPi18next', - cookieDomain: undefined, - - objectTreeKeyHandler: undefined, - postProcess: ["sprintf"], - parseMissingKey: undefined, - - shortcutFunction: 'sprintf' // or: defaultValue - }; - function _extend(target, source) { - if (!source || typeof source === 'function') { - return target; - } - - for (var attr in source) { target[attr] = source[attr]; } - return target; - } - - function _each(object, callback, args) { - var name, i = 0, - length = object.length, - isObj = length === undefined || Object.prototype.toString.apply(object) !== '[object Array]' || typeof object === "function"; - - if (args) { - if (isObj) { - for (name in object) { - if (callback.apply(object[name], args) === false) { - break; - } - } - } else { - for ( ; i < length; ) { - if (callback.apply(object[i++], args) === false) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if (isObj) { - for (name in object) { - if (callback.call(object[name], name, object[name]) === false) { - break; - } - } - } else { - for ( ; i < length; ) { - if (callback.call(object[i], i, object[i++]) === false) { - break; - } - } - } - } - - return object; - } - - var _entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': '"', - "'": ''', - "/": '/' - }; - - function _escape(data) { - if (typeof data === 'string') { - return data.replace(/[&<>"'\/]/g, function (s) { - return _entityMap[s]; - }); - }else{ - return data; - } - } - - function _ajax(options) { - - // v0.5.0 of https://github.com/goloroden/http.js - var getXhr = function (callback) { - // Use the native XHR object if the browser supports it. - if (window.XMLHttpRequest) { - return callback(null, new XMLHttpRequest()); - } else if (window.ActiveXObject) { - // In Internet Explorer check for ActiveX versions of the XHR object. - try { - return callback(null, new ActiveXObject("Msxml2.XMLHTTP")); - } catch (e) { - return callback(null, new ActiveXObject("Microsoft.XMLHTTP")); - } - } - - // If no XHR support was found, throw an error. - return callback(new Error()); - }; - - var encodeUsingUrlEncoding = function (data) { - if(typeof data === 'string') { - return data; - } - - var result = []; - for(var dataItem in data) { - if(data.hasOwnProperty(dataItem)) { - result.push(encodeURIComponent(dataItem) + '=' + encodeURIComponent(data[dataItem])); - } - } - - return result.join('&'); - }; - - var utf8 = function (text) { - text = text.replace(/\r\n/g, '\n'); - var result = ''; - - for(var i = 0; i < text.length; i++) { - var c = text.charCodeAt(i); - - if(c < 128) { - result += String.fromCharCode(c); - } else if((c > 127) && (c < 2048)) { - result += String.fromCharCode((c >> 6) | 192); - result += String.fromCharCode((c & 63) | 128); - } else { - result += String.fromCharCode((c >> 12) | 224); - result += String.fromCharCode(((c >> 6) & 63) | 128); - result += String.fromCharCode((c & 63) | 128); - } - } - - return result; - }; - - var base64 = function (text) { - var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - text = utf8(text); - var result = '', - chr1, chr2, chr3, - enc1, enc2, enc3, enc4, - i = 0; - - do { - chr1 = text.charCodeAt(i++); - chr2 = text.charCodeAt(i++); - chr3 = text.charCodeAt(i++); - - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if(isNaN(chr2)) { - enc3 = enc4 = 64; - } else if(isNaN(chr3)) { - enc4 = 64; - } - - result += - keyStr.charAt(enc1) + - keyStr.charAt(enc2) + - keyStr.charAt(enc3) + - keyStr.charAt(enc4); - chr1 = chr2 = chr3 = ''; - enc1 = enc2 = enc3 = enc4 = ''; - } while(i < text.length); - - return result; - }; - - var mergeHeaders = function () { - // Use the first header object as base. - var result = arguments[0]; - - // Iterate through the remaining header objects and add them. - for(var i = 1; i < arguments.length; i++) { - var currentHeaders = arguments[i]; - for(var header in currentHeaders) { - if(currentHeaders.hasOwnProperty(header)) { - result[header] = currentHeaders[header]; - } - } - } - - // Return the merged headers. - return result; - }; - - var ajax = function (method, url, options, callback) { - // Adjust parameters. - if(typeof options === 'function') { - callback = options; - options = {}; - } - - // Set default parameter values. - options.cache = options.cache || false; - options.data = options.data || {}; - options.headers = options.headers || {}; - options.jsonp = options.jsonp || false; - options.async = options.async === undefined ? true : options.async; - - // Merge the various header objects. - var headers = mergeHeaders({ - 'accept': '*/*', - 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8' - }, ajax.headers, options.headers); - - // Encode the data according to the content-type. - var payload; - if (headers['content-type'] === 'application/json') { - payload = JSON.stringify(options.data); - } else { - payload = encodeUsingUrlEncoding(options.data); - } - - // Specially prepare GET requests: Setup the query string, handle caching and make a JSONP call - // if neccessary. - if(method === 'GET') { - // Setup the query string. - var queryString = []; - if(payload) { - queryString.push(payload); - payload = null; - } - - // Handle caching. - if(!options.cache) { - queryString.push('_=' + (new Date()).getTime()); - } - - // If neccessary prepare the query string for a JSONP call. - if(options.jsonp) { - queryString.push('callback=' + options.jsonp); - queryString.push('jsonp=' + options.jsonp); - } - - // Merge the query string and attach it to the url. - queryString = queryString.join('&'); - if (queryString.length > 1) { - if (url.indexOf('?') > -1) { - url += '&' + queryString; - } else { - url += '?' + queryString; - } - } - - // Make a JSONP call if neccessary. - if(options.jsonp) { - var head = document.getElementsByTagName('head')[0]; - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = url; - head.appendChild(script); - return; - } - } - - // Since we got here, it is no JSONP request, so make a normal XHR request. - getXhr(function (err, xhr) { - if(err) return callback(err); - - // Open the request. - xhr.open(method, url, options.async); - - // Set the request headers. - for(var header in headers) { - if(headers.hasOwnProperty(header)) { - xhr.setRequestHeader(header, headers[header]); - } - } - - // Handle the request events. - xhr.onreadystatechange = function () { - if(xhr.readyState === 4) { - var data = xhr.responseText || ''; - - // If no callback is given, return. - if(!callback) { - return; - } - - // Return an object that provides access to the data as text and JSON. - callback(xhr.status, { - text: function () { - return data; - }, - - json: function () { - return JSON.parse(data); - } - }); - } - }; - - // Actually send the XHR request. - xhr.send(payload); - }); - }; - - // Define the external interface. - var http = { - authBasic: function (username, password) { - ajax.headers['Authorization'] = 'Basic ' + base64(username + ':' + password); - }, - - connect: function (url, options, callback) { - return ajax('CONNECT', url, options, callback); - }, - - del: function (url, options, callback) { - return ajax('DELETE', url, options, callback); - }, - - get: function (url, options, callback) { - return ajax('GET', url, options, callback); - }, - - head: function (url, options, callback) { - return ajax('HEAD', url, options, callback); - }, - - headers: function (headers) { - ajax.headers = headers || {}; - }, - - isAllowed: function (url, verb, callback) { - this.options(url, function (status, data) { - callback(data.text().indexOf(verb) !== -1); - }); - }, - - options: function (url, options, callback) { - return ajax('OPTIONS', url, options, callback); - }, - - patch: function (url, options, callback) { - return ajax('PATCH', url, options, callback); - }, - - post: function (url, options, callback) { - return ajax('POST', url, options, callback); - }, - - put: function (url, options, callback) { - return ajax('PUT', url, options, callback); - }, - - trace: function (url, options, callback) { - return ajax('TRACE', url, options, callback); - } - }; - - - var methode = options.type ? options.type.toLowerCase() : 'get'; - - http[methode](options.url, options, function (status, data) { - if (status === 200) { - options.success(data.json(), status, null); - } else { - options.error(data.text(), status, null); - } - }); - } - - var _cookie = { - create: function(name,value,minutes,domain) { - var expires; - if (minutes) { - var date = new Date(); - date.setTime(date.getTime()+(minutes*60*1000)); - expires = "; expires="+date.toGMTString(); - } - else expires = ""; - domain = (domain)? "domain="+domain+";" : ""; - document.cookie = name+"="+value+expires+";"+domain+"path=/"; - }, - - read: function(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length); - } - return null; - }, - - remove: function(name) { - this.create(name,"",-1); - } - }; - - var cookie_noop = { - create: function(name,value,minutes,domain) {}, - read: function(name) { return null; }, - remove: function(name) {} - }; - - - - // move dependent functions to a container so that - // they can be overriden easier in no jquery environment (node.js) - var f = { - extend: $ ? $.extend : _extend, - each: $ ? $.each : _each, - ajax: $ ? $.ajax : (typeof document !== 'undefined' ? _ajax : function() {}), - cookie: typeof document !== 'undefined' ? _cookie : cookie_noop, - detectLanguage: detectLanguage, - escape: _escape, - log: function(str) { - if (o.debug && typeof console !== "undefined") console.log(str); - }, - toLanguages: function(lng) { - var languages = []; - if (typeof lng === 'string' && lng.indexOf('-') > -1) { - var parts = lng.split('-'); - - lng = o.lowerCaseLng ? - parts[0].toLowerCase() + '-' + parts[1].toLowerCase() : - parts[0].toLowerCase() + '-' + parts[1].toUpperCase(); - - if (o.load !== 'unspecific') languages.push(lng); - if (o.load !== 'current') languages.push(parts[0]); - } else { - languages.push(lng); - } - - for (var i = 0; i < o.fallbackLng.length; i++) { - if (languages.indexOf(o.fallbackLng[i]) === -1 && o.fallbackLng[i]) languages.push(o.fallbackLng[i]); - } - - return languages; - }, - regexEscape: function(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - } - }; - function init(options, cb) { - - if (typeof options === 'function') { - cb = options; - options = {}; - } - options = options || {}; - - // override defaults with passed in options - f.extend(o, options); - delete o.fixLng; /* passed in each time */ - - // create namespace object if namespace is passed in as string - if (typeof o.ns == 'string') { - o.ns = { namespaces: [o.ns], defaultNs: o.ns}; - } - - // fallback namespaces - if (typeof o.fallbackNS == 'string') { - o.fallbackNS = [o.fallbackNS]; - } - - // fallback languages - if (typeof o.fallbackLng == 'string' || typeof o.fallbackLng == 'boolean') { - o.fallbackLng = [o.fallbackLng]; - } - - // escape prefix/suffix - o.interpolationPrefixEscaped = f.regexEscape(o.interpolationPrefix); - o.interpolationSuffixEscaped = f.regexEscape(o.interpolationSuffix); - - if (!o.lng) o.lng = f.detectLanguage(); - if (o.lng) { - // set cookie with lng set (as detectLanguage will set cookie on need) - if (o.useCookie) f.cookie.create(o.cookieName, o.lng, o.cookieExpirationTime, o.cookieDomain); - } else { - o.lng = o.fallbackLng[0]; - if (o.useCookie) f.cookie.remove(o.cookieName); - } - - languages = f.toLanguages(o.lng); - currentLng = languages[0]; - f.log('currentLng set to: ' + currentLng); - - var lngTranslate = translate; - if (options.fixLng) { - lngTranslate = function(key, options) { - options = options || {}; - options.lng = options.lng || lngTranslate.lng; - return translate(key, options); - }; - lngTranslate.lng = currentLng; - } - - pluralExtensions.setCurrentLng(currentLng); - - // add JQuery extensions - if ($ && o.setJqueryExt) addJqueryFunct(); - - // jQuery deferred - var deferred; - if ($ && $.Deferred) { - deferred = $.Deferred(); - } - - // return immidiatly if res are passed in - if (o.resStore) { - resStore = o.resStore; - initialized = true; - if (cb) cb(lngTranslate); - if (deferred) deferred.resolve(lngTranslate); - if (deferred) return deferred.promise(); - return; - } - - // languages to load - var lngsToLoad = f.toLanguages(o.lng); - if (typeof o.preload === 'string') o.preload = [o.preload]; - for (var i = 0, l = o.preload.length; i < l; i++) { - var pres = f.toLanguages(o.preload[i]); - for (var y = 0, len = pres.length; y < len; y++) { - if (lngsToLoad.indexOf(pres[y]) < 0) { - lngsToLoad.push(pres[y]); - } - } - } - - // else load them - TAPi18next.sync.load(lngsToLoad, o, function(err, store) { - resStore = store; - initialized = true; - - if (cb) cb(lngTranslate); - if (deferred) deferred.resolve(lngTranslate); - }); - - if (deferred) return deferred.promise(); - } - function preload(lngs, cb) { - if (typeof lngs === 'string') lngs = [lngs]; - for (var i = 0, l = lngs.length; i < l; i++) { - if (o.preload.indexOf(lngs[i]) < 0) { - o.preload.push(lngs[i]); - } - } - return init(cb); - } - - function addResourceBundle(lng, ns, resources) { - if (typeof ns !== 'string') { - resources = ns; - ns = o.ns.defaultNs; - } else if (o.ns.namespaces.indexOf(ns) < 0) { - o.ns.namespaces.push(ns); - } - - resStore[lng] = resStore[lng] || {}; - resStore[lng][ns] = resStore[lng][ns] || {}; - - f.extend(resStore[lng][ns], resources); - } - - function removeResourceBundle(lng, ns) { - if (typeof ns !== 'string') { - ns = o.ns.defaultNs; - } - - resStore[lng] = resStore[lng] || {}; - resStore[lng][ns] = {}; - } - - function setDefaultNamespace(ns) { - o.ns.defaultNs = ns; - } - - function loadNamespace(namespace, cb) { - loadNamespaces([namespace], cb); - } - - function loadNamespaces(namespaces, cb) { - var opts = { - dynamicLoad: o.dynamicLoad, - resGetPath: o.resGetPath, - getAsync: o.getAsync, - customLoad: o.customLoad, - ns: { namespaces: namespaces, defaultNs: ''} /* new namespaces to load */ - }; - - // languages to load - var lngsToLoad = f.toLanguages(o.lng); - if (typeof o.preload === 'string') o.preload = [o.preload]; - for (var i = 0, l = o.preload.length; i < l; i++) { - var pres = f.toLanguages(o.preload[i]); - for (var y = 0, len = pres.length; y < len; y++) { - if (lngsToLoad.indexOf(pres[y]) < 0) { - lngsToLoad.push(pres[y]); - } - } - } - - // check if we have to load - var lngNeedLoad = []; - for (var a = 0, lenA = lngsToLoad.length; a < lenA; a++) { - var needLoad = false; - var resSet = resStore[lngsToLoad[a]]; - if (resSet) { - for (var b = 0, lenB = namespaces.length; b < lenB; b++) { - if (!resSet[namespaces[b]]) needLoad = true; - } - } else { - needLoad = true; - } - - if (needLoad) lngNeedLoad.push(lngsToLoad[a]); - } - - if (lngNeedLoad.length) { - TAPi18next.sync._fetch(lngNeedLoad, opts, function(err, store) { - var todo = namespaces.length * lngNeedLoad.length; - - // load each file individual - f.each(namespaces, function(nsIndex, nsValue) { - - // append namespace to namespace array - if (o.ns.namespaces.indexOf(nsValue) < 0) { - o.ns.namespaces.push(nsValue); - } - - f.each(lngNeedLoad, function(lngIndex, lngValue) { - resStore[lngValue] = resStore[lngValue] || {}; - resStore[lngValue][nsValue] = store[lngValue][nsValue]; - - todo--; // wait for all done befor callback - if (todo === 0 && cb) { - if (o.useLocalStorage) TAPi18next.sync._storeLocal(resStore); - cb(); - } - }); - }); - }); - } else { - if (cb) cb(); - } - } - - function setLng(lng, options, cb) { - if (typeof options === 'function') { - cb = options; - options = {}; - } else if (!options) { - options = {}; - } - - options.lng = lng; - return init(options, cb); - } - - function lng() { - return currentLng; - } - function addJqueryFunct() { - // $.t shortcut - $.t = $.t || translate; - - function parse(ele, key, options) { - if (key.length === 0) return; - - var attr = 'text'; - - if (key.indexOf('[') === 0) { - var parts = key.split(']'); - key = parts[1]; - attr = parts[0].substr(1, parts[0].length-1); - } - - if (key.indexOf(';') === key.length-1) { - key = key.substr(0, key.length-2); - } - - var optionsToUse; - if (attr === 'html') { - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; - ele.html($.t(key, optionsToUse)); - } else if (attr === 'text') { - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.text() }, options) : options; - ele.text($.t(key, optionsToUse)); - } else if (attr === 'prepend') { - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; - ele.prepend($.t(key, optionsToUse)); - } else if (attr === 'append') { - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.html() }, options) : options; - ele.append($.t(key, optionsToUse)); - } else if (attr.indexOf("data-") === 0) { - var dataAttr = attr.substr(("data-").length); - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.data(dataAttr) }, options) : options; - var translated = $.t(key, optionsToUse); - //we change into the data cache - ele.data(dataAttr, translated); - //we change into the dom - ele.attr(attr, translated); - } else { - optionsToUse = o.defaultValueFromContent ? $.extend({ defaultValue: ele.attr(attr) }, options) : options; - ele.attr(attr, $.t(key, optionsToUse)); - } - } - - function localize(ele, options) { - var key = ele.attr(o.selectorAttr); - if (!key && typeof key !== 'undefined' && key !== false) key = ele.text() || ele.val(); - if (!key) return; - - var target = ele - , targetSelector = ele.data("i18n-target"); - if (targetSelector) { - target = ele.find(targetSelector) || ele; - } - - if (!options && o.useDataAttrOptions === true) { - options = ele.data("i18n-options"); - } - options = options || {}; - - if (key.indexOf(';') >= 0) { - var keys = key.split(';'); - - $.each(keys, function(m, k) { - if (k !== '') parse(target, k, options); - }); - - } else { - parse(target, key, options); - } - - if (o.useDataAttrOptions === true) ele.data("i18n-options", options); - } - - // fn - $.fn.TAPi18next = function (options) { - return this.each(function() { - // localize element itself - localize($(this), options); - - // localize childs - var elements = $(this).find('[' + o.selectorAttr + ']'); - elements.each(function() { - localize($(this), options); - }); - }); - }; - } - function applyReplacement(str, replacementHash, nestedKey, options) { - if (!str) return str; - - options = options || replacementHash; // first call uses replacement hash combined with options - if (str.indexOf(options.interpolationPrefix || o.interpolationPrefix) < 0) return str; - - var prefix = options.interpolationPrefix ? f.regexEscape(options.interpolationPrefix) : o.interpolationPrefixEscaped - , suffix = options.interpolationSuffix ? f.regexEscape(options.interpolationSuffix) : o.interpolationSuffixEscaped - , unEscapingSuffix = 'HTML'+suffix; - - f.each(replacementHash, function(key, value) { - var nextKey = nestedKey ? nestedKey + o.keyseparator + key : key; - if (typeof value === 'object' && value !== null) { - str = applyReplacement(str, value, nextKey, options); - } else { - if (options.escapeInterpolation || o.escapeInterpolation) { - str = str.replace(new RegExp([prefix, nextKey, unEscapingSuffix].join(''), 'g'), value); - str = str.replace(new RegExp([prefix, nextKey, suffix].join(''), 'g'), f.escape(value)); - } else { - str = str.replace(new RegExp([prefix, nextKey, suffix].join(''), 'g'), value); - } - // str = options.escapeInterpolation; - } - }); - return str; - } - - // append it to functions - f.applyReplacement = applyReplacement; - - function applyReuse(translated, options) { - var comma = ','; - var options_open = '{'; - var options_close = '}'; - - var opts = f.extend({}, options); - delete opts.postProcess; - - while (translated.indexOf(o.reusePrefix) != -1) { - replacementCounter++; - if (replacementCounter > o.maxRecursion) { break; } // safety net for too much recursion - var index_of_opening = translated.lastIndexOf(o.reusePrefix); - var index_of_end_of_closing = translated.indexOf(o.reuseSuffix, index_of_opening) + o.reuseSuffix.length; - var token = translated.substring(index_of_opening, index_of_end_of_closing); - var token_without_symbols = token.replace(o.reusePrefix, '').replace(o.reuseSuffix, ''); - - - if (token_without_symbols.indexOf(comma) != -1) { - var index_of_token_end_of_closing = token_without_symbols.indexOf(comma); - if (token_without_symbols.indexOf(options_open, index_of_token_end_of_closing) != -1 && token_without_symbols.indexOf(options_close, index_of_token_end_of_closing) != -1) { - var index_of_opts_opening = token_without_symbols.indexOf(options_open, index_of_token_end_of_closing); - var index_of_opts_end_of_closing = token_without_symbols.indexOf(options_close, index_of_opts_opening) + options_close.length; - try { - opts = f.extend(opts, JSON.parse(token_without_symbols.substring(index_of_opts_opening, index_of_opts_end_of_closing))); - token_without_symbols = token_without_symbols.substring(0, index_of_token_end_of_closing); - } catch (e) { - } - } - } - - var translated_token = _translate(token_without_symbols, opts); - translated = translated.replace(token, translated_token); - } - return translated; - } - - function hasContext(options) { - return (options.context && (typeof options.context == 'string' || typeof options.context == 'number')); - } - - function needsPlural(options) { - return (options.count !== undefined && typeof options.count != 'string' && options.count !== 1); - } - - function exists(key, options) { - options = options || {}; - - var notFound = _getDefaultValue(key, options) - , found = _find(key, options); - - return found !== undefined || found === notFound; - } - - function translate(key, options) { - if (typeof options === 'undefined') { - options = {}; - } - - if (!initialized) { - f.log('i18next not finished initialization. you might have called t function before loading resources finished.') - return options.defaultValue || ''; - }; - replacementCounter = 0; - return _translate.apply(null, arguments); - } - - function _getDefaultValue(key, options) { - return (options.defaultValue !== undefined) ? options.defaultValue : key; - } - - function _injectSprintfProcessor() { - - var values = []; - - // mh: build array from second argument onwards - for (var i = 1; i < arguments.length; i++) { - values.push(arguments[i]); - } - - return { - postProcess: 'sprintf', - sprintf: values - }; - } - - function _translate(potentialKeys, options) { - if (typeof options !== "undefined" && options !== null && typeof options !== 'object') { - if (o.shortcutFunction === 'sprintf') { - // mh: gettext like sprintf syntax found, automatically create sprintf processor - options = _injectSprintfProcessor.apply(null, arguments); - } else if (o.shortcutFunction === 'defaultValue') { - options = { - defaultValue: options - } - } - } else { - options = options || {}; - } - - if (potentialKeys === undefined || potentialKeys === null) return ''; - - if (typeof potentialKeys == 'string') { - potentialKeys = [potentialKeys]; - } - - var key = potentialKeys[0]; - - if (potentialKeys.length > 1) { - for (var i = 0; i < potentialKeys.length; i++) { - key = potentialKeys[i]; - if (exists(key, options)) { - break; - } - } - } - - var notFound = _getDefaultValue(key, options) - , found = _find(key, options) - , lngs = options.lng ? f.toLanguages(options.lng) : languages - , ns = options.ns || o.ns.defaultNs - , parts; - - // split ns and key - if (key.indexOf(o.nsseparator) > -1) { - parts = key.split(o.nsseparator); - ns = parts[0]; - key = parts[1]; - } - - if (found === undefined && o.sendMissing) { - if (options.lng) { - sync.postMissing(lngs[0], ns, key, notFound, lngs); - } else { - sync.postMissing(o.lng, ns, key, notFound, lngs); - } - } - - var postProcessor = options.postProcess || o.postProcess; - if (found !== undefined && postProcessor) { - if (postProcessors[postProcessor]) { - found = postProcessors[postProcessor](found, key, options); - } - } - - // process notFound if function exists - var splitNotFound = notFound; - if (notFound.indexOf(o.nsseparator) > -1) { - parts = notFound.split(o.nsseparator); - splitNotFound = parts[1]; - } - if (splitNotFound === key && o.parseMissingKey) { - notFound = o.parseMissingKey(notFound); - } - - if (found === undefined) { - notFound = applyReplacement(notFound, options); - notFound = applyReuse(notFound, options); - - if (postProcessor && postProcessors[postProcessor]) { - var val = _getDefaultValue(key, options); - found = postProcessors[postProcessor](val, key, options); - } - } - - return (found !== undefined) ? found : notFound; - } - - function _find(key, options) { - options = options || {}; - - var optionWithoutCount, translated - , notFound = _getDefaultValue(key, options) - , lngs = languages; - - if (!resStore) { return notFound; } // no resStore to translate from - - // CI mode - if (lngs[0].toLowerCase() === 'cimode') return notFound; - - // passed in lng - if (options.lng) { - lngs = f.toLanguages(options.lng); - - if (!resStore[lngs[0]]) { - var oldAsync = o.getAsync; - o.getAsync = false; - - TAPi18next.sync.load(lngs, o, function(err, store) { - f.extend(resStore, store); - o.getAsync = oldAsync; - }); - } - } - - var ns = options.ns || o.ns.defaultNs; - if (key.indexOf(o.nsseparator) > -1) { - var parts = key.split(o.nsseparator); - ns = parts[0]; - key = parts[1]; - } - - if (hasContext(options)) { - optionWithoutCount = f.extend({}, options); - delete optionWithoutCount.context; - optionWithoutCount.defaultValue = o.contextNotFound; - - var contextKey = ns + o.nsseparator + key + '_' + options.context; - - translated = translate(contextKey, optionWithoutCount); - if (translated != o.contextNotFound) { - return applyReplacement(translated, { context: options.context }); // apply replacement for context only - } // else continue translation with original/nonContext key - } - - if (needsPlural(options)) { - optionWithoutCount = f.extend({}, options); - delete optionWithoutCount.count; - optionWithoutCount.defaultValue = o.pluralNotFound; - - var pluralKey = ns + o.nsseparator + key + o.pluralSuffix; - var pluralExtension = pluralExtensions.get(lngs[0], options.count); - if (pluralExtension >= 0) { - pluralKey = pluralKey + '_' + pluralExtension; - } else if (pluralExtension === 1) { - pluralKey = ns + o.nsseparator + key; // singular - } - - translated = translate(pluralKey, optionWithoutCount); - if (translated != o.pluralNotFound) { - return applyReplacement(translated, { - count: options.count, - interpolationPrefix: options.interpolationPrefix, - interpolationSuffix: options.interpolationSuffix - }); // apply replacement for count only - } // else continue translation with original/singular key - } - - var found; - var keys = key.split(o.keyseparator); - for (var i = 0, len = lngs.length; i < len; i++ ) { - if (found !== undefined) break; - - var l = lngs[i]; - - var x = 0; - var value = resStore[l] && resStore[l][ns]; - while (keys[x]) { - value = value && value[keys[x]]; - x++; - } - if (value !== undefined) { - var valueType = Object.prototype.toString.apply(value); - if (typeof value === 'string') { - value = applyReplacement(value, options); - value = applyReuse(value, options); - } else if (valueType === '[object Array]' && !o.returnObjectTrees && !options.returnObjectTrees) { - value = value.join('\n'); - value = applyReplacement(value, options); - value = applyReuse(value, options); - } else if (value === null && o.fallbackOnNull === true) { - value = undefined; - } else if (value !== null) { - if (!o.returnObjectTrees && !options.returnObjectTrees) { - if (o.objectTreeKeyHandler && typeof o.objectTreeKeyHandler == 'function') { - value = o.objectTreeKeyHandler(key, value, l, ns, options); - } else { - value = 'key \'' + ns + ':' + key + ' (' + l + ')\' ' + - 'returned an object instead of string.'; - f.log(value); - } - } else if (valueType !== '[object Number]' && valueType !== '[object Function]' && valueType !== '[object RegExp]') { - var copy = (valueType === '[object Array]') ? [] : {}; // apply child translation on a copy - f.each(value, function(m) { - copy[m] = _translate(ns + o.nsseparator + key + o.keyseparator + m, options); - }); - value = copy; - } - } - - if (typeof value === 'string' && value.trim() === '' && o.fallbackOnEmpty === true) - value = undefined; - - found = value; - } - } - - if (found === undefined && !options.isFallbackLookup && (o.fallbackToDefaultNS === true || (o.fallbackNS && o.fallbackNS.length > 0))) { - // set flag for fallback lookup - avoid recursion - options.isFallbackLookup = true; - - if (o.fallbackNS.length) { - - for (var y = 0, lenY = o.fallbackNS.length; y < lenY; y++) { - found = _find(o.fallbackNS[y] + o.nsseparator + key, options); - - if (found) { - /* compare value without namespace */ - var foundValue = found.indexOf(o.nsseparator) > -1 ? found.split(o.nsseparator)[1] : found - , notFoundValue = notFound.indexOf(o.nsseparator) > -1 ? notFound.split(o.nsseparator)[1] : notFound; - - if (foundValue !== notFoundValue) break; - } - } - } else { - found = _find(key, options); // fallback to default NS - } - } - - return found; - } - function detectLanguage() { - var detectedLng; - - // get from qs - var qsParm = []; - if (typeof window !== 'undefined') { - (function() { - var query = window.location.search.substring(1); - var parms = query.split('&'); - for (var i=0; i<parms.length; i++) { - var pos = parms[i].indexOf('='); - if (pos > 0) { - var key = parms[i].substring(0,pos); - var val = parms[i].substring(pos+1); - qsParm[key] = val; - } - } - })(); - if (qsParm[o.detectLngQS]) { - detectedLng = qsParm[o.detectLngQS]; - } - } - - // get from cookie - if (!detectedLng && typeof document !== 'undefined' && o.useCookie ) { - var c = f.cookie.read(o.cookieName); - if (c) detectedLng = c; - } - - // get from navigator - if (!detectedLng && typeof navigator !== 'undefined') { - detectedLng = (navigator.language) ? navigator.language : navigator.userLanguage; - } - - return detectedLng; - } - var sync = { - - load: function(lngs, options, cb) { - if (options.useLocalStorage) { - sync._loadLocal(lngs, options, function(err, store) { - var missingLngs = []; - for (var i = 0, len = lngs.length; i < len; i++) { - if (!store[lngs[i]]) missingLngs.push(lngs[i]); - } - - if (missingLngs.length > 0) { - sync._fetch(missingLngs, options, function(err, fetched) { - f.extend(store, fetched); - sync._storeLocal(fetched); - - cb(null, store); - }); - } else { - cb(null, store); - } - }); - } else { - sync._fetch(lngs, options, function(err, store){ - cb(null, store); - }); - } - }, - - _loadLocal: function(lngs, options, cb) { - var store = {} - , nowMS = new Date().getTime(); - - if(window.localStorage) { - - var todo = lngs.length; - - f.each(lngs, function(key, lng) { - var local = window.localStorage.getItem('res_' + lng); - - if (local) { - local = JSON.parse(local); - - if (local.i18nStamp && local.i18nStamp + options.localStorageExpirationTime > nowMS) { - store[lng] = local; - } - } - - todo--; // wait for all done befor callback - if (todo === 0) cb(null, store); - }); - } - }, - - _storeLocal: function(store) { - if(window.localStorage) { - for (var m in store) { - store[m].i18nStamp = new Date().getTime(); - window.localStorage.setItem('res_' + m, JSON.stringify(store[m])); - } - } - return; - }, - - _fetch: function(lngs, options, cb) { - var ns = options.ns - , store = {}; - - if (!options.dynamicLoad) { - var todo = ns.namespaces.length * lngs.length - , errors; - - // load each file individual - f.each(ns.namespaces, function(nsIndex, nsValue) { - f.each(lngs, function(lngIndex, lngValue) { - - // Call this once our translation has returned. - var loadComplete = function(err, data) { - if (err) { - errors = errors || []; - errors.push(err); - } - store[lngValue] = store[lngValue] || {}; - store[lngValue][nsValue] = data; - - todo--; // wait for all done befor callback - if (todo === 0) cb(errors, store); - }; - - if(typeof options.customLoad == 'function'){ - // Use the specified custom callback. - options.customLoad(lngValue, nsValue, options, loadComplete); - } else { - //~ // Use our inbuilt sync. - sync._fetchOne(lngValue, nsValue, options, loadComplete); - } - }); - }); - } else { - // Call this once our translation has returned. - var loadComplete = function(err, data) { - cb(null, data); - }; - - if(typeof options.customLoad == 'function'){ - // Use the specified custom callback. - options.customLoad(lngs, ns.namespaces, options, loadComplete); - } else { - var url = applyReplacement(options.resGetPath, { lng: lngs.join('+'), ns: ns.namespaces.join('+') }); - // load all needed stuff once - f.ajax({ - url: url, - success: function(data, status, xhr) { - f.log('loaded: ' + url); - loadComplete(null, data); - }, - error : function(xhr, status, error) { - f.log('failed loading: ' + url); - loadComplete('failed loading resource.json error: ' + error); - }, - dataType: "json", - async : options.getAsync - }); - } - } - }, - - _fetchOne: function(lng, ns, options, done) { - var url = applyReplacement(options.resGetPath, { lng: lng, ns: ns }); - f.ajax({ - url: url, - success: function(data, status, xhr) { - f.log('loaded: ' + url); - done(null, data); - }, - error : function(xhr, status, error) { - if ((status && status == 200) || (xhr && xhr.status && xhr.status == 200)) { - // file loaded but invalid json, stop waste time ! - f.log('There is a typo in: ' + url); - } else if ((status && status == 404) || (xhr && xhr.status && xhr.status == 404)) { - f.log('Does not exist: ' + url); - } else { - var theStatus = status ? status : ((xhr && xhr.status) ? xhr.status : null); - f.log(theStatus + ' when loading ' + url); - } - - done(error, {}); - }, - dataType: "json", - async : options.getAsync - }); - }, - - postMissing: function(lng, ns, key, defaultValue, lngs) { - var payload = {}; - payload[key] = defaultValue; - - var urls = []; - - if (o.sendMissingTo === 'fallback' && o.fallbackLng[0] !== false) { - for (var i = 0; i < o.fallbackLng.length; i++) { - urls.push({lng: o.fallbackLng[i], url: applyReplacement(o.resPostPath, { lng: o.fallbackLng[i], ns: ns })}); - } - } else if (o.sendMissingTo === 'current' || (o.sendMissingTo === 'fallback' && o.fallbackLng[0] === false) ) { - urls.push({lng: lng, url: applyReplacement(o.resPostPath, { lng: lng, ns: ns })}); - } else if (o.sendMissingTo === 'all') { - for (var i = 0, l = lngs.length; i < l; i++) { - urls.push({lng: lngs[i], url: applyReplacement(o.resPostPath, { lng: lngs[i], ns: ns })}); - } - } - - for (var y = 0, len = urls.length; y < len; y++) { - var item = urls[y]; - f.ajax({ - url: item.url, - type: o.sendType, - data: payload, - success: function(data, status, xhr) { - f.log('posted missing key \'' + key + '\' to: ' + item.url); - - // add key to resStore - var keys = key.split('.'); - var x = 0; - var value = resStore[item.lng][ns]; - while (keys[x]) { - if (x === keys.length - 1) { - value = value[keys[x]] = defaultValue; - } else { - value = value[keys[x]] = value[keys[x]] || {}; - } - x++; - } - }, - error : function(xhr, status, error) { - f.log('failed posting missing key \'' + key + '\' to: ' + item.url); - }, - dataType: "json", - async : o.postAsync - }); - } - } - }; - // definition http://translate.sourceforge.net/wiki/l10n/pluralforms - var pluralExtensions = { - - rules: { - "ach": { - "name": "Acholi", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "af": { - "name": "Afrikaans", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ak": { - "name": "Akan", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "am": { - "name": "Amharic", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "an": { - "name": "Aragonese", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ar": { - "name": "Arabic", - "numbers": [ - 0, - 1, - 2, - 3, - 11, - 100 - ], - "plurals": function(n) { return Number(n===0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5); } - }, - "arn": { - "name": "Mapudungun", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "ast": { - "name": "Asturian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ay": { - "name": "Aymar\u00e1", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "az": { - "name": "Azerbaijani", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "be": { - "name": "Belarusian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "bg": { - "name": "Bulgarian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "bn": { - "name": "Bengali", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "bo": { - "name": "Tibetan", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "br": { - "name": "Breton", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "bs": { - "name": "Bosnian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "ca": { - "name": "Catalan", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "cgg": { - "name": "Chiga", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "cs": { - "name": "Czech", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2); } - }, - "csb": { - "name": "Kashubian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "cy": { - "name": "Welsh", - "numbers": [ - 1, - 2, - 3, - 8 - ], - "plurals": function(n) { return Number((n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3); } - }, - "da": { - "name": "Danish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "de": { - "name": "German", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "dz": { - "name": "Dzongkha", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "el": { - "name": "Greek", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "en": { - "name": "English", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "eo": { - "name": "Esperanto", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "es": { - "name": "Spanish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "es_ar": { - "name": "Argentinean Spanish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "et": { - "name": "Estonian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "eu": { - "name": "Basque", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "fa": { - "name": "Persian", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "fi": { - "name": "Finnish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "fil": { - "name": "Filipino", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "fo": { - "name": "Faroese", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "fr": { - "name": "French", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "fur": { - "name": "Friulian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "fy": { - "name": "Frisian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ga": { - "name": "Irish", - "numbers": [ - 1, - 2, - 3, - 7, - 11 - ], - "plurals": function(n) { return Number(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4) ;} - }, - "gd": { - "name": "Scottish Gaelic", - "numbers": [ - 1, - 2, - 3, - 20 - ], - "plurals": function(n) { return Number((n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3); } - }, - "gl": { - "name": "Galician", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "gu": { - "name": "Gujarati", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "gun": { - "name": "Gun", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "ha": { - "name": "Hausa", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "he": { - "name": "Hebrew", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "hi": { - "name": "Hindi", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "hr": { - "name": "Croatian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "hu": { - "name": "Hungarian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "hy": { - "name": "Armenian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ia": { - "name": "Interlingua", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "id": { - "name": "Indonesian", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "is": { - "name": "Icelandic", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n%10!=1 || n%100==11); } - }, - "it": { - "name": "Italian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ja": { - "name": "Japanese", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "jbo": { - "name": "Lojban", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "jv": { - "name": "Javanese", - "numbers": [ - 0, - 1 - ], - "plurals": function(n) { return Number(n !== 0); } - }, - "ka": { - "name": "Georgian", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "kk": { - "name": "Kazakh", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "km": { - "name": "Khmer", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "kn": { - "name": "Kannada", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ko": { - "name": "Korean", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "ku": { - "name": "Kurdish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "kw": { - "name": "Cornish", - "numbers": [ - 1, - 2, - 3, - 4 - ], - "plurals": function(n) { return Number((n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3); } - }, - "ky": { - "name": "Kyrgyz", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "lb": { - "name": "Letzeburgesch", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ln": { - "name": "Lingala", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "lo": { - "name": "Lao", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "lt": { - "name": "Lithuanian", - "numbers": [ - 1, - 2, - 10 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "lv": { - "name": "Latvian", - "numbers": [ - 1, - 2, - 0 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n !== 0 ? 1 : 2); } - }, - "mai": { - "name": "Maithili", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "mfe": { - "name": "Mauritian Creole", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "mg": { - "name": "Malagasy", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "mi": { - "name": "Maori", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "mk": { - "name": "Macedonian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n==1 || n%10==1 ? 0 : 1); } - }, - "ml": { - "name": "Malayalam", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "mn": { - "name": "Mongolian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "mnk": { - "name": "Mandinka", - "numbers": [ - 0, - 1, - 2 - ], - "plurals": function(n) { return Number(n == 0 ? 0 : n==1 ? 1 : 2); } - }, - "mr": { - "name": "Marathi", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ms": { - "name": "Malay", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "mt": { - "name": "Maltese", - "numbers": [ - 1, - 2, - 11, - 20 - ], - "plurals": function(n) { return Number(n==1 ? 0 : n===0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3); } - }, - "nah": { - "name": "Nahuatl", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "nap": { - "name": "Neapolitan", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "nb": { - "name": "Norwegian Bokmal", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ne": { - "name": "Nepali", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "nl": { - "name": "Dutch", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "nn": { - "name": "Norwegian Nynorsk", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "no": { - "name": "Norwegian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "nso": { - "name": "Northern Sotho", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "oc": { - "name": "Occitan", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "or": { - "name": "Oriya", - "numbers": [ - 2, - 1 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "pa": { - "name": "Punjabi", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "pap": { - "name": "Papiamento", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "pl": { - "name": "Polish", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "pms": { - "name": "Piemontese", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ps": { - "name": "Pashto", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "pt": { - "name": "Portuguese", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "pt_br": { - "name": "Brazilian Portuguese", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "rm": { - "name": "Romansh", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ro": { - "name": "Romanian", - "numbers": [ - 1, - 2, - 20 - ], - "plurals": function(n) { return Number(n==1 ? 0 : (n===0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2); } - }, - "ru": { - "name": "Russian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "sah": { - "name": "Yakut", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "sco": { - "name": "Scots", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "se": { - "name": "Northern Sami", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "si": { - "name": "Sinhala", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "sk": { - "name": "Slovak", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2); } - }, - "sl": { - "name": "Slovenian", - "numbers": [ - 5, - 1, - 2, - 3 - ], - "plurals": function(n) { return Number(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); } - }, - "so": { - "name": "Somali", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "son": { - "name": "Songhay", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "sq": { - "name": "Albanian", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "sr": { - "name": "Serbian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "su": { - "name": "Sundanese", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "sv": { - "name": "Swedish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "sw": { - "name": "Swahili", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "ta": { - "name": "Tamil", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "te": { - "name": "Telugu", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "tg": { - "name": "Tajik", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "th": { - "name": "Thai", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "ti": { - "name": "Tigrinya", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "tk": { - "name": "Turkmen", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "tr": { - "name": "Turkish", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "tt": { - "name": "Tatar", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "ug": { - "name": "Uyghur", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "uk": { - "name": "Ukrainian", - "numbers": [ - 1, - 2, - 5 - ], - "plurals": function(n) { return Number(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); } - }, - "ur": { - "name": "Urdu", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "uz": { - "name": "Uzbek", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "vi": { - "name": "Vietnamese", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "wa": { - "name": "Walloon", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n > 1); } - }, - "wo": { - "name": "Wolof", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - }, - "yo": { - "name": "Yoruba", - "numbers": [ - 1, - 2 - ], - "plurals": function(n) { return Number(n != 1); } - }, - "zh": { - "name": "Chinese", - "numbers": [ - 1 - ], - "plurals": function(n) { return 0; } - } - }, - - // for demonstration only sl and ar is added but you can add your own pluralExtensions - addRule: function(lng, obj) { - pluralExtensions.rules[lng] = obj; - }, - - setCurrentLng: function(lng) { - if (!pluralExtensions.currentRule || pluralExtensions.currentRule.lng !== lng) { - var parts = lng.split('-'); - - pluralExtensions.currentRule = { - lng: lng, - rule: pluralExtensions.rules[parts[0]] - }; - } - }, - - get: function(lng, count) { - var parts = lng.split('-'); - - function getResult(l, c) { - var ext; - if (pluralExtensions.currentRule && pluralExtensions.currentRule.lng === lng) { - ext = pluralExtensions.currentRule.rule; - } else { - ext = pluralExtensions.rules[l]; - } - if (ext) { - var i = ext.plurals(c); - var number = ext.numbers[i]; - if (ext.numbers.length === 2 && ext.numbers[0] === 1) { - if (number === 2) { - number = -1; // regular plural - } else if (number === 1) { - number = 1; // singular - } - }//console.log(count + '-' + number); - return number; - } else { - return c === 1 ? '1' : '-1'; - } - } - - return getResult(parts[0], count); - } - - }; - var postProcessors = {}; - var addPostProcessor = function(name, fc) { - postProcessors[name] = fc; - }; - // sprintf support - var sprintf = (function() { - function get_type(variable) { - return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); - } - function str_repeat(input, multiplier) { - for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} - return output.join(''); - } - - var str_format = function() { - if (!str_format.cache.hasOwnProperty(arguments[0])) { - str_format.cache[arguments[0]] = str_format.parse(arguments[0]); - } - return str_format.format.call(null, str_format.cache[arguments[0]], arguments); - }; - - str_format.format = function(parse_tree, argv) { - var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; - for (i = 0; i < tree_length; i++) { - node_type = get_type(parse_tree[i]); - if (node_type === 'string') { - output.push(parse_tree[i]); - } - else if (node_type === 'array') { - match = parse_tree[i]; // convenience purposes only - if (match[2]) { // keyword argument - arg = argv[cursor]; - for (k = 0; k < match[2].length; k++) { - if (!arg.hasOwnProperty(match[2][k])) { - throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); - } - arg = arg[match[2][k]]; - } - } - else if (match[1]) { // positional argument (explicit) - arg = argv[match[1]]; - } - else { // positional argument (implicit) - arg = argv[cursor++]; - } - - if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { - throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); - } - switch (match[8]) { - case 'b': arg = arg.toString(2); break; - case 'c': arg = String.fromCharCode(arg); break; - case 'd': arg = parseInt(arg, 10); break; - case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; - case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; - case 'o': arg = arg.toString(8); break; - case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; - case 'u': arg = Math.abs(arg); break; - case 'x': arg = arg.toString(16); break; - case 'X': arg = arg.toString(16).toUpperCase(); break; - } - arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); - pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; - pad_length = match[6] - String(arg).length; - pad = match[6] ? str_repeat(pad_character, pad_length) : ''; - output.push(match[5] ? arg + pad : pad + arg); - } - } - return output.join(''); - }; - - str_format.cache = {}; - - str_format.parse = function(fmt) { - var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; - while (_fmt) { - if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { - parse_tree.push(match[0]); - } - else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { - parse_tree.push('%'); - } - else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { - if (match[2]) { - arg_names |= 1; - var field_list = [], replacement_field = match[2], field_match = []; - if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { - if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else { - throw('[sprintf] huh?'); - } - } - } - else { - throw('[sprintf] huh?'); - } - match[2] = field_list; - } - else { - arg_names |= 2; - } - if (arg_names === 3) { - throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); - } - parse_tree.push(match); - } - else { - throw('[sprintf] huh?'); - } - _fmt = _fmt.substring(match[0].length); - } - return parse_tree; - }; - - return str_format; - })(); - - var vsprintf = function(fmt, argv) { - argv.unshift(fmt); - return sprintf.apply(null, argv); - }; - - addPostProcessor("sprintf", function(val, key, opts) { - if (!opts.sprintf) return val; - - if (Object.prototype.toString.apply(opts.sprintf) === '[object Array]') { - return vsprintf(val, opts.sprintf); - } else if (typeof opts.sprintf === 'object') { - return sprintf(val, opts.sprintf); - } - - return val; - }); - // public api interface - TAPi18next.init = init; - TAPi18next.setLng = setLng; - TAPi18next.preload = preload; - TAPi18next.addResourceBundle = addResourceBundle; - TAPi18next.removeResourceBundle = removeResourceBundle; - TAPi18next.loadNamespace = loadNamespace; - TAPi18next.loadNamespaces = loadNamespaces; - TAPi18next.setDefaultNamespace = setDefaultNamespace; - TAPi18next.t = translate; - TAPi18next.translate = translate; - TAPi18next.exists = exists; - TAPi18next.detectLanguage = f.detectLanguage; - TAPi18next.pluralExtensions = pluralExtensions; - TAPi18next.sync = sync; - TAPi18next.functions = f; - TAPi18next.lng = lng; - TAPi18next.addPostProcessor = addPostProcessor; - TAPi18next.options = o; -})(); diff --git a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js b/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js deleted file mode 100644 index 8c2010744..000000000 --- a/packages/wekan-tap-i18n/lib/tap_i18next/tap_i18next_init.js +++ /dev/null @@ -1 +0,0 @@ -TAPi18next.init({resStore: {}, fallbackLng: globals.fallback_language, useCookie: false}); diff --git a/packages/wekan-tap-i18n/package.js b/packages/wekan-tap-i18n/package.js deleted file mode 100644 index 3c947c00f..000000000 --- a/packages/wekan-tap-i18n/package.js +++ /dev/null @@ -1,78 +0,0 @@ -Package.describe({ - name: 'wekan-tap-i18n', - summary: 'A comprehensive internationalization solution for Meteor', - version: '1.8.1', - git: 'https://github.com/TAPevents/tap-i18n' -}); - -both = ['server', 'client']; -server = 'server'; -client = 'client'; - -Package.onUse(function (api) { - api.versionsFrom('0.9.4'); - - api.use('coffeescript', both); - api.use('underscore', both); - api.use('meteor', both); - - api.use('raix:eventemitter@0.1.1', both); - api.use('meteorspark:util@0.2.0', both); - - api.use('tracker', both); - api.use('session', client); - api.use('jquery', client); - api.use('templating', client); - - // load TAPi18n - api.addFiles('lib/globals.js', both); - - // load and init TAPi18next - api.addFiles('lib/tap_i18next/tap_i18next-1.7.3.js', both); - api.export('TAPi18next'); - api.addFiles('lib/tap_i18next/tap_i18next_init.js', both); - - api.addFiles('lib/tap_i18n/tap_i18n-helpers.coffee', both); - - // We use the bare option since we need TAPi18n in the package level and - // coffee adds vars to all (so without bare all vars are in the file level) - api.addFiles('lib/tap_i18n/tap_i18n-common.coffee', server); - api.addFiles('lib/tap_i18n/tap_i18n-common.coffee', client, {bare: true}); - - api.addFiles('lib/tap_i18n/tap_i18n-server.coffee', server); - api.addFiles('lib/tap_i18n/tap_i18n-client.coffee', client, {bare: true}); - - api.addFiles('lib/tap_i18n/tap_i18n-init.coffee', server); - api.addFiles('lib/tap_i18n/tap_i18n-init.coffee', client, {bare: true}); - - api.export('TAPi18n'); -}); - -Package.registerBuildPlugin({ - name: 'tap-i18n-compiler', - use: ['coffeescript', 'underscore', 'aldeed:simple-schema@1.3.0', 'check@1.0.3', 'templating'], - npmDependencies: { - "node-json-minify": "0.1.3-a", - "yamljs": "0.2.4" - }, - sources: [ - 'lib/globals.js', - - 'lib/plugin/etc/language_names.js', - - 'lib/plugin/compiler_configuration.coffee', - - 'lib/plugin/helpers/helpers.coffee', - 'lib/plugin/helpers/load_json.coffee', - 'lib/plugin/helpers/load_yml.coffee', - 'lib/plugin/helpers/compile_step_helpers.coffee', - - 'lib/plugin/compilers/share.coffee', - 'lib/plugin/compilers/i18n.coffee', - 'lib/plugin/compilers/project-tap.i18n.coffee', - 'lib/plugin/compilers/package-tap.i18n.coffee', - 'lib/plugin/compilers/i18n.generic_compiler.coffee', - 'lib/plugin/compilers/i18n.json.coffee', - 'lib/plugin/compilers/i18n.yml.coffee' - ] -}); diff --git a/server/migrations.js b/server/migrations.js index 08a5cc72f..cb1c91bee 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; import AccountSettings from '../models/accountSettings'; import TableVisibilityModeSettings from '../models/tableVisibilityModeSettings'; import Actions from '../models/actions'; diff --git a/server/notifications/email.js b/server/notifications/email.js index b696aa90b..301bd471e 100644 --- a/server/notifications/email.js +++ b/server/notifications/email.js @@ -1,3 +1,4 @@ +import { TAPi18n } from '/imports/i18n'; //var nodemailer = require('nodemailer'); // buffer each user's email text in a queue, then flush them in single email diff --git a/server/notifications/outgoing.js b/server/notifications/outgoing.js index 1de7824e6..aa99ff937 100644 --- a/server/notifications/outgoing.js +++ b/server/notifications/outgoing.js @@ -1,3 +1,5 @@ +import { TAPi18n } from '/imports/i18n'; + if (Meteor.isServer) { const postCatchError = Meteor.wrapAsync((url, options, resolve) => { HTTP.post(url, options, (err, res) => { From 4ba2a23c7212d7617e6b3465b222f31af463f270 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Mon, 18 Apr 2022 17:52:31 +0300 Subject: [PATCH 003/246] Cover custom TAPi18n implementation with tests --- imports/i18n/i18n.test.js | 130 ++++++++++++++++++++++++++++++++++++++ tests/main.js | 2 + 2 files changed, 132 insertions(+) create mode 100644 imports/i18n/i18n.test.js diff --git a/imports/i18n/i18n.test.js b/imports/i18n/i18n.test.js new file mode 100644 index 000000000..c51d4a525 --- /dev/null +++ b/imports/i18n/i18n.test.js @@ -0,0 +1,130 @@ +import { Tracker } from 'meteor/tracker'; +import chai, { expect } from 'chai'; +import sinon from 'sinon'; +import { TAPi18n } from './tap'; + +chai.use(require('sinon-chai')); +chai.use(require('chai-as-promised')); + +describe('TAPi18n', () => { + + beforeEach(() => { + sinon.stub(console, 'log'); + }); + + afterEach(() => { + sinon.restore(); + }); + + if (Meteor.isClient) { + it('extra languages are not loaded initially', () => { + // Using function here to prevent Meteor from including the file + // during building time + function path(language) { + return `./data/${language}.i18n.json`; + } + expect(() => require(path('de'))).to.throw('Cannot find module'); + }); + } + + describe('.init', () => { + + it('has default language translation loaded', async () => { + sinon.spy(TAPi18n, 'loadLanguage'); + await TAPi18n.init(); + expect(TAPi18n.loadLanguage).to.be.calledWith('en'); + expect(TAPi18n.getLanguage()).to.be.equal('en'); + expect(TAPi18n.__('accept')).to.be.equal('Accept'); + }); + + }); + + describe('.getSupportedLanguages', () => { + + it('returns an array of objects with expected structure', () => { + const languages = TAPi18n.getSupportedLanguages(); + expect(languages).to.be.an('array'); + for (const language of languages) { + expect(language).to.have.keys('name', 'code', 'isoCode'); + } + }); + + }); + + describe('.getLanguage', () => { + + it('is reactive', async () => { + const tracked = []; + Tracker.autorun(() => { + tracked.push(TAPi18n.getLanguage()); + }); + expect(tracked).to.have.members(['en']); + await TAPi18n.setLanguage('de'); + Tracker.flush(); + expect(tracked).to.have.members(['en', 'de']); + }); + + }); + + describe('.loadLanguage', () => { + + beforeEach(() => { + sinon.stub(TAPi18n.i18n, 'addResourceBundle'); + }); + + it('actually loads the language data', async () => { + await TAPi18n.loadLanguage('fr'); + expect(TAPi18n.i18n.addResourceBundle).to.be.calledOnceWith('fr'); + expect(TAPi18n.i18n.addResourceBundle.firstCall.args[2]).to.have.property('accept'); + }); + + it('does nothing if language is missing', async () => { + await expect(TAPi18n.loadLanguage('miss')).to.be.fulfilled; + expect(TAPi18n.i18n.addResourceBundle).to.not.be.called; + }); + + }); + + describe('.__', () => { + + beforeEach(async () => { + await TAPi18n.init(); + TAPi18n.i18n.addResourceBundle('fr', 'translation', { + 'simple': 'Hello', + 'positional': 'Hello, %s! How is your %s?', + 'named': 'Hello, __whom__! How is your __what__?', + }); + TAPi18n.i18n.changeLanguage('fr'); + }); + + it('works with simple keys', () => { + const result = TAPi18n.__('simple'); + expect(result).to.be.equal('Hello'); + }); + + it('works with simple keys and custom language', async () => { + TAPi18n.i18n.addResourceBundle('de', 'translation', { + 'simple': 'Hola', + }); + const result = TAPi18n.__('simple', null, 'de'); + expect(result).to.be.equal('Hola'); + }); + + it('works with positional parameters', () => { + const result = TAPi18n.__('positional', { + sprintf: ['Josh', 'life'] + }); + expect(result).to.be.equal('Hello, Josh! How is your life?'); + }); + + it('works with named parameters', () => { + const result = TAPi18n.__('named', { + whom: 'Annie', + what: 'job' + }); + expect(result).to.be.equal('Hello, Annie! How is your job?'); + }); + + }); + +}); diff --git a/tests/main.js b/tests/main.js index 648be68c2..1f83ffb5b 100644 --- a/tests/main.js +++ b/tests/main.js @@ -17,6 +17,8 @@ // they are. However, if you want to restict tests to server-only or client-only // you need to wrap them inside a new describe-block +import '/imports/i18n/i18n.test.js'; + if (Meteor.isServer) { describe('server', function() { import '../server/lib/tests/utils.tests'; From eb745106d84c16aaca19ed46bea57f72a74a38f5 Mon Sep 17 00:00:00 2001 From: Jan Dvorak <storyteller@freedombase.net> Date: Wed, 14 Jul 2021 20:06:26 +0200 Subject: [PATCH 004/246] Replace Picker for community packages version & small --- .meteor/packages | 5 ----- .meteor/versions | 1 + models/export.js | 4 ++++ models/exportExcel.js | 1 + models/exportPDF.js | 1 + packages/markdown/package.js | 3 --- sandstorm.js | 6 ++++-- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 2b46496ad..2e35edcb9 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -65,7 +65,6 @@ msavin:usercache # Keep stylus in 1.1.0, because building v2 takes extra 52 minutes. coagmano:stylus@1.1.0! meteorhacks:subs-manager -meteorhacks:picker meteorhacks:aggregate@1.3.0 wekan-markdown konecty:mongo-counter @@ -129,7 +128,3 @@ simple:json-routes kadira:flow-router spacebars communitypackages:picker -useraccounts:core -useraccounts:unstyled -useraccounts:flow-routing -service-configuration diff --git a/.meteor/versions b/.meteor/versions index 1db92d8e4..f597b4666 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -25,6 +25,7 @@ check@1.3.1 coagmano:stylus@1.1.0 coffeescript@2.4.1 coffeescript-compiler@2.4.1 +communitypackages:picker@1.1.0 cottz:publish-relations@2.0.8 dburles:collection-helpers@1.1.0 ddp@1.4.0 diff --git a/models/export.js b/models/export.js index a28f243ef..2bf81261d 100644 --- a/models/export.js +++ b/models/export.js @@ -1,6 +1,10 @@ import { Exporter } from './exporter'; +import { Meteor } from 'meteor/meteor'; + /* global JsonRoutes */ if (Meteor.isServer) { + import { Picker } from 'meteor/communitypackages:picker'; + // todo XXX once we have a real API in place, move that route there // todo XXX also share the route definition between the client and the server // so that we could use something like diff --git a/models/exportExcel.js b/models/exportExcel.js index dabc49526..626734f64 100644 --- a/models/exportExcel.js +++ b/models/exportExcel.js @@ -6,6 +6,7 @@ runOnServer(function() { // it here we use runOnServer to have it inside a function instead of an // if (Meteor.isServer) block import { ExporterExcel } from './server/ExporterExcel'; + import { Picker } from 'meteor/communitypackages:picker'; // todo XXX once we have a real API in place, move that route there // todo XXX also share the route definition between the client and the server diff --git a/models/exportPDF.js b/models/exportPDF.js index eceffc9c9..be76bf301 100644 --- a/models/exportPDF.js +++ b/models/exportPDF.js @@ -6,6 +6,7 @@ runOnServer(function() { // it here we use runOnServer to have it inside a function instead of an // if (Meteor.isServer) block import { ExporterCardPDF } from './server/ExporterCardPDF'; + import { Picker } from 'meteor/communitypackages:picker'; // todo XXX once we have a real API in place, move that route there // todo XXX also share the route definition between the client and the server diff --git a/packages/markdown/package.js b/packages/markdown/package.js index 4405788fb..8263afca5 100644 --- a/packages/markdown/package.js +++ b/packages/markdown/package.js @@ -5,9 +5,6 @@ Package.describe({ git: 'https://github.com/wekan/markdown.git', }); -// Before Meteor 0.9? -if(!Package.onUse) Package.onUse = Package.on_use; - Package.onUse(function (api) { if(api.versionsFrom) api.versionsFrom('1.8.2'); diff --git a/sandstorm.js b/sandstorm.js index de386d149..1b9a908b1 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -1,7 +1,9 @@ +import { Meteor } from 'meteor/meteor'; +import { Picker } from 'meteor/communitypackages:picker'; + // Sandstorm context is detected using the METEOR_SETTINGS environment variable // in the package definition. -const isSandstorm = - Meteor.settings && Meteor.settings.public && Meteor.settings.public.sandstorm; +const isSandstorm = Meteor.settings?.public?.sandstorm; // In sandstorm we only have one board per sandstorm instance. Since we want to // keep most of our code unchanged, we simply hard-code a board `_id` and From 2b9f555f316ef8c5fa064a9d910b70374a308d50 Mon Sep 17 00:00:00 2001 From: Jan Dvorak <storyteller@freedombase.net> Date: Wed, 14 Jul 2021 20:22:10 +0200 Subject: [PATCH 005/246] Update Blaze components --- .meteor/packages | 2 +- .meteor/versions | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 2e35edcb9..e5d143925 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -51,7 +51,7 @@ fortawesome:fontawesome mousetrap:mousetrap mquandalle:jquery-textcomplete mquandalle:mousetrap-bindglobal -peerlibrary:blaze-components@=0.15.1 +peerlibrary:blaze-components templates:tabs meteor-autosize rajit:bootstrap3-datepicker diff --git a/.meteor/versions b/.meteor/versions index f597b4666..edcbcd249 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -110,8 +110,9 @@ ostrio:i18n@3.1.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 peerlibrary:base-component@0.17.1 -peerlibrary:blaze-components@0.15.1 +peerlibrary:blaze-components@0.23.0 peerlibrary:computed-field@0.10.0 +peerlibrary:data-lookup@0.3.0 peerlibrary:reactive-field@0.6.0 percolate:synced-cron@1.3.2 practicalmeteor:mocha-core@1.0.1 From c696c8eed02cffb9d4b972b86ca5e81660ca5e11 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Tue, 17 Aug 2021 21:35:56 +0300 Subject: [PATCH 006/246] Updated dependencies. --- .meteor/packages | 13 +- .meteor/release | 2 +- .meteor/versions | 37 +-- package-lock.json | 579 +++++++++++++++++++++++++++------------------- package.json | 10 +- 5 files changed, 379 insertions(+), 262 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index e5d143925..5a3b94697 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -6,9 +6,9 @@ meteor-base@1.5.1 # Build system -ecmascript@0.15.2 -standard-minifier-css@1.7.3 -standard-minifier-js@2.6.1 +ecmascript@0.15.3 +standard-minifier-css@1.7.4 +standard-minifier-js@2.7.0 mquandalle:jade coffeescript@2.4.1! @@ -21,7 +21,7 @@ cottz:publish-relations dburles:collection-helpers idmontie:migrations matteodem:easy-search -mongo@1.12.0 +mongo@1.13.0 mquandalle:collection-mutations # Account system @@ -56,7 +56,7 @@ templates:tabs meteor-autosize rajit:bootstrap3-datepicker shell-server@0.5.0 -email@2.1.1 +email@2.2.0 horka:swipebox dynamic-import@0.7.1 rzymek:fullcalendar @@ -128,3 +128,6 @@ simple:json-routes kadira:flow-router spacebars communitypackages:picker +useraccounts:core +useraccounts:flow-routing +useraccounts:unstyled diff --git a/.meteor/release b/.meteor/release index ebaaa330b..e68993d45 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.3.4 +METEOR@2.4 diff --git a/.meteor/versions b/.meteor/versions index edcbcd249..be5c352b3 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,5 +1,5 @@ -accounts-base@2.0.1 -accounts-password@2.0.0 +accounts-base@2.1.0 +accounts-password@2.1.0 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 aldeed:schema-deny@1.1.0 @@ -9,7 +9,7 @@ allow-deny@1.1.0 arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 autoupdate@1.7.0 -babel-compiler@7.6.2 +babel-compiler@7.7.0 babel-runtime@1.5.0 base64@1.0.12 binary-heap@1.0.11 @@ -21,6 +21,7 @@ browser-policy-framing@1.1.0 caching-compiler@1.2.2 caching-html-compiler@1.2.1 callback-hook@1.4.0 +cfs:http-methods@0.0.32 check@1.3.1 coagmano:stylus@1.1.0 coffeescript@2.4.1 @@ -32,17 +33,17 @@ ddp@1.4.0 ddp-client@2.5.0 ddp-common@1.4.0 ddp-rate-limiter@1.1.0 -ddp-server@2.4.0 +ddp-server@2.5.0 deps@1.0.12 diff-sequence@1.1.1 dynamic-import@0.7.1 easylogic:summernote@0.8.8 -ecmascript@0.15.2 -ecmascript-runtime@0.7.0 -ecmascript-runtime-client@0.11.1 -ecmascript-runtime-server@0.10.1 +ecmascript@0.15.3 +ecmascript-runtime@0.8.0 +ecmascript-runtime-client@0.12.1 +ecmascript-runtime-server@0.11.0 ejson@1.1.1 -email@2.1.1 +email@2.2.0 es5-shim@4.8.0 fastclick@1.0.13 fetch@0.1.1 @@ -65,11 +66,11 @@ launch-screen@1.3.0 livedata@1.0.18 lmieulet:meteor-coverage@1.1.4 localstorage@1.2.0 -logging@1.2.0 +logging@1.3.1 matb33:collection-hooks@1.1.0 matteodem:easy-search@1.6.4 mdg:validation-error@0.5.1 -meteor@1.9.3 +meteor@1.10.0 meteor-autosize@5.0.1 meteor-base@1.5.1 meteor-platform@1.2.6 @@ -79,16 +80,16 @@ meteorhacks:picker@1.0.3 meteorhacks:subs-manager@1.6.4 meteortesting:browser-tests@0.2.0 meteortesting:mocha@0.6.0 -minifier-css@1.5.4 -minifier-js@2.6.1 +minifier-css@1.6.0 +minifier-js@2.7.1 minifiers@1.1.8-faster-rebuild.0 minimongo@1.7.0 mobile-status-bar@1.1.0 -modern-browsers@0.1.5 -modules@0.16.0 +modern-browsers@0.1.7 +modules@0.17.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 -mongo@1.12.0 +mongo@1.13.0 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -177,11 +178,11 @@ reload@1.3.1 retry@1.1.0 routepolicy@1.1.1 rzymek:fullcalendar@3.8.0 -service-configuration@1.1.0 +service-configuration@1.2.0 session@1.2.0 sha@1.0.9 shell-server@0.5.0 -simple:json-routes@2.1.0 +simple:json-routes@2.3.0 socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 diff --git a/package-lock.json b/package-lock.json index b34180672..3eefce23d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,19 +18,19 @@ "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" }, "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -40,89 +40,113 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "requires": { - "@babel/types": "^7.16.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "requires": { - "@babel/compat-data": "^7.16.0", + "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", + "browserslist": "^4.16.6", "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + }, + "electron-to-chromium": { + "version": "1.4.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", + "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==" + } } }, "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-plugin-utils": { @@ -132,30 +156,30 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { @@ -169,13 +193,13 @@ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helpers": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", - "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { @@ -189,50 +213,50 @@ } }, "@babel/parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", - "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==" + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==" }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/traverse": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", - "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -607,18 +631,6 @@ "concat-map": "0.0.1" } }, - "browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", - "requires": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, "bson": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.4.tgz", @@ -682,11 +694,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001279", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", - "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==" - }, "chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", @@ -1522,11 +1529,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "electron-to-chromium": { - "version": "1.3.894", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.894.tgz", - "integrity": "sha512-WY8pA4irAZ4cm/Pr7YFPtPLVqj3nU6d0SbfoHF6M7HZNONfPdAnYAarumqQ75go2LuN72uO9wGuCEqnfya/ytg==" - }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2288,7 +2290,8 @@ "dependencies": { "asn1.js": { "version": "5.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -2298,13 +2301,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "assert": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "requires": { "es6-object-assign": "^1.1.0", "is-nan": "^1.2.1", @@ -2314,23 +2319,28 @@ }, "available-typed-arrays": { "version": "1.0.4", - "bundled": true + "resolved": false, + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" }, "base64-js": { "version": "1.5.1", - "bundled": true + "resolved": false, + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bn.js": { "version": "5.2.0", - "bundled": true + "resolved": false, + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "brorand": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browserify-aes": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -2342,7 +2352,8 @@ }, "browserify-cipher": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -2351,7 +2362,8 @@ }, "browserify-des": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -2361,7 +2373,8 @@ }, "browserify-rsa": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -2369,7 +2382,8 @@ }, "browserify-sign": { "version": "4.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -2384,14 +2398,16 @@ }, "browserify-zlib": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "~1.0.5" } }, "buffer": { "version": "6.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2399,15 +2415,18 @@ }, "buffer-xor": { "version": "1.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-status-codes": { "version": "3.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "call-bind": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2415,7 +2434,8 @@ }, "cipher-base": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2423,15 +2443,18 @@ }, "console-browserify": { "version": "1.2.0", - "bundled": true + "resolved": false, + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "constants-browserify": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "create-ecdh": { "version": "4.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -2439,13 +2462,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "create-hash": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -2456,7 +2481,8 @@ }, "create-hmac": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -2468,7 +2494,8 @@ }, "crypto-browserify": { "version": "3.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -2485,14 +2512,16 @@ }, "define-properties": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { "object-keys": "^1.0.12" } }, "des.js": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -2500,7 +2529,8 @@ }, "diffie-hellman": { "version": "5.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -2509,17 +2539,20 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "domain-browser": { "version": "4.19.0", - "bundled": true + "resolved": false, + "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" }, "elliptic": { "version": "6.5.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -2532,13 +2565,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "es-abstract": { "version": "1.18.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -2560,7 +2595,8 @@ }, "es-to-primitive": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2569,15 +2605,18 @@ }, "es6-object-assign": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" }, "events": { "version": "3.3.0", - "bundled": true + "resolved": false, + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "evp_bytestokey": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -2585,15 +2624,18 @@ }, "foreach": { "version": "2.0.5", - "bundled": true + "resolved": false, + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "function-bind": { "version": "1.1.1", - "bundled": true + "resolved": false, + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "get-intrinsic": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -2602,22 +2644,26 @@ }, "has": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" }, "has-symbols": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "hash-base": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -2626,7 +2672,8 @@ }, "hash.js": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -2634,7 +2681,8 @@ }, "hmac-drbg": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -2643,49 +2691,59 @@ }, "https-browserify": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "ieee754": { "version": "1.2.1", - "bundled": true + "resolved": false, + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "inherits": { "version": "2.0.4", - "bundled": true + "resolved": false, + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "is-arguments": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", "requires": { "call-bind": "^1.0.0" } }, "is-bigint": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" }, "is-boolean-object": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "requires": { "call-bind": "^1.0.2" } }, "is-callable": { "version": "1.2.3", - "bundled": true + "resolved": false, + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-date-object": { "version": "1.0.4", - "bundled": true + "resolved": false, + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" }, "is-generator-function": { "version": "1.0.9", - "bundled": true + "resolved": false, + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" }, "is-nan": { "version": "1.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -2693,15 +2751,18 @@ }, "is-negative-zero": { "version": "2.0.1", - "bundled": true + "resolved": false, + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number-object": { "version": "1.0.5", - "bundled": true + "resolved": false, + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" }, "is-regex": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "requires": { "call-bind": "^1.0.2", "has-symbols": "^1.0.2" @@ -2709,18 +2770,21 @@ }, "is-string": { "version": "1.0.6", - "bundled": true + "resolved": false, + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" }, "is-symbol": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", "requires": { "available-typed-arrays": "^1.0.2", "call-bind": "^1.0.2", @@ -2731,7 +2795,8 @@ }, "md5.js": { "version": "1.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -2740,7 +2805,8 @@ }, "miller-rabin": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -2748,25 +2814,30 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "minimalistic-assert": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "object-inspect": { "version": "1.10.3", - "bundled": true + "resolved": false, + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" }, "object-is": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -2774,11 +2845,13 @@ }, "object-keys": { "version": "1.1.1", - "bundled": true + "resolved": false, + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -2788,15 +2861,18 @@ }, "os-browserify": { "version": "0.3.0", - "bundled": true + "resolved": false, + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "pako": { "version": "1.0.11", - "bundled": true + "resolved": false, + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parse-asn1": { "version": "5.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -2807,11 +2883,13 @@ }, "path-browserify": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "pbkdf2": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -2822,11 +2900,13 @@ }, "process": { "version": "0.11.10", - "bundled": true + "resolved": false, + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "public-encrypt": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -2838,32 +2918,38 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "bundled": true + "resolved": false, + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "punycode": { "version": "2.1.1", - "bundled": true + "resolved": false, + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "querystring": { "version": "0.2.0", - "bundled": true + "resolved": false, + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", - "bundled": true + "resolved": false, + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "randombytes": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -2871,7 +2957,8 @@ }, "readable-stream": { "version": "3.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2880,7 +2967,8 @@ }, "ripemd160": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -2888,19 +2976,23 @@ }, "safe-buffer": { "version": "5.2.1", - "bundled": true + "resolved": false, + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "setimmediate": { "version": "1.0.5", - "bundled": true + "resolved": false, + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "sha.js": { "version": "2.4.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2908,7 +3000,8 @@ }, "stream-browserify": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -2916,7 +3009,8 @@ }, "stream-http": { "version": "3.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -2926,7 +3020,8 @@ }, "string.prototype.trimend": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -2934,7 +3029,8 @@ }, "string.prototype.trimstart": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -2942,25 +3038,29 @@ }, "string_decoder": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" } }, "timers-browserify": { "version": "2.0.12", - "bundled": true, + "resolved": false, + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } }, "tty-browserify": { "version": "0.0.1", - "bundled": true + "resolved": false, + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, "unbox-primitive": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -2970,7 +3070,8 @@ }, "url": { "version": "0.11.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -2978,13 +3079,15 @@ "dependencies": { "punycode": { "version": "1.3.2", - "bundled": true + "resolved": false, + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, "util": { "version": "0.12.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -2996,15 +3099,18 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "vm-browserify": { "version": "1.1.2", - "bundled": true + "resolved": false, + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "which-boxed-primitive": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -3015,7 +3121,8 @@ }, "which-typed-array": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", "requires": { "available-typed-arrays": "^1.0.2", "call-bind": "^1.0.0", @@ -3028,7 +3135,8 @@ }, "xtend": { "version": "4.0.2", - "bundled": true + "resolved": false, + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" } } }, @@ -3151,6 +3259,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, + "nodemailer": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", + "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 32c03530a..cc6b428f5 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ "sinon": "^11.1.2" }, "dependencies": { - "@babel/core": "^7.15.0", - "@babel/runtime": "^7.15.3", + "@babel/core": "^7.15.5", + "@babel/runtime": "^7.15.4", "@wekanteam/markdown-it-mermaid": "^0.5.2", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", - "bson": "^4.4.1", + "bson": "^4.5.2", "bunyan": "^1.8.15", "chai-as-promised": "^7.1.1", "core-js": "^3.18.2", @@ -49,14 +49,14 @@ "meteor-node-stubs": "^1.1.0", "moment": "^2.29.1", "mongodb": "^3.7.3", + "nodemailer": "^6.6.3", "os": "^0.1.2", "page": "^1.11.5", "papaparse": "^5.3.1", "qs": "^6.10.1", "simpl-schema": "^1.12.0", "sinon-chai": "^3.7.0", - "source-map-support": "^0.5.20", - "uuid": "^8.3.2" + "source-map-support": "^0.5.20" }, "meteor": { "testModule": "tests/main.js" From 4bbe63365c99321446dcbd357edf6854574f3414 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 20 Sep 2021 21:56:15 +0300 Subject: [PATCH 007/246] Fix typos. --- .tx/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tx/config b/.tx/config index c149eb7ef..dd5754a34 100644 --- a/.tx/config +++ b/.tx/config @@ -42,7 +42,7 @@ host = https://www.transifex.com lang_map = ar_EG:ar-EG, bg_BG:bg, de_AT:de-AT, de_CH:de-CH, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, gl_ES:gl-ES, gu_IN:gu-IN, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK [wekan.application] -file_filter = i18n/<lang>.i18n.json +file_filter = public/i18n/<lang>.i18n.json source_lang = en type = KEYVALUEJSON From c926475eb1f4a55d01cd512f2413c091d353a0d9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 9 Oct 2021 15:56:16 +0300 Subject: [PATCH 008/246] Fixed _ensureIndex to createIndex for MongoDB 5. Updated to latest Meteor beta. --- .meteor/packages | 6 +++--- .meteor/release | 2 +- .meteor/versions | 14 +++++++------- models/accountSettings.js | 2 +- models/actions.js | 2 +- models/activities.js | 14 +++++++------- models/announcements.js | 2 +- models/attachments.js | 2 +- models/boards.js | 6 +++--- models/cardCommentReactions.js | 2 +- models/cardComments.js | 4 ++-- models/cards.js | 6 +++--- models/checklistItems.js | 6 +++--- models/checklists.js | 4 ++-- models/customFields.js | 4 ++-- models/integrations.js | 4 ++-- models/invitationCodes.js | 2 +- models/lists.js | 6 +++--- models/org.js | 4 ++-- models/orgUser.js | 4 ++-- models/rules.js | 2 +- models/settings.js | 2 +- models/swimlanes.js | 4 ++-- models/tableVisibilityModeSettings.js | 2 +- models/team.js | 2 +- models/triggers.js | 2 +- models/unsavedEdits.js | 4 ++-- models/users.js | 6 +++--- package-lock.json | 11 ++++++++--- 29 files changed, 68 insertions(+), 63 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 5a3b94697..05cab0c45 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -6,9 +6,9 @@ meteor-base@1.5.1 # Build system -ecmascript@0.15.3 +ecmascript@0.16.0-beta250.3 standard-minifier-css@1.7.4 -standard-minifier-js@2.7.0 +standard-minifier-js@2.7.1 mquandalle:jade coffeescript@2.4.1! @@ -122,7 +122,7 @@ pascoual:pdfkit lmieulet:meteor-coverage meteortesting:mocha aldeed:simple-schema -accounts-password +accounts-password@2.2.0-beta250.3 matb33:collection-hooks simple:json-routes kadira:flow-router diff --git a/.meteor/release b/.meteor/release index e68993d45..5eaeaf017 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.4 +METEOR@2.5-beta.3 diff --git a/.meteor/versions b/.meteor/versions index be5c352b3..b31373b82 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,5 +1,5 @@ -accounts-base@2.1.0 -accounts-password@2.1.0 +accounts-base@2.2.0-beta250.3 +accounts-password@2.2.0-beta250.3 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 aldeed:schema-deny@1.1.0 @@ -8,7 +8,7 @@ aldeed:simple-schema@1.5.4 allow-deny@1.1.0 arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 -autoupdate@1.7.0 +autoupdate@1.8.0-beta250.3 babel-compiler@7.7.0 babel-runtime@1.5.0 base64@1.0.12 @@ -38,7 +38,7 @@ deps@1.0.12 diff-sequence@1.1.1 dynamic-import@0.7.1 easylogic:summernote@0.8.8 -ecmascript@0.15.3 +ecmascript@0.16.0-beta250.3 ecmascript-runtime@0.8.0 ecmascript-runtime-client@0.12.1 ecmascript-runtime-server@0.11.0 @@ -171,14 +171,14 @@ rajit:bootstrap3-datepicker-zh-cn@1.7.1 rajit:bootstrap3-datepicker-zh-tw@1.7.1 random@1.2.0 rate-limit@1.0.9 -react-fast-refresh@0.1.1 +react-fast-refresh@0.2.0-beta250.3 reactive-dict@1.3.0 reactive-var@1.0.11 reload@1.3.1 retry@1.1.0 routepolicy@1.1.1 rzymek:fullcalendar@3.8.0 -service-configuration@1.2.0 +service-configuration@1.3.0-beta250.3 session@1.2.0 sha@1.0.9 shell-server@0.5.0 @@ -201,7 +201,7 @@ url@1.3.2 useraccounts:core@1.16.2 useraccounts:flow-routing@1.15.0 useraccounts:unstyled@1.14.2 -webapp@1.13.0 +webapp@1.13.0-beta250.3 webapp-hashing@1.1.0 wekan-markdown@1.0.9 zimme:active-route@2.3.2 diff --git a/models/accountSettings.js b/models/accountSettings.js index a20303f5c..830b531ac 100644 --- a/models/accountSettings.js +++ b/models/accountSettings.js @@ -51,7 +51,7 @@ AccountSettings.allow({ if (Meteor.isServer) { Meteor.startup(() => { - AccountSettings._collection._ensureIndex({ modifiedAt: -1 }); + AccountSettings._collection.createIndex({ modifiedAt: -1 }); AccountSettings.upsert( { _id: 'accounts-allowEmailChange' }, { diff --git a/models/actions.js b/models/actions.js index 8995d1015..20bc4a869 100644 --- a/models/actions.js +++ b/models/actions.js @@ -32,7 +32,7 @@ Actions.helpers({ if (Meteor.isServer) { Meteor.startup(() => { - Actions._collection._ensureIndex({ modifiedAt: -1 }); + Actions._collection.createIndex({ modifiedAt: -1 }); }); } diff --git a/models/activities.js b/models/activities.js index c59488a87..fd456cbbf 100644 --- a/models/activities.js +++ b/models/activities.js @@ -82,19 +82,19 @@ if (Meteor.isServer) { // creation in conjunction with the card or board id, as corresponding views // are largely used in the App. See #524. Meteor.startup(() => { - Activities._collection._ensureIndex({ createdAt: -1 }); - Activities._collection._ensureIndex({ modifiedAt: -1 }); - Activities._collection._ensureIndex({ cardId: 1, createdAt: -1 }); - Activities._collection._ensureIndex({ boardId: 1, createdAt: -1 }); - Activities._collection._ensureIndex( + Activities._collection.createIndex({ createdAt: -1 }); + Activities._collection.createIndex({ modifiedAt: -1 }); + Activities._collection.createIndex({ cardId: 1, createdAt: -1 }); + Activities._collection.createIndex({ boardId: 1, createdAt: -1 }); + Activities._collection.createIndex( { commentId: 1 }, { partialFilterExpression: { commentId: { $exists: true } } }, ); - Activities._collection._ensureIndex( + Activities._collection.createIndex( { attachmentId: 1 }, { partialFilterExpression: { attachmentId: { $exists: true } } }, ); - Activities._collection._ensureIndex( + Activities._collection.createIndex( { customFieldId: 1 }, { partialFilterExpression: { customFieldId: { $exists: true } } }, ); diff --git a/models/announcements.js b/models/announcements.js index 7fdf8d8bd..f21393673 100644 --- a/models/announcements.js +++ b/models/announcements.js @@ -56,7 +56,7 @@ Announcements.allow({ if (Meteor.isServer) { Meteor.startup(() => { - Announcements._collection._ensureIndex({ modifiedAt: -1 }); + Announcements._collection.createIndex({ modifiedAt: -1 }); const announcements = Announcements.findOne({}); if (!announcements) { Announcements.insert({ enabled: false, sort: 0 }); diff --git a/models/attachments.js b/models/attachments.js index 681d85b7f..451ff90d6 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -186,7 +186,7 @@ Attachments = new FS.Collection('attachments', { if (Meteor.isServer) { Meteor.startup(() => { - Attachments.files._ensureIndex({ cardId: 1 }); + Attachments.files.createIndex({ cardId: 1 }); }); Attachments.allow({ diff --git a/models/boards.js b/models/boards.js index 582d04789..825444a02 100644 --- a/models/boards.js +++ b/models/boards.js @@ -1696,15 +1696,15 @@ Boards.before.insert((userId, doc) => { if (Meteor.isServer) { // Let MongoDB ensure that a member is not included twice in the same board Meteor.startup(() => { - Boards._collection._ensureIndex({ modifiedAt: -1 }); - Boards._collection._ensureIndex( + Boards._collection.createIndex({ modifiedAt: -1 }); + Boards._collection.createIndex( { _id: 1, 'members.userId': 1, }, { unique: true }, ); - Boards._collection._ensureIndex({ 'members.userId': 1 }); + Boards._collection.createIndex({ 'members.userId': 1 }); }); // Genesis: the first activity of the newly created board diff --git a/models/cardCommentReactions.js b/models/cardCommentReactions.js index 300458583..17c2a1236 100644 --- a/models/cardCommentReactions.js +++ b/models/cardCommentReactions.js @@ -54,6 +54,6 @@ CardCommentReactions.allow({ if (Meteor.isServer) { Meteor.startup(() => { - CardCommentReactions._collection._ensureIndex({ cardCommentId: 1 }, { unique: true }); + CardCommentReactions._collection.createIndex({ cardCommentId: 1 }, { unique: true }); }); } diff --git a/models/cardComments.js b/models/cardComments.js index f8c860704..0ac5984fe 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -178,8 +178,8 @@ if (Meteor.isServer) { // Comments are often fetched within a card, so we create an index to make these // queries more efficient. Meteor.startup(() => { - CardComments._collection._ensureIndex({ modifiedAt: -1 }); - CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); + CardComments._collection.createIndex({ modifiedAt: -1 }); + CardComments._collection.createIndex({ cardId: 1, createdAt: -1 }); }); CardComments.after.insert((userId, doc) => { diff --git a/models/cards.js b/models/cards.js index c17bc546a..c95665934 100644 --- a/models/cards.js +++ b/models/cards.js @@ -2991,14 +2991,14 @@ if (Meteor.isServer) { // Cards are often fetched within a board, so we create an index to make these // queries more efficient. Meteor.startup(() => { - Cards._collection._ensureIndex({ modifiedAt: -1 }); - Cards._collection._ensureIndex({ boardId: 1, createdAt: -1 }); + Cards._collection.createIndex({ modifiedAt: -1 }); + Cards._collection.createIndex({ boardId: 1, createdAt: -1 }); // https://github.com/wekan/wekan/issues/1863 // Swimlane added a new field in the cards collection of mongodb named parentId. // When loading a board, mongodb is searching for every cards, the id of the parent (in the swinglanes collection). // With a huge database, this result in a very slow app and high CPU on the mongodb side. // To correct it, add Index to parentId: - Cards._collection._ensureIndex({ parentId: 1 }); + Cards._collection.createIndex({ parentId: 1 }); // let notifydays = parseInt(process.env.NOTIFY_DUE_DAYS_BEFORE_AND_AFTER) || 2; // default as 2 days b4 and after // let notifyitvl = parseInt(process.env.NOTIFY_DUE_AT_HOUR_OF_DAY) || 3600 * 24 * 1e3; // default interval as one day // Meteor.call("findDueCards",notifydays,notifyitvl); diff --git a/models/checklistItems.js b/models/checklistItems.js index ebd823ea7..e9ad17c44 100644 --- a/models/checklistItems.js +++ b/models/checklistItems.js @@ -213,9 +213,9 @@ function publishChekListUncompleted(userId, doc) { // Activities if (Meteor.isServer) { Meteor.startup(() => { - ChecklistItems._collection._ensureIndex({ modifiedAt: -1 }); - ChecklistItems._collection._ensureIndex({ checklistId: 1 }); - ChecklistItems._collection._ensureIndex({ cardId: 1 }); + ChecklistItems._collection.createIndex({ modifiedAt: -1 }); + ChecklistItems._collection.createIndex({ checklistId: 1 }); + ChecklistItems._collection.createIndex({ cardId: 1 }); }); ChecklistItems.after.update((userId, doc, fieldNames) => { diff --git a/models/checklists.js b/models/checklists.js index c9448293e..e974ffef7 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -195,8 +195,8 @@ Checklists.mutations({ if (Meteor.isServer) { Meteor.startup(() => { - Checklists._collection._ensureIndex({ modifiedAt: -1 }); - Checklists._collection._ensureIndex({ cardId: 1, createdAt: 1 }); + Checklists._collection.createIndex({ modifiedAt: -1 }); + Checklists._collection.createIndex({ cardId: 1, createdAt: 1 }); }); Checklists.after.insert((userId, doc) => { diff --git a/models/customFields.js b/models/customFields.js index 90e199ad2..c4098e498 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -231,8 +231,8 @@ function customFieldEdit(userId, doc) { if (Meteor.isServer) { Meteor.startup(() => { - CustomFields._collection._ensureIndex({ modifiedAt: -1 }); - CustomFields._collection._ensureIndex({ boardIds: 1 }); + CustomFields._collection.createIndex({ modifiedAt: -1 }); + CustomFields._collection.createIndex({ boardIds: 1 }); }); CustomFields.after.insert((userId, doc) => { diff --git a/models/integrations.js b/models/integrations.js index dbf53b8e2..704f66a3e 100644 --- a/models/integrations.js +++ b/models/integrations.js @@ -121,8 +121,8 @@ Integrations.allow({ //INTEGRATIONS REST API if (Meteor.isServer) { Meteor.startup(() => { - Integrations._collection._ensureIndex({ modifiedAt: -1 }); - Integrations._collection._ensureIndex({ boardId: 1 }); + Integrations._collection.createIndex({ modifiedAt: -1 }); + Integrations._collection.createIndex({ boardId: 1 }); }); /** diff --git a/models/invitationCodes.js b/models/invitationCodes.js index abb30f328..501838b86 100644 --- a/models/invitationCodes.js +++ b/models/invitationCodes.js @@ -65,7 +65,7 @@ InvitationCodes.helpers({ if (Meteor.isServer) { Meteor.startup(() => { - InvitationCodes._collection._ensureIndex({ modifiedAt: -1 }); + InvitationCodes._collection.createIndex({ modifiedAt: -1 }); }); Boards.deny({ fetch: ['members'], diff --git a/models/lists.js b/models/lists.js index 8fe336e79..80e0914dc 100644 --- a/models/lists.js +++ b/models/lists.js @@ -415,9 +415,9 @@ Lists.hookOptions.after.update = { fetchPrevious: false }; if (Meteor.isServer) { Meteor.startup(() => { - Lists._collection._ensureIndex({ modifiedAt: -1 }); - Lists._collection._ensureIndex({ boardId: 1 }); - Lists._collection._ensureIndex({ archivedAt: -1 }); + Lists._collection.createIndex({ modifiedAt: -1 }); + Lists._collection.createIndex({ boardId: 1 }); + Lists._collection.createIndex({ archivedAt: -1 }); }); Lists.after.insert((userId, doc) => { diff --git a/models/org.js b/models/org.js index 14c8b0440..aba4df3db 100644 --- a/models/org.js +++ b/models/org.js @@ -218,8 +218,8 @@ if (Meteor.isServer) { if (Meteor.isServer) { // Index for Organization name. Meteor.startup(() => { - // Org._collection._ensureIndex({ name: -1 }); - Org._collection._ensureIndex({ orgDisplayName: 1 }); + // Org._collection.createIndex({ name: -1 }); + Org._collection.createIndex({ orgDisplayName: 1 }); }); } diff --git a/models/orgUser.js b/models/orgUser.js index f310fa9ce..026cbdbcf 100644 --- a/models/orgUser.js +++ b/models/orgUser.js @@ -74,8 +74,8 @@ OrgUser.attachSchema( if (Meteor.isServer) { // Index for Organization User. Meteor.startup(() => { - OrgUser._collection._ensureIndex({ orgId: -1 }); - OrgUser._collection._ensureIndex({ orgId: -1, userId: -1 }); + OrgUser._collection.createIndex({ orgId: -1 }); + OrgUser._collection.createIndex({ orgId: -1, userId: -1 }); }); } diff --git a/models/rules.js b/models/rules.js index d82bf9270..b9d5b2a54 100644 --- a/models/rules.js +++ b/models/rules.js @@ -87,7 +87,7 @@ Rules.allow({ if (Meteor.isServer) { Meteor.startup(() => { - Rules._collection._ensureIndex({ modifiedAt: -1 }); + Rules._collection.createIndex({ modifiedAt: -1 }); }); } diff --git a/models/settings.js b/models/settings.js index e24804c3c..f3a868eb4 100644 --- a/models/settings.js +++ b/models/settings.js @@ -147,7 +147,7 @@ Settings.allow({ if (Meteor.isServer) { Meteor.startup(() => { - Settings._collection._ensureIndex({ modifiedAt: -1 }); + Settings._collection.createIndex({ modifiedAt: -1 }); const setting = Settings.findOne({}); if (!setting) { const now = new Date(); diff --git a/models/swimlanes.js b/models/swimlanes.js index 1378876c8..30384a860 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -331,8 +331,8 @@ Swimlanes.hookOptions.after.update = { fetchPrevious: false }; if (Meteor.isServer) { Meteor.startup(() => { - Swimlanes._collection._ensureIndex({ modifiedAt: -1 }); - Swimlanes._collection._ensureIndex({ boardId: 1 }); + Swimlanes._collection.createIndex({ modifiedAt: -1 }); + Swimlanes._collection.createIndex({ boardId: 1 }); }); Swimlanes.after.insert((userId, doc) => { diff --git a/models/tableVisibilityModeSettings.js b/models/tableVisibilityModeSettings.js index c438137aa..483d32371 100644 --- a/models/tableVisibilityModeSettings.js +++ b/models/tableVisibilityModeSettings.js @@ -51,7 +51,7 @@ TableVisibilityModeSettings.allow({ if (Meteor.isServer) { Meteor.startup(() => { - TableVisibilityModeSettings._collection._ensureIndex({ modifiedAt: -1 }); + TableVisibilityModeSettings._collection.createIndex({ modifiedAt: -1 }); TableVisibilityModeSettings.upsert( { _id: 'tableVisibilityMode-allowPrivateOnly' }, { diff --git a/models/team.js b/models/team.js index 18ce8574c..698a536f3 100644 --- a/models/team.js +++ b/models/team.js @@ -216,7 +216,7 @@ if (Meteor.isServer) { if (Meteor.isServer) { // Index for Team name. Meteor.startup(() => { - Team._collection._ensureIndex({ teamDisplayName: 1 }); + Team._collection.createIndex({ teamDisplayName: 1 }); }); } diff --git a/models/triggers.js b/models/triggers.js index a95b1235b..3314fd2d7 100644 --- a/models/triggers.js +++ b/models/triggers.js @@ -70,7 +70,7 @@ Triggers.helpers({ if (Meteor.isServer) { Meteor.startup(() => { - Triggers._collection._ensureIndex({ modifiedAt: -1 }); + Triggers._collection.createIndex({ modifiedAt: -1 }); }); } diff --git a/models/unsavedEdits.js b/models/unsavedEdits.js index 813315982..a74de60d2 100644 --- a/models/unsavedEdits.js +++ b/models/unsavedEdits.js @@ -56,8 +56,8 @@ if (Meteor.isServer) { return userId === doc.userId && fieldNames.indexOf('userId') === -1; } Meteor.startup(() => { - UnsavedEditCollection._collection._ensureIndex({ modifiedAt: -1 }); - UnsavedEditCollection._collection._ensureIndex({ userId: 1 }); + UnsavedEditCollection._collection.createIndex({ modifiedAt: -1 }); + UnsavedEditCollection._collection.createIndex({ userId: 1 }); }); UnsavedEditCollection.allow({ insert: isAuthor, diff --git a/models/users.js b/models/users.js index b42f6fe39..2e336f668 100644 --- a/models/users.js +++ b/models/users.js @@ -1661,12 +1661,12 @@ if (Meteor.isServer) { // Let mongoDB ensure username unicity Meteor.startup(() => { allowedSortValues.forEach((value) => { - Lists._collection._ensureIndex(value); + Lists._collection.createIndex(value); }); - Users._collection._ensureIndex({ + Users._collection.createIndex({ modifiedAt: -1, }); - Users._collection._ensureIndex( + Users._collection.createIndex( { username: 1, }, diff --git a/package-lock.json b/package-lock.json index 3eefce23d..ad3b07760 100644 --- a/package-lock.json +++ b/package-lock.json @@ -535,6 +535,11 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -838,9 +843,9 @@ } }, "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", + "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==" }, "core-util-is": { "version": "1.0.2", From 3c39953b422b2fbe3504c84362d29650ad0e6717 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 9 Oct 2021 16:11:19 +0300 Subject: [PATCH 009/246] Commented out extra index because of IndexOptionsConflict. Thanks to xet7 ! --- models/users.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/users.js b/models/users.js index 2e336f668..ac7faee48 100644 --- a/models/users.js +++ b/models/users.js @@ -1666,6 +1666,7 @@ if (Meteor.isServer) { Users._collection.createIndex({ modifiedAt: -1, }); +/* Commented out extra index because of IndexOptionsConflict. Users._collection.createIndex( { username: 1, @@ -1674,6 +1675,7 @@ if (Meteor.isServer) { unique: true, }, ); +*/ Meteor.defer(() => { addCronJob(); }); From 4e72dadc6f586ad1f918dfd9fcf1b42a55f1bcf5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 9 Oct 2021 17:00:37 +0300 Subject: [PATCH 010/246] Updated dependencies. --- package-lock.json | 316 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 2 files changed, 319 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index ad3b07760..d874ee39d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -311,6 +311,62 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -368,6 +424,11 @@ "mermaid": "^8.13.8" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", @@ -406,6 +467,11 @@ "color-convert": "^1.9.0" } }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, "archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", @@ -466,6 +532,15 @@ } } }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -751,6 +826,11 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -769,6 +849,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -834,6 +919,11 @@ } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1462,6 +1552,11 @@ "robust-predicates": "^3.0.0" } }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", @@ -1699,6 +1794,14 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1720,6 +1823,52 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1803,6 +1952,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -1884,6 +2038,11 @@ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -2198,6 +2357,22 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, "markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", @@ -3164,6 +3339,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -3259,6 +3451,14 @@ } } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", @@ -3269,11 +3469,35 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==" }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -3549,6 +3773,11 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -3569,6 +3798,11 @@ "object-inspect": "^1.9.0" } }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "simpl-schema": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", @@ -3691,6 +3925,26 @@ "has-flag": "^3.0.0" } }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "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" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -3749,6 +4003,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -3865,6 +4124,58 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3884,6 +4195,11 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index cc6b428f5..8d95004a3 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4", "@wekanteam/markdown-it-mermaid": "^0.5.2", + "@mapbox/node-pre-gyp": "^1.0.5", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", @@ -56,7 +57,8 @@ "qs": "^6.10.1", "simpl-schema": "^1.12.0", "sinon-chai": "^3.7.0", - "source-map-support": "^0.5.20" + "source-map-support": "^0.5.20", + "uuid": "^8.3.2" }, "meteor": { "testModule": "tests/main.js" From e3daa37c5a38a62bd41b91a05784cdfc1f889760 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 21 Jan 2022 20:24:35 +0200 Subject: [PATCH 011/246] Upgraded to Meteor 2.5.3 --- .meteor/packages | 8 ++++---- .meteor/release | 2 +- .meteor/versions | 22 +++++++++++----------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 05cab0c45..7a2df83b2 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -6,9 +6,9 @@ meteor-base@1.5.1 # Build system -ecmascript@0.16.0-beta250.3 +ecmascript@0.16.1 standard-minifier-css@1.7.4 -standard-minifier-js@2.7.1 +standard-minifier-js@2.8.0 mquandalle:jade coffeescript@2.4.1! @@ -58,7 +58,7 @@ rajit:bootstrap3-datepicker shell-server@0.5.0 email@2.2.0 horka:swipebox -dynamic-import@0.7.1 +dynamic-import@0.7.2 rzymek:fullcalendar browser-policy-framing@1.1.0 msavin:usercache @@ -122,7 +122,7 @@ pascoual:pdfkit lmieulet:meteor-coverage meteortesting:mocha aldeed:simple-schema -accounts-password@2.2.0-beta250.3 +accounts-password@2.2.0 matb33:collection-hooks simple:json-routes kadira:flow-router diff --git a/.meteor/release b/.meteor/release index 5eaeaf017..c2ff29ae8 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.5-beta.3 +METEOR@2.5.3 diff --git a/.meteor/versions b/.meteor/versions index b31373b82..c7c12c261 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,5 +1,5 @@ -accounts-base@2.2.0-beta250.3 -accounts-password@2.2.0-beta250.3 +accounts-base@2.2.0 +accounts-password@2.2.0 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 aldeed:schema-deny@1.1.0 @@ -8,8 +8,8 @@ aldeed:simple-schema@1.5.4 allow-deny@1.1.0 arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 -autoupdate@1.8.0-beta250.3 -babel-compiler@7.7.0 +autoupdate@1.8.0 +babel-compiler@7.8.0 babel-runtime@1.5.0 base64@1.0.12 binary-heap@1.0.11 @@ -36,9 +36,9 @@ ddp-rate-limiter@1.1.0 ddp-server@2.5.0 deps@1.0.12 diff-sequence@1.1.1 -dynamic-import@0.7.1 +dynamic-import@0.7.2 easylogic:summernote@0.8.8 -ecmascript@0.16.0-beta250.3 +ecmascript@0.16.1 ecmascript-runtime@0.8.0 ecmascript-runtime-client@0.12.1 ecmascript-runtime-server@0.11.0 @@ -81,12 +81,12 @@ meteorhacks:subs-manager@1.6.4 meteortesting:browser-tests@0.2.0 meteortesting:mocha@0.6.0 minifier-css@1.6.0 -minifier-js@2.7.1 +minifier-js@2.7.3 minifiers@1.1.8-faster-rebuild.0 minimongo@1.7.0 mobile-status-bar@1.1.0 modern-browsers@0.1.7 -modules@0.17.0 +modules@0.18.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 mongo@1.13.0 @@ -171,14 +171,14 @@ rajit:bootstrap3-datepicker-zh-cn@1.7.1 rajit:bootstrap3-datepicker-zh-tw@1.7.1 random@1.2.0 rate-limit@1.0.9 -react-fast-refresh@0.2.0-beta250.3 +react-fast-refresh@0.2.2 reactive-dict@1.3.0 reactive-var@1.0.11 reload@1.3.1 retry@1.1.0 routepolicy@1.1.1 rzymek:fullcalendar@3.8.0 -service-configuration@1.3.0-beta250.3 +service-configuration@1.3.0 session@1.2.0 sha@1.0.9 shell-server@0.5.0 @@ -201,7 +201,7 @@ url@1.3.2 useraccounts:core@1.16.2 useraccounts:flow-routing@1.15.0 useraccounts:unstyled@1.14.2 -webapp@1.13.0-beta250.3 +webapp@1.13.0 webapp-hashing@1.1.0 wekan-markdown@1.0.9 zimme:active-route@2.3.2 From 3eb72c6c48dcc86e9072dc8816d58bae035cc14a Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 26 Jan 2022 08:55:11 +0100 Subject: [PATCH 012/246] .devcontainer, update image to ubuntu:rolling - see also: 8446640060e6e5058d0d186d71831a32a9e606e3 --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ac0ce042a..eae548415 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM quay.io/wekan/ubuntu:groovy-20210115 +FROM ubuntu:rolling LABEL maintainer="sgr" ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python git ca-certificates iproute2" From 815e2db0aea6f32d0a4612f75058b5c7582af75e Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 26 Jan 2022 08:56:17 +0100 Subject: [PATCH 013/246] .devcontainer, use python3 instead of python - see also: c3a27f6d171d7056d82bf1a5a11cd2bcd8d1da31 --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index eae548415..3b3ab8316 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:rolling LABEL maintainer="sgr" -ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python git ca-certificates iproute2" +ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python3 git ca-certificates iproute2" ENV DEBIAN_FRONTEND=noninteractive ENV \ From 6d0f0c3606fa0b70cf6c8c87a9707d880938c51c Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 26 Jan 2022 22:50:41 +0100 Subject: [PATCH 014/246] meteor-autosize, on_use replaced with onUse, add_files replaced with addFiles --- packages/meteor-autosize/package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/meteor-autosize/package.js b/packages/meteor-autosize/package.js index 850cfb86f..ff1ebd22a 100644 --- a/packages/meteor-autosize/package.js +++ b/packages/meteor-autosize/package.js @@ -6,7 +6,7 @@ Package.describe({ documentation: 'README.md' }); -Package.on_use(function (api) { +Package.onUse(function (api) { api.versionsFrom("METEOR@0.9.0"); - api.add_files(['lib/autosize.js'], 'client'); + api.addFiles(['lib/autosize.js'], 'client'); }); From c8656afc1ea939bb91b2c955906295288b19430d Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 26 Jan 2022 22:51:28 +0100 Subject: [PATCH 015/246] .devcontainer, user MongoDB 5.0 --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 67e85fcf7..f33de56fe 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.7' services: wekandb-dev: - image: mongo:4.4 + image: mongo:5.0 container_name: wekan-dev-db restart: unless-stopped command: mongod --oplogSize 128 From 393be58a94bed5f08e0b55d6fb65d6c079a19d76 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sun, 30 Jan 2022 02:35:04 +0200 Subject: [PATCH 016/246] Updated dependencies. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d95004a3..6bb43838e 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "dependencies": { "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4", + "@mapbox/node-pre-gyp": "^1.0.8", "@wekanteam/markdown-it-mermaid": "^0.5.2", - "@mapbox/node-pre-gyp": "^1.0.5", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", From 9294eac6426b2fb129807933d81f98c8c059f97d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sun, 30 Jan 2022 02:37:17 +0200 Subject: [PATCH 017/246] Upgraded to Meteor v2.5.6 --- .meteor/release | 2 +- .meteor/versions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.meteor/release b/.meteor/release index c2ff29ae8..0150b11e9 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.5.3 +METEOR@2.5.6 diff --git a/.meteor/versions b/.meteor/versions index c7c12c261..c97846d86 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,4 +1,4 @@ -accounts-base@2.2.0 +accounts-base@2.2.1 accounts-password@2.2.0 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 From 010aed98a8289d7f6bdefd48c06c0e2b13ff0d3c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 4 Feb 2022 12:53:05 +0200 Subject: [PATCH 018/246] Upgraded to Meteor v2.6 Thanks to Meteor developers! --- .meteor/packages | 2 +- .meteor/release | 2 +- .meteor/versions | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 7a2df83b2..e400ae384 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -21,7 +21,7 @@ cottz:publish-relations dburles:collection-helpers idmontie:migrations matteodem:easy-search -mongo@1.13.0 +mongo@1.14.0 mquandalle:collection-mutations # Account system diff --git a/.meteor/release b/.meteor/release index 0150b11e9..a19cd6985 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.5.6 +METEOR@2.6 diff --git a/.meteor/versions b/.meteor/versions index c97846d86..072cde7e0 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -5,7 +5,7 @@ aldeed:collection2-core@1.2.0 aldeed:schema-deny@1.1.0 aldeed:schema-index@1.1.1 aldeed:simple-schema@1.5.4 -allow-deny@1.1.0 +allow-deny@1.1.1 arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 autoupdate@1.8.0 @@ -83,13 +83,13 @@ meteortesting:mocha@0.6.0 minifier-css@1.6.0 minifier-js@2.7.3 minifiers@1.1.8-faster-rebuild.0 -minimongo@1.7.0 +minimongo@1.8.0 mobile-status-bar@1.1.0 modern-browsers@0.1.7 modules@0.18.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 -mongo@1.13.0 +mongo@1.14.0 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -102,7 +102,7 @@ mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 mquandalle:mousetrap-bindglobal@0.0.1 msavin:usercache@1.8.0 -npm-mongo@3.9.1 +npm-mongo@4.3.1 observe-sequence@1.0.19 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 From 30711529787cf63b5bf72ad54b4a243c14f6952a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 5 Feb 2022 01:00:35 +0200 Subject: [PATCH 019/246] Updated dependencies. --- .meteor/versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.meteor/versions b/.meteor/versions index 072cde7e0..8a8883de7 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -89,7 +89,7 @@ modern-browsers@0.1.7 modules@0.18.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 -mongo@1.14.0 +mongo@1.14.1 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -182,7 +182,7 @@ service-configuration@1.3.0 session@1.2.0 sha@1.0.9 shell-server@0.5.0 -simple:json-routes@2.3.0 +simple:json-routes@2.3.1 socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 From 4277d89514024a9d201088a117d693299ea69189 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Fri, 18 Feb 2022 13:05:50 +0300 Subject: [PATCH 020/246] Fix various bugs --- .meteor/versions | 2 +- client/components/activities/activities.jade | 6 +++--- client/components/boards/boardBody.js | 7 ++++--- client/components/lists/listBody.js | 12 +++++++++++- models/cards.js | 1 + server/publications/boards.js | 1 + 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.meteor/versions b/.meteor/versions index 8a8883de7..3335c4531 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -89,7 +89,7 @@ modern-browsers@0.1.7 modules@0.18.0 modules-runtime@0.12.0 momentjs:moment@2.29.1 -mongo@1.14.1 +mongo@1.14.5 mongo-decimal@0.1.2 mongo-dev-server@1.1.0 mongo-id@1.0.8 diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index d6e6bfbad..33a2378bd 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -42,7 +42,7 @@ template(name="addReactionPopup") span.add-comment-reaction(data-codepoint="#{codepoint}") !{codepoint} template(name="activity") - .activity + .activity(data-id=activity._id) +userAvatar(userId=activity.user._id) p.activity-desc span.activity-member @@ -153,10 +153,10 @@ template(name="activity") +editOrDeleteComment if($eq activity.activityType 'deleteComment') - | {{{_ 'activity-deleteComment' currentData.commentId}}}. + | {{{_ 'activity-deleteComment' activity.commentId}}}. if($eq activity.activityType 'editComment') - | {{{_ 'activity-editComment' currentData.commentId}}}. + | {{{_ 'activity-editComment' activity.commentId}}}. else //- if we are not in card mode we only display a summary of the comment if($eq activity.activityType 'addComment') diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index d52404a86..e0b3c5dd0 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -269,9 +269,10 @@ BlazeComponent.extendComponent({ openNewListForm() { if (this.isViewSwimlanes()) { - this.childComponents('swimlane')[0] - .childComponents('addListAndSwimlaneForm')[0] - .open(); + // The form had been removed in 416b17062e57f215206e93a85b02ef9eb1ab4902 + // this.childComponents('swimlane')[0] + // .childComponents('addListAndSwimlaneForm')[0] + // .open(); } else if (this.isViewLists()) { this.childComponents('listsGroup')[0] .childComponents('addListForm')[0] diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 6cf1ebb4b..9d04d72b5 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -43,7 +43,6 @@ BlazeComponent.extendComponent({ const position = this.currentData().position; const title = textarea.val().trim(); - const formComponent = this.childComponents('addCardForm')[0]; let sortIndex; if (position === 'top') { sortIndex = Utils.calculateIndex(null, firstCardDom).base; @@ -51,6 +50,7 @@ BlazeComponent.extendComponent({ sortIndex = Utils.calculateIndex(lastCardDom, null).base; } + const formComponent = this.cardFormComponent(); const members = formComponent.members.get(); const labelIds = formComponent.labels.get(); const customFields = formComponent.customFields.get(); @@ -132,6 +132,16 @@ BlazeComponent.extendComponent({ } }, + cardFormComponent() { + for (const inlinedForm of this.childComponents('inlinedForm')) { + const [addCardForm] = inlinedForm.childComponents('addCardForm'); + if (addCardForm) { + return addCardForm; + } + } + return null; + }, + scrollToBottom() { const container = this.firstNode(); $(container).animate({ diff --git a/models/cards.js b/models/cards.js index c95665934..ce67128f7 100644 --- a/models/cards.js +++ b/models/cards.js @@ -5,6 +5,7 @@ import { TYPE_LINKED_BOARD, TYPE_LINKED_CARD, } from '../config/const'; +import Attachments from './attachments'; Cards = new Mongo.Collection('cards'); diff --git a/server/publications/boards.js b/server/publications/boards.js index 695161946..6968e3d6c 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -5,6 +5,7 @@ import Users from "../../models/users"; import Org from "../../models/org"; import Team from "../../models/team"; +import Attachments from '../../models/attachments'; Meteor.publish('boards', function() { const userId = this.userId; From 6e1bf061f8c28858f75801cc66cbd2ab943e9de6 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Sun, 30 Jan 2022 08:59:20 +0300 Subject: [PATCH 021/246] Adios cfs:* | Hello ostrio:file --- .meteor/packages | 4 +++- .meteor/versions | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index e400ae384..ead7e135f 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -69,6 +69,8 @@ meteorhacks:aggregate@1.3.0 wekan-markdown konecty:mongo-counter percolate:synced-cron +ostrio:cookies +ostrio:files@2.0.1 rajit:bootstrap3-datepicker-fi rajit:bootstrap3-datepicker-ar rajit:bootstrap3-datepicker-bg @@ -122,7 +124,7 @@ pascoual:pdfkit lmieulet:meteor-coverage meteortesting:mocha aldeed:simple-schema -accounts-password@2.2.0 +accounts-password matb33:collection-hooks simple:json-routes kadira:flow-router diff --git a/.meteor/versions b/.meteor/versions index 3335c4531..4c3090241 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -21,7 +21,6 @@ browser-policy-framing@1.1.0 caching-compiler@1.2.2 caching-html-compiler@1.2.1 callback-hook@1.4.0 -cfs:http-methods@0.0.32 check@1.3.1 coagmano:stylus@1.1.0 coffeescript@2.4.1 @@ -106,7 +105,9 @@ npm-mongo@4.3.1 observe-sequence@1.0.19 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 +ostrio:cookies@2.7.0 ostrio:cstorage@2.2.2 +ostrio:files@2.0.1 ostrio:i18n@3.1.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 From 85480a6cae30cdce12437dc1e5efc15ff6d8b8cf Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 15:53:59 -0500 Subject: [PATCH 022/246] rm fix-download-unicode --- Dockerfile | 1 - fix-download-unicode/cfs_access-point.txt | 914 ---------------------- rebuild-wekan.bat | 1 - releases/rebuild-release.sh | 1 - stacksmith/user-scripts/build.sh | 2 - 5 files changed, 919 deletions(-) delete mode 100644 fix-download-unicode/cfs_access-point.txt diff --git a/Dockerfile b/Dockerfile index db971e7d3..c24fd8ef2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -290,7 +290,6 @@ RUN \ chmod u+w *.json && \ gosu wekan:wekan npm install && \ gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \ - #cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \ #rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs && \ #chown wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \ #Removed binary version of bcrypt because of security vulnerability that is not fixed yet. diff --git a/fix-download-unicode/cfs_access-point.txt b/fix-download-unicode/cfs_access-point.txt deleted file mode 100644 index 968e94484..000000000 --- a/fix-download-unicode/cfs_access-point.txt +++ /dev/null @@ -1,914 +0,0 @@ -(function () { - -/* Imports */ -var Meteor = Package.meteor.Meteor; -var global = Package.meteor.global; -var meteorEnv = Package.meteor.meteorEnv; -var FS = Package['wekan-cfs-base-package'].FS; -var check = Package.check.check; -var Match = Package.check.Match; -var EJSON = Package.ejson.EJSON; -var HTTP = Package['wekan-cfs-http-methods'].HTTP; - -/* Package-scope variables */ -var rootUrlPathPrefix, baseUrl, getHeaders, getHeadersByCollection, _existingMountPoints, mountUrls; - -(function(){ - -/////////////////////////////////////////////////////////////////////// -// // -// packages/cfs_access-point/packages/cfs_access-point.js // -// // -/////////////////////////////////////////////////////////////////////// - // -(function () { - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// packages/wekan-cfs-access-point/access-point-common.js // -// // -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // -rootUrlPathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; // 1 -// Adjust the rootUrlPathPrefix if necessary // 2 -if (rootUrlPathPrefix.length > 0) { // 3 - if (rootUrlPathPrefix.slice(0, 1) !== '/') { // 4 - rootUrlPathPrefix = '/' + rootUrlPathPrefix; // 5 - } // 6 - if (rootUrlPathPrefix.slice(-1) === '/') { // 7 - rootUrlPathPrefix = rootUrlPathPrefix.slice(0, -1); // 8 - } // 9 -} // 10 - // 11 -// prepend ROOT_URL when isCordova // 12 -if (Meteor.isCordova) { // 13 - rootUrlPathPrefix = Meteor.absoluteUrl(rootUrlPathPrefix.replace(/^\/+/, '')).replace(/\/+$/, ''); // 14 -} // 15 - // 16 -baseUrl = '/cfs'; // 17 -FS.HTTP = FS.HTTP || {}; // 18 - // 19 -// Note the upload URL so that client uploader packages know what it is // 20 -FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 21 - // 22 -/** // 23 - * @method FS.HTTP.setBaseUrl // 24 - * @public // 25 - * @param {String} newBaseUrl - Change the base URL for the HTTP GET and DELETE endpoints. // 26 - * @returns {undefined} // 27 - */ // 28 -FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { // 29 - // 30 - // Adjust the baseUrl if necessary // 31 - if (newBaseUrl.slice(0, 1) !== '/') { // 32 - newBaseUrl = '/' + newBaseUrl; // 33 - } // 34 - if (newBaseUrl.slice(-1) === '/') { // 35 - newBaseUrl = newBaseUrl.slice(0, -1); // 36 - } // 37 - // 38 - // Update the base URL // 39 - baseUrl = newBaseUrl; // 40 - // 41 - // Change the upload URL so that client uploader packages know what it is // 42 - FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 43 - // 44 - // Remount URLs with the new baseUrl, unmounting the old, on the server only. // 45 - // If existingMountPoints is empty, then we haven't run the server startup // 46 - // code yet, so this new URL will be used at that point for the initial mount. // 47 - if (Meteor.isServer && !FS.Utility.isEmpty(_existingMountPoints)) { // 48 - mountUrls(); // 49 - } // 50 -}; // 51 - // 52 -/* // 53 - * FS.File extensions // 54 - */ // 55 - // 56 -/** // 57 - * @method FS.File.prototype.url Construct the file url // 58 - * @public // 59 - * @param {Object} [options] // 60 - * @param {String} [options.store] Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used. - * @param {Boolean} [options.auth=null] Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds. - * @param {Boolean} [options.download=false] Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser. - * @param {Boolean} [options.brokenIsFine=false] Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet. - * @param {Boolean} [options.metadata=false] Return the URL for the file metadata access point rather than the file itself. - * @param {String} [options.uploading=null] A URL to return while the file is being uploaded. // 66 - * @param {String} [options.storing=null] A URL to return while the file is being stored. // 67 - * @param {String} [options.filename=null] Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store. - * // 69 - * Returns the HTTP URL for getting the file or its metadata. // 70 - */ // 71 -FS.File.prototype.url = function(options) { // 72 - var self = this; // 73 - options = options || {}; // 74 - options = FS.Utility.extend({ // 75 - store: null, // 76 - auth: null, // 77 - download: false, // 78 - metadata: false, // 79 - brokenIsFine: false, // 80 - uploading: null, // return this URL while uploading // 81 - storing: null, // return this URL while storing // 82 - filename: null // override the filename that is shown to the user // 83 - }, options.hash || options); // check for "hash" prop if called as helper // 84 - // 85 - // Primarily useful for displaying a temporary image while uploading an image // 86 - if (options.uploading && !self.isUploaded()) { // 87 - return options.uploading; // 88 - } // 89 - // 90 - if (self.isMounted()) { // 91 - // See if we've stored in the requested store yet // 92 - var storeName = options.store || self.collection.primaryStore.name; // 93 - if (!self.hasStored(storeName)) { // 94 - if (options.storing) { // 95 - return options.storing; // 96 - } else if (!options.brokenIsFine) { // 97 - // We want to return null if we know the URL will be a broken // 98 - // link because then we can avoid rendering broken links, broken // 99 - // images, etc. // 100 - return null; // 101 - } // 102 - } // 103 - // 104 - // Add filename to end of URL if we can determine one // 105 - var filename = options.filename || self.name({store: storeName}); // 106 - if (typeof filename === "string" && filename.length) { // 107 - filename = '/' + filename; // 108 - } else { // 109 - filename = ''; // 110 - } // 111 - // 112 - // TODO: Could we somehow figure out if the collection requires login? // 113 - var authToken = ''; // 114 - if (Meteor.isClient && typeof Accounts !== "undefined" && typeof Accounts._storedLoginToken === "function") { // 115 - if (options.auth !== false) { // 116 - // Add reactive deps on the user // 117 - Meteor.userId(); // 118 - // 119 - var authObject = { // 120 - authToken: Accounts._storedLoginToken() || '' // 121 - }; // 122 - // 123 - // If it's a number, we use that as the expiration time (in seconds) // 124 - if (options.auth === +options.auth) { // 125 - authObject.expiration = FS.HTTP.now() + options.auth * 1000; // 126 - } // 127 - // 128 - // Set the authToken // 129 - var authString = JSON.stringify(authObject); // 130 - authToken = FS.Utility.btoa(authString); // 131 - } // 132 - } else if (typeof options.auth === "string") { // 133 - // If the user supplies auth token the user will be responsible for // 134 - // updating // 135 - authToken = options.auth; // 136 - } // 137 - // 138 - // Construct query string // 139 - var params = {}; // 140 - if (authToken !== '') { // 141 - params.token = authToken; // 142 - } // 143 - if (options.download) { // 144 - params.download = true; // 145 - } // 146 - if (options.store) { // 147 - // We use options.store here instead of storeName because we want to omit the queryString // 148 - // whenever possible, allowing users to have "clean" URLs if they want. The server will // 149 - // assume the first store defined on the server, which means that we are assuming that // 150 - // the first on the client is also the first on the server. If that's not the case, the // 151 - // store option should be supplied. // 152 - params.store = options.store; // 153 - } // 154 - var queryString = FS.Utility.encodeParams(params); // 155 - if (queryString.length) { // 156 - queryString = '?' + queryString; // 157 - } // 158 - // 159 - // Determine which URL to use // 160 - var area; // 161 - if (options.metadata) { // 162 - area = '/record'; // 163 - } else { // 164 - area = '/files'; // 165 - } // 166 - // 167 - // Construct and return the http method url // 168 - return rootUrlPathPrefix + baseUrl + area + '/' + self.collection.name + '/' + self._id + filename + queryString; // 169 - } // 170 - // 171 -}; // 172 - // 173 - // 174 - // 175 -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -}).call(this); - - - - - - -(function () { - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// packages/wekan-cfs-access-point/access-point-handlers.js // -// // -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // -getHeaders = []; // 1 -getHeadersByCollection = {}; // 2 - // 3 -FS.HTTP.Handlers = {}; // 4 - // 5 -/** // 6 - * @method FS.HTTP.Handlers.Del // 7 - * @public // 8 - * @returns {any} response // 9 - * // 10 - * HTTP DEL request handler // 11 - */ // 12 -FS.HTTP.Handlers.Del = function httpDelHandler(ref) { // 13 - var self = this; // 14 - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 15 - // 16 - // If DELETE request, validate with 'remove' allow/deny, delete the file, and return // 17 - FS.Utility.validateAction(ref.collection.files._validators['remove'], ref.file, self.userId); // 18 - // 19 - /* // 20 - * From the DELETE spec: // 21 - * A successful response SHOULD be 200 (OK) if the response includes an // 22 - * entity describing the status, 202 (Accepted) if the action has not // 23 - * yet been enacted, or 204 (No Content) if the action has been enacted // 24 - * but the response does not include an entity. // 25 - */ // 26 - self.setStatusCode(200); // 27 - // 28 - return { // 29 - deleted: !!ref.file.remove() // 30 - }; // 31 -}; // 32 - // 33 -/** // 34 - * @method FS.HTTP.Handlers.GetList // 35 - * @public // 36 - * @returns {Object} response // 37 - * // 38 - * HTTP GET file list request handler // 39 - */ // 40 -FS.HTTP.Handlers.GetList = function httpGetListHandler() { // 41 - // Not Yet Implemented // 42 - // Need to check publications and return file list based on // 43 - // what user is allowed to see // 44 -}; // 45 - // 46 -/* // 47 - requestRange will parse the range set in request header - if not possible it // 48 - will throw fitting errors and autofill range for both partial and full ranges // 49 - // 50 - throws error or returns the object: // 51 - { // 52 - start // 53 - end // 54 - length // 55 - unit // 56 - partial // 57 - } // 58 -*/ // 59 -var requestRange = function(req, fileSize) { // 60 - if (req) { // 61 - if (req.headers) { // 62 - var rangeString = req.headers.range; // 63 - // 64 - // Make sure range is a string // 65 - if (rangeString === ''+rangeString) { // 66 - // 67 - // range will be in the format "bytes=0-32767" // 68 - var parts = rangeString.split('='); // 69 - var unit = parts[0]; // 70 - // 71 - // Make sure parts consists of two strings and range is of type "byte" // 72 - if (parts.length == 2 && unit == 'bytes') { // 73 - // Parse the range // 74 - var range = parts[1].split('-'); // 75 - var start = Number(range[0]); // 76 - var end = Number(range[1]); // 77 - // 78 - // Fix invalid ranges? // 79 - if (range[0] != start) start = 0; // 80 - if (range[1] != end || !end) end = fileSize - 1; // 81 - // 82 - // Make sure range consists of a start and end point of numbers and start is less than end // 83 - if (start < end) { // 84 - // 85 - var partSize = 0 - start + end + 1; // 86 - // 87 - // Return the parsed range // 88 - return { // 89 - start: start, // 90 - end: end, // 91 - length: partSize, // 92 - size: fileSize, // 93 - unit: unit, // 94 - partial: (partSize < fileSize) // 95 - }; // 96 - // 97 - } else { // 98 - throw new Meteor.Error(416, "Requested Range Not Satisfiable"); // 99 - } // 100 - // 101 - } else { // 102 - // The first part should be bytes // 103 - throw new Meteor.Error(416, "Requested Range Unit Not Satisfiable"); // 104 - } // 105 - // 106 - } else { // 107 - // No range found // 108 - } // 109 - // 110 - } else { // 111 - // throw new Error('No request headers set for _parseRange function'); // 112 - } // 113 - } else { // 114 - throw new Error('No request object passed to _parseRange function'); // 115 - } // 116 - // 117 - return { // 118 - start: 0, // 119 - end: fileSize - 1, // 120 - length: fileSize, // 121 - size: fileSize, // 122 - unit: 'bytes', // 123 - partial: false // 124 - }; // 125 -}; // 126 - // 127 -/** // 128 - * @method FS.HTTP.Handlers.Get // 129 - * @public // 130 - * @returns {any} response // 131 - * // 132 - * HTTP GET request handler // 133 - */ // 134 -FS.HTTP.Handlers.Get = function httpGetHandler(ref) { // 135 - var self = this; // 136 - // Once we have the file, we can test allow/deny validators // 137 - // XXX: pass on the "share" query eg. ?share=342hkjh23ggj for shared url access? // 138 - FS.Utility.validateAction(ref.collection._validators['download'], ref.file, self.userId /*, self.query.shareId*/); // 139 - // 140 - var storeName = ref.storeName; // 141 - // 142 - // If no storeName was specified, use the first defined storeName // 143 - if (typeof storeName !== "string") { // 144 - // No store handed, we default to primary store // 145 - storeName = ref.collection.primaryStore.name; // 146 - } // 147 - // 148 - // Get the storage reference // 149 - var storage = ref.collection.storesLookup[storeName]; // 150 - // 151 - if (!storage) { // 152 - throw new Meteor.Error(404, "Not Found", 'There is no store "' + storeName + '"'); // 153 - } // 154 - // 155 - // Get the file // 156 - var copyInfo = ref.file.copies[storeName]; // 157 - // 158 - if (!copyInfo) { // 159 - throw new Meteor.Error(404, "Not Found", 'This file was not stored in the ' + storeName + ' store'); // 160 - } // 161 - // 162 - // Set the content type for file // 163 - if (typeof copyInfo.type === "string") { // 164 - self.setContentType(copyInfo.type); // 165 - } else { // 166 - self.setContentType('application/octet-stream'); // 167 - } // 168 - // 169 - // Add 'Content-Disposition' header if requested a download/attachment URL // 170 - if (typeof ref.download !== "undefined") { // 171 - var filename = ref.filename || copyInfo.name; // 172 - self.addHeader('Content-Disposition', 'attachment; filename="' + filename + '"'); // 173 - } else { // 174 - self.addHeader('Content-Disposition', 'inline'); // 175 - } // 176 - // 177 - // Get the contents range from request // 178 - var range = requestRange(self.request, copyInfo.size); // 179 - // 180 - // Some browsers cope better if the content-range header is // 181 - // still included even for the full file being returned. // 182 - self.addHeader('Content-Range', range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); // 183 - // 184 - // If a chunk/range was requested instead of the whole file, serve that' // 185 - if (range.partial) { // 186 - self.setStatusCode(206, 'Partial Content'); // 187 - } else { // 188 - self.setStatusCode(200, 'OK'); // 189 - } // 190 - // 191 - // Add any other global custom headers and collection-specific custom headers // 192 - FS.Utility.each(getHeaders.concat(getHeadersByCollection[ref.collection.name] || []), function(header) { // 193 - self.addHeader(header[0], header[1]); // 194 - }); // 195 - // 196 - // Inform clients about length (or chunk length in case of ranges) // 197 - self.addHeader('Content-Length', range.length); // 198 - // 199 - // Last modified header (updatedAt from file info) // 200 - self.addHeader('Last-Modified', copyInfo.updatedAt.toUTCString()); // 201 - // 202 - // Inform clients that we accept ranges for resumable chunked downloads // 203 - self.addHeader('Accept-Ranges', range.unit); // 204 - // 205 - if (FS.debug) console.log('Read file "' + (ref.filename || copyInfo.name) + '" ' + range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); - // 207 - var readStream = storage.adapter.createReadStream(ref.file, {start: range.start, end: range.end}); // 208 - // 209 - readStream.on('error', function(err) { // 210 - // Send proper error message on get error // 211 - if (err.message && err.statusCode) { // 212 - self.Error(new Meteor.Error(err.statusCode, err.message)); // 213 - } else { // 214 - self.Error(new Meteor.Error(503, 'Service unavailable')); // 215 - } // 216 - }); // 217 - // 218 - readStream.pipe(self.createWriteStream()); // 219 -}; // 220 - -const originalHandler = FS.HTTP.Handlers.Get; -FS.HTTP.Handlers.Get = function (ref) { -//console.log(ref.filename); - try { - var userAgent = (this.requestHeaders['user-agent']||'').toLowerCase(); - - if(userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0 || userAgent.indexOf('chrome') >= 0) { - ref.filename = encodeURIComponent(ref.filename); - } else if(userAgent.indexOf('firefox') >= 0) { - ref.filename = Buffer.from(ref.filename).toString('binary'); - } else { - /* safari*/ - ref.filename = Buffer.from(ref.filename).toString('binary'); - } - } catch (ex){ - ref.filename = 'tempfix'; - } - return originalHandler.call(this, ref); -}; - // 221 -/** // 222 - * @method FS.HTTP.Handlers.PutInsert // 223 - * @public // 224 - * @returns {Object} response object with _id property // 225 - * // 226 - * HTTP PUT file insert request handler // 227 - */ // 228 -FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { // 229 - var self = this; // 230 - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 231 - // 232 - FS.debug && console.log("HTTP PUT (insert) handler"); // 233 - // 234 - // Create the nice FS.File // 235 - var fileObj = new FS.File(); // 236 - // 237 - // Set its name // 238 - fileObj.name(opts.filename || null); // 239 - // 240 - // Attach the readstream as the file's data // 241 - fileObj.attachData(self.createReadStream(), {type: self.requestHeaders['content-type'] || 'application/octet-stream'}); - // 243 - // Validate with insert allow/deny // 244 - FS.Utility.validateAction(ref.collection.files._validators['insert'], fileObj, self.userId); // 245 - // 246 - // Insert file into collection, triggering readStream storage // 247 - ref.collection.insert(fileObj); // 248 - // 249 - // Send response // 250 - self.setStatusCode(200); // 251 - // 252 - // Return the new file id // 253 - return {_id: fileObj._id}; // 254 -}; // 255 - // 256 -/** // 257 - * @method FS.HTTP.Handlers.PutUpdate // 258 - * @public // 259 - * @returns {Object} response object with _id and chunk properties // 260 - * // 261 - * HTTP PUT file update chunk request handler // 262 - */ // 263 -FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { // 264 - var self = this; // 265 - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 266 - // 267 - var chunk = parseInt(opts.chunk, 10); // 268 - if (isNaN(chunk)) chunk = 0; // 269 - // 270 - FS.debug && console.log("HTTP PUT (update) handler received chunk: ", chunk); // 271 - // 272 - // Validate with insert allow/deny; also mounts and retrieves the file // 273 - FS.Utility.validateAction(ref.collection.files._validators['insert'], ref.file, self.userId); // 274 - // 275 - self.createReadStream().pipe( FS.TempStore.createWriteStream(ref.file, chunk) ); // 276 - // 277 - // Send response // 278 - self.setStatusCode(200); // 279 - // 280 - return { _id: ref.file._id, chunk: chunk }; // 281 -}; // 282 - // 283 -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -}).call(this); - - - - - - -(function () { - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// packages/wekan-cfs-access-point/access-point-server.js // -// // -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // -var path = Npm.require("path"); // 1 - // 2 -HTTP.publishFormats({ // 3 - fileRecordFormat: function (input) { // 4 - // Set the method scope content type to json // 5 - this.setContentType('application/json'); // 6 - if (FS.Utility.isArray(input)) { // 7 - return EJSON.stringify(FS.Utility.map(input, function (obj) { // 8 - return FS.Utility.cloneFileRecord(obj); // 9 - })); // 10 - } else { // 11 - return EJSON.stringify(FS.Utility.cloneFileRecord(input)); // 12 - } // 13 - } // 14 -}); // 15 - // 16 -/** // 17 - * @method FS.HTTP.setHeadersForGet // 18 - * @public // 19 - * @param {Array} headers - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value. - * @param {Array|String} [collections] - Which collections the headers should be added for. Omit this argument to add the header for all collections. - * @returns {undefined} // 22 - */ // 23 -FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { // 24 - if (typeof collections === "string") { // 25 - collections = [collections]; // 26 - } // 27 - if (collections) { // 28 - FS.Utility.each(collections, function(collectionName) { // 29 - getHeadersByCollection[collectionName] = headers || []; // 30 - }); // 31 - } else { // 32 - getHeaders = headers || []; // 33 - } // 34 -}; // 35 - // 36 -/** // 37 - * @method FS.HTTP.publish // 38 - * @public // 39 - * @param {FS.Collection} collection // 40 - * @param {Function} func - Publish function that returns a cursor. // 41 - * @returns {undefined} // 42 - * // 43 - * Publishes all documents returned by the cursor at a GET URL // 44 - * with the format baseUrl/record/collectionName. The publish // 45 - * function `this` is similar to normal `Meteor.publish`. // 46 - */ // 47 -FS.HTTP.publish = function fsHttpPublish(collection, func) { // 48 - var name = baseUrl + '/record/' + collection.name; // 49 - // Mount collection listing URL using http-publish package // 50 - HTTP.publish({ // 51 - name: name, // 52 - defaultFormat: 'fileRecordFormat', // 53 - collection: collection, // 54 - collectionGet: true, // 55 - collectionPost: false, // 56 - documentGet: true, // 57 - documentPut: false, // 58 - documentDelete: false // 59 - }, func); // 60 - // 61 - FS.debug && console.log("Registered HTTP method GET URLs:\n\n" + name + '\n' + name + '/:id\n'); // 62 -}; // 63 - // 64 -/** // 65 - * @method FS.HTTP.unpublish // 66 - * @public // 67 - * @param {FS.Collection} collection // 68 - * @returns {undefined} // 69 - * // 70 - * Unpublishes a restpoint created by a call to `FS.HTTP.publish` // 71 - */ // 72 -FS.HTTP.unpublish = function fsHttpUnpublish(collection) { // 73 - // Mount collection listing URL using http-publish package // 74 - HTTP.unpublish(baseUrl + '/record/' + collection.name); // 75 -}; // 76 - // 77 -_existingMountPoints = {}; // 78 - // 79 -/** // 80 - * @method defaultSelectorFunction // 81 - * @private // 82 - * @returns { collection, file } // 83 - * // 84 - * This is the default selector function // 85 - */ // 86 -var defaultSelectorFunction = function() { // 87 - var self = this; // 88 - // Selector function // 89 - // // 90 - // This function will have to return the collection and the // 91 - // file. If file not found undefined is returned - if null is returned the // 92 - // search was not possible // 93 - var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 94 - // 95 - // Get the collection name from the url // 96 - var collectionName = opts.collectionName; // 97 - // 98 - // Get the id from the url // 99 - var id = opts.id; // 100 - // 101 - // Get the collection // 102 - var collection = FS._collections[collectionName]; // 103 - // 104 - // Get the file if possible else return null // 105 - var file = (id && collection)? collection.findOne({ _id: id }): null; // 106 - // 107 - // Return the collection and the file // 108 - return { // 109 - collection: collection, // 110 - file: file, // 111 - storeName: opts.store, // 112 - download: opts.download, // 113 - filename: opts.filename // 114 - }; // 115 -}; // 116 - // 117 -/* // 118 - * @method FS.HTTP.mount // 119 - * @public // 120 - * @param {array of string} mountPoints mount points to map rest functinality on // 121 - * @param {function} selector_f [selector] function returns `{ collection, file }` for mount points to work with // 122 - * // 123 -*/ // 124 -FS.HTTP.mount = function(mountPoints, selector_f) { // 125 - // We take mount points as an array and we get a selector function // 126 - var selectorFunction = selector_f || defaultSelectorFunction; // 127 - // 128 - var accessPoint = { // 129 - 'stream': true, // 130 - 'auth': expirationAuth, // 131 - 'post': function(data) { // 132 - // Use the selector for finding the collection and file reference // 133 - var ref = selectorFunction.call(this); // 134 - // 135 - // We dont support post - this would be normal insert eg. of filerecord? // 136 - throw new Meteor.Error(501, "Not implemented", "Post is not supported"); // 137 - }, // 138 - 'put': function(data) { // 139 - // Use the selector for finding the collection and file reference // 140 - var ref = selectorFunction.call(this); // 141 - // 142 - // Make sure we have a collection reference // 143 - if (!ref.collection) // 144 - throw new Meteor.Error(404, "Not Found", "No collection found"); // 145 - // 146 - // Make sure we have a file reference // 147 - if (ref.file === null) { // 148 - // No id supplied so we will create a new FS.File instance and // 149 - // insert the supplied data. // 150 - return FS.HTTP.Handlers.PutInsert.apply(this, [ref]); // 151 - } else { // 152 - if (ref.file) { // 153 - return FS.HTTP.Handlers.PutUpdate.apply(this, [ref]); // 154 - } else { // 155 - throw new Meteor.Error(404, "Not Found", 'No file found'); // 156 - } // 157 - } // 158 - }, // 159 - 'get': function(data) { // 160 - // Use the selector for finding the collection and file reference // 161 - var ref = selectorFunction.call(this); // 162 - // 163 - // Make sure we have a collection reference // 164 - if (!ref.collection) // 165 - throw new Meteor.Error(404, "Not Found", "No collection found"); // 166 - // 167 - // Make sure we have a file reference // 168 - if (ref.file === null) { // 169 - // No id supplied so we will return the published list of files ala // 170 - // http.publish in json format // 171 - return FS.HTTP.Handlers.GetList.apply(this, [ref]); // 172 - } else { // 173 - if (ref.file) { // 174 - return FS.HTTP.Handlers.Get.apply(this, [ref]); // 175 - } else { // 176 - throw new Meteor.Error(404, "Not Found", 'No file found'); // 177 - } // 178 - } // 179 - }, // 180 - 'delete': function(data) { // 181 - // Use the selector for finding the collection and file reference // 182 - var ref = selectorFunction.call(this); // 183 - // 184 - // Make sure we have a collection reference // 185 - if (!ref.collection) // 186 - throw new Meteor.Error(404, "Not Found", "No collection found"); // 187 - // 188 - // Make sure we have a file reference // 189 - if (ref.file) { // 190 - return FS.HTTP.Handlers.Del.apply(this, [ref]); // 191 - } else { // 192 - throw new Meteor.Error(404, "Not Found", 'No file found'); // 193 - } // 194 - } // 195 - }; // 196 - // 197 - var accessPoints = {}; // 198 - // 199 - // Add debug message // 200 - FS.debug && console.log('Registered HTTP method URLs:'); // 201 - // 202 - FS.Utility.each(mountPoints, function(mountPoint) { // 203 - // Couple mountpoint and accesspoint // 204 - accessPoints[mountPoint] = accessPoint; // 205 - // Remember our mountpoints // 206 - _existingMountPoints[mountPoint] = mountPoint; // 207 - // Add debug message // 208 - FS.debug && console.log(mountPoint); // 209 - }); // 210 - // 211 - // XXX: HTTP:methods should unmount existing mounts in case of overwriting? // 212 - HTTP.methods(accessPoints); // 213 - // 214 -}; // 215 - // 216 -/** // 217 - * @method FS.HTTP.unmount // 218 - * @public // 219 - * @param {string | array of string} [mountPoints] Optional, if not specified all mountpoints are unmounted // 220 - * // 221 - */ // 222 -FS.HTTP.unmount = function(mountPoints) { // 223 - // The mountPoints is optional, can be string or array if undefined then // 224 - // _existingMountPoints will be used // 225 - var unmountList; // 226 - // Container for the mount points to unmount // 227 - var unmountPoints = {}; // 228 - // 229 - if (typeof mountPoints === 'undefined') { // 230 - // Use existing mount points - unmount all // 231 - unmountList = _existingMountPoints; // 232 - } else if (mountPoints === ''+mountPoints) { // 233 - // Got a string // 234 - unmountList = [mountPoints]; // 235 - } else if (mountPoints.length) { // 236 - // Got an array // 237 - unmountList = mountPoints; // 238 - } // 239 - // 240 - // If we have a list to unmount // 241 - if (unmountList) { // 242 - // Iterate over each item // 243 - FS.Utility.each(unmountList, function(mountPoint) { // 244 - // Check _existingMountPoints to make sure the mount point exists in our // 245 - // context / was created by the FS.HTTP.mount // 246 - if (_existingMountPoints[mountPoint]) { // 247 - // Mark as unmount // 248 - unmountPoints[mountPoint] = false; // 249 - // Release // 250 - delete _existingMountPoints[mountPoint]; // 251 - } // 252 - }); // 253 - FS.debug && console.log('FS.HTTP.unmount:'); // 254 - FS.debug && console.log(unmountPoints); // 255 - // Complete unmount // 256 - HTTP.methods(unmountPoints); // 257 - } // 258 -}; // 259 - // 260 -// ### FS.Collection maps on HTTP pr. default on the following restpoints: // 261 -// * // 262 -// baseUrl + '/files/:collectionName/:id/:filename', // 263 -// baseUrl + '/files/:collectionName/:id', // 264 -// baseUrl + '/files/:collectionName' // 265 -// // 266 -// Change/ replace the existing mount point by: // 267 -// ```js // 268 -// // unmount all existing // 269 -// FS.HTTP.unmount(); // 270 -// // Create new mount point // 271 -// FS.HTTP.mount([ // 272 -// '/cfs/files/:collectionName/:id/:filename', // 273 -// '/cfs/files/:collectionName/:id', // 274 -// '/cfs/files/:collectionName' // 275 -// ]); // 276 -// ``` // 277 -// // 278 -mountUrls = function mountUrls() { // 279 - // We unmount first in case we are calling this a second time // 280 - FS.HTTP.unmount(); // 281 - // 282 - FS.HTTP.mount([ // 283 - baseUrl + '/files/:collectionName/:id/:filename', // 284 - baseUrl + '/files/:collectionName/:id', // 285 - baseUrl + '/files/:collectionName' // 286 - ]); // 287 -}; // 288 - // 289 -// Returns the userId from URL token // 290 -var expirationAuth = function expirationAuth() { // 291 - var self = this; // 292 - // 293 - // Read the token from '/hello?token=base64' // 294 - var encodedToken = self.query.token; // 295 - // 296 - FS.debug && console.log("token: "+encodedToken); // 297 - // 298 - if (!encodedToken || !Meteor.users) return false; // 299 - // 300 - // Check the userToken before adding it to the db query // 301 - // Set the this.userId // 302 - var tokenString = FS.Utility.atob(encodedToken); // 303 - // 304 - var tokenObject; // 305 - try { // 306 - tokenObject = JSON.parse(tokenString); // 307 - } catch(err) { // 308 - throw new Meteor.Error(400, 'Bad Request'); // 309 - } // 310 - // 311 - // XXX: Do some check here of the object // 312 - var userToken = tokenObject.authToken; // 313 - if (userToken !== ''+userToken) { // 314 - throw new Meteor.Error(400, 'Bad Request'); // 315 - } // 316 - // 317 - // If we have an expiration token we should check that it's still valid // 318 - if (tokenObject.expiration != null) { // 319 - // check if its too old // 320 - var now = Date.now(); // 321 - if (tokenObject.expiration < now) { // 322 - FS.debug && console.log('Expired token: ' + tokenObject.expiration + ' is less than ' + now); // 323 - throw new Meteor.Error(500, 'Expired token'); // 324 - } // 325 - } // 326 - // 327 - // We are not on a secure line - so we have to look up the user... // 328 - var user = Meteor.users.findOne({ // 329 - $or: [ // 330 - {'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(userToken)}, // 331 - {'services.resume.loginTokens.token': userToken} // 332 - ] // 333 - }); // 334 - // 335 - // Set the userId in the scope // 336 - return user && user._id; // 337 -}; // 338 - // 339 -HTTP.methods( // 340 - {'/cfs/servertime': { // 341 - get: function(data) { // 342 - return Date.now().toString(); // 343 - } // 344 - } // 345 -}); // 346 - // 347 -// Unify client / server api // 348 -FS.HTTP.now = function() { // 349 - return Date.now(); // 350 -}; // 351 - // 352 -// Start up the basic mount points // 353 -Meteor.startup(function () { // 354 - mountUrls(); // 355 -}); // 356 - // 357 -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -}).call(this); - -/////////////////////////////////////////////////////////////////////// - -}).call(this); - - -/* Exports */ -if (typeof Package === 'undefined') Package = {}; -Package['wekan-cfs-access-point'] = {}; - -})(); diff --git a/rebuild-wekan.bat b/rebuild-wekan.bat index c45ae8564..f8188990f 100644 --- a/rebuild-wekan.bat +++ b/rebuild-wekan.bat @@ -52,7 +52,6 @@ REM del /S /F /Q node_modules call meteor npm install REM del /S /F /Q .build call meteor build .build --directory -copy fix-download-unicode\cfs_access-point.txt .build\bundle\programs\server\packages\cfs_access-point.js REM ## Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. del /S /F /Q rm .build/bundle/programs/web.browser.legacy REM ## Install some NPM packages diff --git a/releases/rebuild-release.sh b/releases/rebuild-release.sh index 02b862d0e..a709f025d 100755 --- a/releases/rebuild-release.sh +++ b/releases/rebuild-release.sh @@ -10,7 +10,6 @@ rm -rf node_modules meteor npm install rm -rf .build METEOR_PROFILE=100 meteor build .build --directory -cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js # Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. rm -rf .build/bundle/programs/web.browser.legacy cd .build/bundle/programs/server diff --git a/stacksmith/user-scripts/build.sh b/stacksmith/user-scripts/build.sh index ffa5bc1e3..bbaab2717 100755 --- a/stacksmith/user-scripts/build.sh +++ b/stacksmith/user-scripts/build.sh @@ -72,8 +72,6 @@ meteor=/home/wekan/.meteor/meteor #sudo -u wekan ${meteor} add standard-minifier-js sudo -u wekan ${meteor} npm install sudo -u wekan ${meteor} build --directory /home/wekan/app_build -sudo cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js -sudo chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js sudo rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs # Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy From 96f8b5c9f4f3ed525dd728461affc2485b082577 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 16:36:34 -0500 Subject: [PATCH 023/246] Hello gridfs lib + fsHooks for mongodb bucket storage --- models/lib/fsHooks/createInterceptDownload.js | 47 +++++++++++++++++ models/lib/fsHooks/createOnAfterRemove.js | 17 +++++++ models/lib/fsHooks/createOnAfterUpload.js | 51 +++++++++++++++++++ models/lib/grid/createBucket.js | 9 ++++ models/lib/grid/createObjectId.js | 4 ++ 5 files changed, 128 insertions(+) create mode 100644 models/lib/fsHooks/createInterceptDownload.js create mode 100644 models/lib/fsHooks/createOnAfterRemove.js create mode 100644 models/lib/fsHooks/createOnAfterUpload.js create mode 100644 models/lib/grid/createBucket.js create mode 100644 models/lib/grid/createObjectId.js diff --git a/models/lib/fsHooks/createInterceptDownload.js b/models/lib/fsHooks/createInterceptDownload.js new file mode 100644 index 000000000..5d1a7ee84 --- /dev/null +++ b/models/lib/fsHooks/createInterceptDownload.js @@ -0,0 +1,47 @@ +import { createObjectId } from '../grid/createObjectId'; + +const createInterceptDownload = bucket => + function interceptDownload(http, file, versionName) { + const { gridFsFileId } = file.versions[versionName].meta || {}; + if (gridFsFileId) { + // opens the download stream using a given gfs id + // see: http://mongodb.github.io/node-mongodb-native/3.2/api/GridFSBucket.html#openDownloadStream + const gfsId = createObjectId({ gridFsFileId }); + const readStream = bucket.openDownloadStream(gfsId); + + readStream.on('data', data => { + http.response.write(data); + }); + + readStream.on('end', () => { + http.response.end(); // don't pass parameters to end() or it will be attached to the file's binary stream + }); + + readStream.on('error', () => { + // not found probably + // eslint-disable-next-line no-param-reassign + http.response.statusCode = 404; + http.response.end('not found'); + }); + + http.response.setHeader('Cache-Control', this.cacheControl); + http.response.setHeader( + 'Content-Disposition', + getContentDisposition(file.name, http?.params?.query?.download), + ); + } + return Boolean(gridFsFileId); // Serve file from either GridFS or FS if it wasn't uploaded yet + }; + +/** + * Will initiate download, if links are called with ?download="true" queryparam. + **/ +const getContentDisposition = (name, downloadFlag) => { + const dispositionType = downloadFlag === 'true' ? 'attachment;' : 'inline;'; + + const encodedName = encodeURIComponent(fileName); + const dispositionName = `filename="${encodedName}"; filename=*UTF-8"${encodedName}";`; + const dispositionEncoding = 'charset=utf-8'; + + return `${dispositionType} ${dispositionName} ${dispositionEncoding}`; +}; diff --git a/models/lib/fsHooks/createOnAfterRemove.js b/models/lib/fsHooks/createOnAfterRemove.js new file mode 100644 index 000000000..297d49b5a --- /dev/null +++ b/models/lib/fsHooks/createOnAfterRemove.js @@ -0,0 +1,17 @@ +import { createObjectId } from '../grid/createObjectId'; + +const createOnAfterRemove = bucket => + function onAfterRemove(files) { + files.forEach(file => { + Object.keys(file.versions).forEach(versionName => { + const gridFsFileId = (file.versions[versionName].meta || {}) + .gridFsFileId; + if (gridFsFileId) { + const gfsId = createObjectId({ gridFsFileId }); + bucket.delete(gfsId, err => { + // if (err) console.error(err); + }); + } + }); + }); + }; diff --git a/models/lib/fsHooks/createOnAfterUpload.js b/models/lib/fsHooks/createOnAfterUpload.js new file mode 100644 index 000000000..f3efa652b --- /dev/null +++ b/models/lib/fsHooks/createOnAfterUpload.js @@ -0,0 +1,51 @@ +import { Meteor } from 'meteor/meteor'; +import fs from 'fs'; + +export const createOnAfterUpload = bucket => + function onAfterUpload(file) { + const self = this; + + // here you could manipulate your file + // and create a new version, for example a scaled 'thumbnail' + // ... + + // then we read all versions we have got so far + Object.keys(file.versions).forEach(versionName => { + const metadata = { ...file.meta, versionName, fileId: file._id }; + fs.createReadStream(file.versions[versionName].path) + + // this is where we upload the binary to the bucket using bucket.openUploadStream + // see http://mongodb.github.io/node-mongodb-native/3.2/api/GridFSBucket.html#openUploadStream + .pipe( + bucket.openUploadStream(file.name, { + contentType: file.type || 'binary/octet-stream', + metadata, + }), + ) + + // and we unlink the file from the fs on any error + // that occurred during the upload to prevent zombie files + .on('error', err => { + // console.error(err); + self.unlink(this.collection.findOne(file._id), versionName); // Unlink files from FS + }) + + // once we are finished, we attach the gridFS Object id on the + // FilesCollection document's meta section and finally unlink the + // upload file from the filesystem + .on( + 'finish', + Meteor.bindEnvironment(ver => { + const property = `versions.${versionName}.meta.gridFsFileId`; + + self.collection.update(file._id, { + $set: { + [property]: ver._id.toHexString(), + }, + }); + + self.unlink(this.collection.findOne(file._id), versionName); // Unlink files from FS + }), + ); + }); + }; diff --git a/models/lib/grid/createBucket.js b/models/lib/grid/createBucket.js new file mode 100644 index 000000000..d5da5a170 --- /dev/null +++ b/models/lib/grid/createBucket.js @@ -0,0 +1,9 @@ +import { MongoInternals } from 'meteor/mongo'; + +export const createBucket = bucketName => { + const options = bucketName ? { bucketName } : void 0; + return new MongoInternals.NpmModule.GridFSBucket( + MongoInternals.defaultRemoteCollectionDriver().mongo.db, + options, + ); +}; diff --git a/models/lib/grid/createObjectId.js b/models/lib/grid/createObjectId.js new file mode 100644 index 000000000..2e6703008 --- /dev/null +++ b/models/lib/grid/createObjectId.js @@ -0,0 +1,4 @@ +import { MongoInternals } from 'meteor/mongo'; + +export const createObjectId = ({ gridFsFileId }) => + new MongoInternals.NpmModule.ObjectID(gridFsFileId); From 1ae5bc482b7441cb1f4f381e719d4e24c333f910 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 17:05:40 -0500 Subject: [PATCH 024/246] Ref: Avatars to use modern gridfs --- models/avatars.js | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/models/avatars.js b/models/avatars.js index a0a47478a..b4c24ded8 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -1,32 +1,34 @@ -/* +import { Meteor } from 'meteor/meteor'; +import { FilesCollection } from 'meteor/ostrio:files'; +import { createBucket } from './lib/grid/createBucket'; +import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; +import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; +import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -Avatars = new FS.Collection('avatars', { - stores: [new FS.Store.GridFS('avatars')], - filter: { - maxSize: 520000, - allow: { - contentTypes: ['image/*'], - }, +const avatarsBucket = createBucket('avatars'); + +export const Avatars = new FilesCollection({ + debug: false, // Change to `true` for debugging + collectionName: 'avatars', + allowClientCode: false, + onBeforeUpload(file) { + if (file.size <= 72000 && file.isImage) return true; + return 'Please upload image, with size equal or less than 72KB'; }, + onAfterUpload: createOnAfterUpload(avatarsBucket), + interceptDownload: createInterceptDownload(avatarsBucket), + onAfterRemove: createOnAfterRemove(avatarsBucket), }); -function isOwner(userId, file) { - return userId && userId === file.userId; +function isOwner(userId, doc) { + return userId && userId === doc.userId; } Avatars.allow({ insert: isOwner, update: isOwner, remove: isOwner, - download() { - return true; - }, fetch: ['userId'], }); -Avatars.files.before.insert((userId, doc) => { - doc.userId = userId; -}); - export default Avatars; -*/ From c1dba5272036171362cf9420fba070b370a505c9 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 19:15:45 -0500 Subject: [PATCH 025/246] Ref: Attachments to use modern gridfs (rm localstore) --- models/attachments.js | 295 +++++++++--------------------------------- 1 file changed, 62 insertions(+), 233 deletions(-) diff --git a/models/attachments.js b/models/attachments.js index 451ff90d6..9e5a2e601 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -1,224 +1,20 @@ -/* +import { Meteor } from 'meteor/meteor'; +import { FilesCollection } from 'meteor/ostrio:files'; +import { createBucket } from './lib/grid/createBucket'; +import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; +import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; +import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -export const AttachmentStorage = new Mongo.Collection( - 'cfs_gridfs.attachments.files', -); -export const AvatarStorage = new Mongo.Collection('cfs_gridfs.avatars.files'); +const attachmentBucket = createBucket('attachments'); -const localFSStore = process.env.ATTACHMENTS_STORE_PATH; -const storeName = 'attachments'; -const defaultStoreOptions = { - beforeWrite: fileObj => { - if (!fileObj.isImage()) { - return { - type: 'application/octet-stream', - }; - } - return {}; - }, -}; -let store; -if (localFSStore) { - // have to reinvent methods from FS.Store.GridFS and FS.Store.FileSystem - const fs = Npm.require('fs'); - const path = Npm.require('path'); - const mongodb = Npm.require('mongodb'); - const Grid = Npm.require('gridfs-stream'); - // calulate the absolute path here, because FS.Store.FileSystem didn't expose the aboslutepath or FS.Store didn't expose api calls :( - let pathname = localFSStore; - // eslint camelcase: ["error", {allow: ["__meteor_bootstrap__"]}] +// XXX Enforce a schema for the Attachments FilesCollection +// see: https://github.com/VeliovGroup/Meteor-Files/wiki/Schema - if (!pathname && __meteor_bootstrap__ && __meteor_bootstrap__.serverDir) { - pathname = path.join( - __meteor_bootstrap__.serverDir, - `../../../cfs/files/${storeName}`, - ); - } - - if (!pathname) - throw new Error('FS.Store.FileSystem unable to determine path'); - - // Check if we have '~/foo/bar' - if (pathname.split(path.sep)[0] === '~') { - const homepath = - process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE; - if (homepath) { - pathname = pathname.replace('~', homepath); - } else { - throw new Error('FS.Store.FileSystem unable to resolve "~" in path'); - } - } - - // Set absolute path - const absolutePath = path.resolve(pathname); - - const _FStore = new FS.Store.FileSystem(storeName, { - path: localFSStore, - ...defaultStoreOptions, - }); - const GStore = { - fileKey(fileObj) { - const key = { - _id: null, - filename: null, - }; - - // If we're passed a fileObj, we retrieve the _id and filename from it. - if (fileObj) { - const info = fileObj._getInfo(storeName, { - updateFileRecordFirst: false, - }); - key._id = info.key || null; - key.filename = - info.name || - fileObj.name({ updateFileRecordFirst: false }) || - `${fileObj.collectionName}-${fileObj._id}`; - } - - // If key._id is null at this point, createWriteStream will let GridFS generate a new ID - return key; - }, - db: undefined, - mongoOptions: { useNewUrlParser: true }, - mongoUrl: process.env.MONGO_URL, - init() { - this._init(err => { - this.inited = !err; - }); - }, - _init(callback) { - const self = this; - mongodb.MongoClient.connect(self.mongoUrl, self.mongoOptions, function( - err, - db, - ) { - if (err) { - return callback(err); - } - self.db = db; - return callback(null); - }); - return; - }, - createReadStream(fileKey, options) { - const self = this; - if (!self.inited) { - self.init(); - return undefined; - } - options = options || {}; - - // Init GridFS - const gfs = new Grid(self.db, mongodb); - - // Set the default streamning settings - const settings = { - _id: new mongodb.ObjectID(fileKey._id), - root: `cfs_gridfs.${storeName}`, - }; - - // Check if this should be a partial read - if ( - typeof options.start !== 'undefined' && - typeof options.end !== 'undefined' - ) { - // Add partial info - settings.range = { - startPos: options.start, - endPos: options.end, - }; - } - return gfs.createReadStream(settings); - }, - }; - GStore.init(); - const CRS = 'createReadStream'; - const _CRS = `_${CRS}`; - const FStore = _FStore._transform; - FStore[_CRS] = FStore[CRS].bind(FStore); - FStore[CRS] = function(fileObj, options) { - let stream; - try { - const localFile = path.join( - absolutePath, - FStore.storage.fileKey(fileObj), - ); - const state = fs.statSync(localFile); - if (state) { - stream = FStore[_CRS](fileObj, options); - } - } catch (e) { - // file is not there, try GridFS ? - stream = undefined; - } - if (stream) return stream; - else { - try { - const stream = GStore[CRS](GStore.fileKey(fileObj), options); - return stream; - } catch (e) { - return undefined; - } - } - }.bind(FStore); - store = _FStore; -} else { - store = new FS.Store.GridFS(localFSStore ? `G${storeName}` : storeName, { - // XXX Add a new store for cover thumbnails so we don't load big images in - // the general board view - // If the uploaded document is not an image we need to enforce browser - // download instead of execution. This is particularly important for HTML - // files that the browser will just execute if we don't serve them with the - // appropriate `application/octet-stream` MIME header which can lead to user - // data leaks. I imagine other formats (like PDF) can also be attack vectors. - // See https://github.com/wekan/wekan/issues/99 - // XXX Should we use `beforeWrite` option of CollectionFS instead of - // collection-hooks? - // We should use `beforeWrite`. - ...defaultStoreOptions, - }); -} -Attachments = new FS.Collection('attachments', { - stores: [store], -}); - - - -if (Meteor.isServer) { - Meteor.startup(() => { - Attachments.files.createIndex({ cardId: 1 }); - }); - - Attachments.allow({ - insert(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); - }, - update(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); - }, - remove(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); - }, - // We authorize the attachment download either: - // - if the board is public, everyone (even unconnected) can download it - // - if the board is private, only board members can download it - download(userId, doc) { - const board = Boards.findOne(doc.boardId); - if (board.isPublic()) { - return true; - } else { - return board.hasMember(userId); - } - }, - - fetch: ['boardId'], - }); -} - -// XXX Enforce a schema for the Attachments CollectionFS - -if (Meteor.isServer) { - Attachments.files.after.insert((userId, doc) => { +export const Attachments = new FilesCollection({ + debug: false, // Change to `true` for debugging + collectionName: 'attachments', + allowClientCode: false, + onAfterUpload(doc) { // If the attachment doesn't have a source field // or its source is different than import if (!doc.source || doc.source !== 'import') { @@ -250,24 +46,57 @@ if (Meteor.isServer) { }, ); } + createOnAfterUpload(attachmentBucket)(doc); + }, + interceptDownload: createInterceptDownload(attachmentBucket), + onAfterRemove(docs) { + docs.forEach(function(doc) { + Activities.insert({ + userId: doc.userId, + type: 'card', + activityType: 'deleteAttachment', + attachmentId: doc._id, + // this preserves the name so that notifications can be meaningful after + // this file is removed + attachmentName: doc.original.name, + boardId: doc.boardId, + cardId: doc.cardId, + listId: doc.listId, + swimlaneId: doc.swimlaneId, + }); + }); + createOnAfterRemove(attachmentBucket)(docs); + }, + // We authorize the attachment download either: + // - if the board is public, everyone (even unconnected) can download it + // - if the board is private, only board members can download it + downloadCallback(doc) { + const board = Boards.findOne(doc.boardId); + if (board.isPublic()) { + return true; + } else { + return board.hasMember(this.userId); + } + }, +}); + +if (Meteor.isServer) { + Attachments.allow({ + insert(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + update(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + remove(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + fetch: ['boardId'], }); - Attachments.files.before.remove((userId, doc) => { - Activities.insert({ - userId, - type: 'card', - activityType: 'deleteAttachment', - attachmentId: doc._id, - // this preserves the name so that notifications can be meaningful after - // this file is removed - attachmentName: doc.original.name, - boardId: doc.boardId, - cardId: doc.cardId, - listId: doc.listId, - swimlaneId: doc.swimlaneId, - }); + Meteor.startup(() => { + Attachments.collection._ensureIndex({ cardId: 1 }); }); } export default Attachments; -*/ From 3f8a3f26d6d11bb660032d3bc40c261e37958be9 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 19:21:22 -0500 Subject: [PATCH 026/246] rm ATTACHMENTS_STORE_PATH --- Dockerfile | 1 - docker-compose.yml | 4 ---- snap-src/bin/config | 6 +----- snap-src/bin/wekan-help | 6 ------ torodb-postgresql/docker-compose.yml | 4 ---- 5 files changed, 1 insertion(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index c24fd8ef2..be708d09b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,6 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \ RICHER_CARD_COMMENT_EDITOR=false \ CARD_OPENED_WEBHOOK_ENABLED=false \ - ATTACHMENTS_STORE_PATH="" \ MAX_IMAGE_PIXEL="" \ IMAGE_COMPRESS_RATIO="" \ NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \ diff --git a/docker-compose.yml b/docker-compose.yml index b22f78980..53c114a69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -247,10 +247,6 @@ services: # Defaults below. Uncomment to change. wekan/server/accounts-common.js # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 #--------------------------------------------------------------- - # ==== STORE ATTACHMENT ON SERVER FILESYSTEM INSTEAD OF MONGODB ==== - # https://github.com/wekan/wekan/pull/2603 - #- ATTACHMENTS_STORE_PATH = <pathname> # pathname can be relative or fullpath - #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 - RICHER_CARD_COMMENT_EDITOR=false diff --git a/snap-src/bin/config b/snap-src/bin/config index abe36522c..44ef62f70 100755 --- a/snap-src/bin/config +++ b/snap-src/bin/config @@ -3,7 +3,7 @@ # All supported keys are defined here together with descriptions and default values # list of supported keys -keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM MAIL_SERVICE MAIL_SERVICE_USER MAIL_SERVICE_PASSWORD ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_AD_SIMPLE_AUTH LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE WAIT_SPINNER NODE_OPTIONS" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM MAIL_SERVICE MAIL_SERVICE_USER MAIL_SERVICE_PASSWORD ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_AD_SIMPLE_AUTH LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE WAIT_SPINNER NODE_OPTIONS" #--------------------------------------------------------------------- @@ -126,10 +126,6 @@ DESCRIPTION_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="Accounts common login expi DEFAULT_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="90" KEY_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="accounts-common-login-expiration-in-days" -DESCRIPTION_ATTACHMENTS_STORE_PATH="Allow wekan ower to specify where uploaded files to store on the server instead of the mongodb" -DEFAULT_ATTACHMENTS_STORE_PATH="" -KEY_ATTACHMENTS_STORE_PATH="attachments-store-path" - # Example, not in use: /var/snap/wekan/common/uploads/ DESCRIPTION_MAX_IMAGE_PIXEL="Max image pixel: Allow to shrink attached/pasted image https://github.com/wekan/wekan/pull/2544" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 9414d2ec5..76842f7d4 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -131,12 +131,6 @@ echo -e "\t$ snap set $SNAP_NAME image-compress-ratio='80'" echo -e "Disable:" echo -e "\t$ snap unset $SNAP_NAME image-compress-ratio" echo -e "\n" -echo -e "Allow to set attachment upload into specified server location. Create that directory first. https://github.com/wekan/wekan/pull/2603" -echo -e "Example:" -echo -e "\t$ snap set $SNAP_NAME attachments-store-path='/var/snap/wekan/common/attachments'" -echo -e "Disable:" -echo -e "\t$ snap unset $SNAP_NAME attachments-store-path" -echo -e "\n" echo -e "NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE https://github.com/wekan/wekan/pull/2998" echo -e "Number of days after a notification is read before we remove it. Default: 2." echo -e "Example:" diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index ef9f1af0d..8a882ef86 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -252,10 +252,6 @@ services: # Defaults below. Uncomment to change. wekan/server/accounts-common.js # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 #--------------------------------------------------------------- - # ==== STORE ATTACHMENT ON SERVER FILESYSTEM INSTEAD OF MONGODB ==== - # https://github.com/wekan/wekan/pull/2603 - #- ATTACHMENTS_STORE_PATH = <pathname> # pathname can be relative or fullpath - #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 - RICHER_CARD_COMMENT_EDITOR=false From b49aaf8e68d95b2fdb6b134a61f8c03e2569480d Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 21:12:52 -0500 Subject: [PATCH 027/246] Ref: Avatar upload handler --- client/components/users/userAvatar.js | 43 +++++++++++++-------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 5ae4ea0d0..84ae07d77 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -223,28 +223,27 @@ BlazeComponent.extendComponent({ this.$('.js-upload-avatar-input').click(); }, 'change .js-upload-avatar-input'(event) { - let file, fileUrl; - - FS.Utility.eachFile(event, f => { - try { - file = Avatars.insert(new FS.File(f)); - fileUrl = file.url(this.avatarUrlOptions()); - } catch (e) { - this.setError('avatar-too-big'); - } - }); - - if (fileUrl) { - this.setError(''); - const fetchAvatarInterval = window.setInterval(() => { - $.ajax({ - url: fileUrl, - success: () => { - this.setAvatar(file.url(this.avatarUrlOptions())); - window.clearInterval(fetchAvatarInterval); - }, - }); - }, 100); + const self = this; + if (event.currentTarget.files && event.currentTarget.files[0]) { + const uploader = Avatars.insert( + { + file: event.currentTarget.files[0], + streams: 'dynamic', + chunkSize: 'dynamic', + }, + false, + ); + uploader.on('uploaded', (error, fileObj) => { + if (!error) { + self.setAvatar(fileObj.path); + // self.setAvatar(this.currentData().url(this.avatarUrlOptions())); + } + }); + uploader.on('error', (error, fileObj) => { + // XXX check for actually returned error + self.setError('avatar-too-big'); + }); + uploader.start(); } }, 'click .js-select-avatar'() { From ccbc53cb9b1c9f3a354daf262714fdb37860db2f Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 22:17:58 -0500 Subject: [PATCH 028/246] Ref: Attachment upload handlers --- client/components/cards/attachments.js | 60 ++++++++------------------ client/components/main/editor.js | 55 +++++++++-------------- client/lib/utils.js | 14 +----- 3 files changed, 41 insertions(+), 88 deletions(-) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index 89ce1ee71..32c85e892 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -63,50 +63,28 @@ Template.previewAttachedImagePopup.events({ Template.cardAttachmentsPopup.events({ 'change .js-attach-file'(event) { const card = this; - const processFile = f => { - Utils.processUploadedAttachment(card, f, attachment => { - if (attachment && attachment._id && attachment.isImage()) { - card.setCover(attachment._id); + if (event.currentTarget.files && event.currentTarget.files[0]) { + const uploader = Attachments.insert( + { + file: event.currentTarget.files[0], + streams: 'dynamic', + chunkSize: 'dynamic', + }, + false, + ); + uploader.on('uploaded', (error, fileObj) => { + if (!error) { + if (fileObj.isImage) { + card.setCover(fileObj._id); + } + Utils.addCommonMetaToAttachment(card, fileObj); } + }); + uploader.on('end', (error, fileObj) => { Popup.back(); }); - }; - - FS.Utility.eachFile(event, f => { - if ( - MAX_IMAGE_PIXEL > 0 && - typeof f.type === 'string' && - f.type.match(/^image/) - ) { - // is image - const reader = new FileReader(); - reader.onload = function(e) { - const dataurl = e && e.target && e.target.result; - if (dataurl !== undefined) { - Utils.shrinkImage({ - dataurl, - maxSize: MAX_IMAGE_PIXEL, - ratio: COMPRESS_RATIO, - toBlob: true, - callback(blob) { - if (blob === false) { - processFile(f); - } else { - blob.name = f.name; - processFile(blob); - } - }, - }); - } else { - // couldn't process it let other function handle it? - processFile(f); - } - }; - reader.readAsDataURL(f); - } else { - processFile(f); - } - }); + uploader.start(); + } }, 'click .js-computer-upload'(event, templateInstance) { templateInstance.find('.js-attach-file').click(); diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 6c81fe32d..dca0f3da5 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -153,7 +153,6 @@ BlazeComponent.extendComponent({ }); } }, - onImageUpload(files) { const $summernote = getSummernote(this); if (files && files.length > 0) { @@ -162,45 +161,31 @@ BlazeComponent.extendComponent({ const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL; const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO; const insertImage = src => { - // process all image upload types to the description/comment window const img = document.createElement('img'); img.src = src; img.setAttribute('width', '100%'); $summernote.summernote('insertNode', img); }; - const processData = function(fileObj) { - Utils.processUploadedAttachment( - currentCard, - fileObj, - attachment => { - if ( - attachment && - attachment._id && - attachment.isImage() - ) { - attachment.one('uploaded', function() { - const maxTry = 3; - const checkItvl = 500; - let retry = 0; - const checkUrl = function() { - // even though uploaded event fired, attachment.url() is still null somehow //TODO - const url = attachment.url(); - if (url) { - insertImage( - `${location.protocol}//${location.host}${url}`, - ); - } else { - retry++; - if (retry < maxTry) { - setTimeout(checkUrl, checkItvl); - } - } - }; - checkUrl(); - }); - } + const processUpload = function(file) { + const uploader = Attachments.insert( + { + file, + streams: 'dynamic', + chunkSize: 'dynamic', }, + false, ); + uploader.on('uploaded', (error, fileObj) => { + if (!error) { + if (fileObj.isImage) { + insertImage( + `${location.protocol}//${location.host}${fileObj.path}`, + ); + } + Utils.addCommonMetaToAttachment(currentCard, fileObj); + } + }); + uploader.start(); }; if (MAX_IMAGE_PIXEL) { const reader = new FileReader(); @@ -216,7 +201,7 @@ BlazeComponent.extendComponent({ callback(blob) { if (blob !== false) { blob.name = image.name; - processData(blob); + processUpload(blob); } }, }); @@ -224,7 +209,7 @@ BlazeComponent.extendComponent({ }; reader.readAsDataURL(image); } else { - processData(image); + processUpload(image); } } }, diff --git a/client/lib/utils.js b/client/lib/utils.js index eb53a6a4c..52c8ac496 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -164,16 +164,7 @@ Utils = { }, MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL, COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO, - processUploadedAttachment(card, fileObj, callback) { - const next = attachment => { - if (typeof callback === 'function') { - callback(attachment); - } - }; - if (!card) { - return next(); - } - const file = new FS.File(fileObj); + addCommonMetaToAttachment(card, file) { if (card.isLinkedCard()) { file.boardId = Cards.findOne(card.linkedId).boardId; file.cardId = card.linkedId; @@ -185,9 +176,8 @@ Utils = { } file.userId = Meteor.userId(); if (file.original) { - file.original.name = fileObj.name; + file.original.name = file.name; } - return next(Attachments.insert(file)); }, shrinkImage(options) { // shrink image to certain size From f8d927c61a1cd9a485e38a1a5ce8e7578e85f473 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 23:02:39 -0500 Subject: [PATCH 029/246] Ref: trello & wekan importers --- models/trelloCreator.js | 66 ++++++++++++++------------------ models/wekanCreator.js | 85 ++++++++++------------------------------- 2 files changed, 48 insertions(+), 103 deletions(-) diff --git a/models/trelloCreator.js b/models/trelloCreator.js index 5f591c46a..02d9affef 100644 --- a/models/trelloCreator.js +++ b/models/trelloCreator.js @@ -425,46 +425,36 @@ export class TrelloCreator { } const attachments = this.attachments[card.id]; const trelloCoverId = card.idAttachmentCover; - if (attachments) { - const links = []; + // Simulating file.attachData on the client generates multiple errors + // - HEAD returns null, which causes exception down the line + // - the template then tries to display the url to the attachment which causes other errors + // so we make it server only, and let UI catch up once it is done, forget about latency comp. + if (attachments && Meteor.isServer) { attachments.forEach(att => { - // if the attachment `name` and `url` are the same, then the - // attachment is an attached link - if (att.name === att.url) { - links.push(att.url); - } else { - const file = new FS.File(); - // Simulating file.attachData on the client generates multiple errors - // - HEAD returns null, which causes exception down the line - // - the template then tries to display the url to the attachment which causes other errors - // so we make it server only, and let UI catch up once it is done, forget about latency comp. - const self = this; - if (Meteor.isServer) { - file.attachData(att.url, function(error) { - file.boardId = boardId; - file.cardId = cardId; - file.userId = self._user(att.idMemberCreator); - // The field source will only be used to prevent adding - // attachments' related activities automatically - file.source = 'import'; - if (error) { - throw error; - } else { - const wekanAtt = Attachments.insert(file, () => { - // we do nothing - }); - self.attachmentIds[att.id] = wekanAtt._id; - // - if (trelloCoverId === att.id) { - Cards.direct.update(cardId, { - $set: { coverId: wekanAtt._id }, - }); - } - } - }); - } + // Simulating file.attachData on the client generates multiple errors + // - HEAD returns null, which causes exception down the line + // - the template then tries to display the url to the attachment which causes other errors + // so we make it server only, and let UI catch up once it is done, forget about latency comp. + const self = this; + if (att.url) { + Attachment.load(att.url, (error, fileObj) => { + if (error) { + throw error; + } + fileObj.boardId = boardId; + fileObj.cardId = cardId; + fileObj.userId = self._user(att.userId); + // The field source will only be used to prevent adding + // attachments' related activities automatically + fileObj.source = 'import'; + self.attachmentIds[att._id] = fileObj._id; + if (trelloCoverId === att.id) { + Cards.direct.update(cardId, { + $set: { coverId: fileObj._id }, + }); + } + }); } - // todo XXX set cover - if need be }); if (links.length) { diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 7aaf7f6eb..1414fd87d 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -446,81 +446,36 @@ export class WekanCreator { } const attachments = this.attachments[card._id]; const wekanCoverId = card.coverId; - if (attachments) { + if (attachments && Meteor.isServer) { attachments.forEach(att => { - const file = new FS.File(); // Simulating file.attachData on the client generates multiple errors // - HEAD returns null, which causes exception down the line // - the template then tries to display the url to the attachment which causes other errors // so we make it server only, and let UI catch up once it is done, forget about latency comp. const self = this; - if (Meteor.isServer) { - if (att.url) { - file.attachData(att.url, function(error) { - file.boardId = boardId; - file.cardId = cardId; - file.userId = self._user(att.userId); - // The field source will only be used to prevent adding - // attachments' related activities automatically - file.source = 'import'; + if (att.url || att.file) { + Attachment.load( + att.url ? att.url : Buffer.from(att.file, 'base64'), + { type: att.type ? att.ype : undefined }, + (error, fileObj) => { if (error) { throw error; - } else { - const wekanAtt = Attachments.insert(file, () => { - // we do nothing - }); - self.attachmentIds[att._id] = wekanAtt._id; - // - if (wekanCoverId === att._id) { - Cards.direct.update(cardId, { - $set: { - coverId: wekanAtt._id, - }, - }); - } } - }); - } else if (att.file) { - //If attribute type is null or empty string is set, assume binary stream - att.type = - !att.type || att.type.trim().length === 0 - ? 'application/octet-stream' - : att.type; - - file.attachData( - Buffer.from(att.file, 'base64'), - { - type: att.type, - }, - error => { - file.name(att.name); - file.boardId = boardId; - file.cardId = cardId; - file.userId = self._user(att.userId); - // The field source will only be used to prevent adding - // attachments' related activities automatically - file.source = 'import'; - if (error) { - throw error; - } else { - const wekanAtt = Attachments.insert(file, () => { - // we do nothing - }); - this.attachmentIds[att._id] = wekanAtt._id; - // - if (wekanCoverId === att._id) { - Cards.direct.update(cardId, { - $set: { - coverId: wekanAtt._id, - }, - }); - } - } - }, - ); - } + fileObj.boardId = boardId; + fileObj.cardId = cardId; + fileObj.userId = self._user(att.userId); + // The field source will only be used to prevent adding + // attachments' related activities automatically + fileObj.source = 'import'; + self.attachmentIds[att._id] = fileObj._id; + if (wekanCoverId === att._id) { + Cards.direct.update(cardId, { + $set: { coverId: fileObj._id }, + }); + } + }, + ); } - // todo XXX set cover - if need be }); } result.push(cardId); From 76ffdd70d074b696e1250bfead160011832929ef Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 23:03:20 -0500 Subject: [PATCH 030/246] Ref: attachment image paste --- client/components/cards/attachments.js | 42 ++++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index 32c85e892..f9907ebf3 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -67,7 +67,6 @@ Template.cardAttachmentsPopup.events({ const uploader = Attachments.insert( { file: event.currentTarget.files[0], - streams: 'dynamic', chunkSize: 'dynamic', }, false, @@ -136,26 +135,29 @@ Template.previewClipboardImagePopup.events({ if (results && results.file) { window.oPasted = pastedResults; const card = this; - const file = new FS.File(results.file); - if (!results.name) { - // if no filename, it's from clipboard. then we give it a name, with ext name from MIME type - if (typeof results.file.type === 'string') { - file.name(results.file.type.replace('image/', 'clipboard.')); + const uploader = Attachments.insert( + { + file: results.file, + fileName: + results.name || results.file.type.replace('image/', 'clipboard.'), + chunkSize: 'dynamic', + }, + false, + ); + uploader.on('uploaded', (error, fileObj) => { + if (!error) { + if (fileObj.isImage) { + card.setCover(fileObj._id); + } + Utils.addCommonMetaToAttachment(card, fileObj); } - } - file.updatedAt(new Date()); - file.boardId = card.boardId; - file.cardId = card._id; - file.userId = Meteor.userId(); - const attachment = Attachments.insert(file); - - if (attachment && attachment._id && attachment.isImage()) { - card.setCover(attachment._id); - } - - pastedResults = null; - $(document.body).pasteImageReader(() => {}); - Popup.back(); + }); + uploader.on('end', (error, fileObj) => { + pastedResults = null; + $(document.body).pasteImageReader(() => {}); + Popup.back(); + }); + uploader.start(); } }, }); From 38135549187dad76516720095b13962f922cf0f4 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 21:12:52 -0500 Subject: [PATCH 031/246] Ref: Avatar upload handler --- client/components/users/userAvatar.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 84ae07d77..1fda3a64d 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -228,7 +228,6 @@ BlazeComponent.extendComponent({ const uploader = Avatars.insert( { file: event.currentTarget.files[0], - streams: 'dynamic', chunkSize: 'dynamic', }, false, From 6a9433593b99a1e0b69958259537687f35cf91c4 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Sun, 13 Sep 2020 22:17:58 -0500 Subject: [PATCH 032/246] Ref: Attachment upload handlers --- client/components/main/editor.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/components/main/editor.js b/client/components/main/editor.js index dca0f3da5..aa32a733a 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -170,7 +170,6 @@ BlazeComponent.extendComponent({ const uploader = Attachments.insert( { file, - streams: 'dynamic', chunkSize: 'dynamic', }, false, From 97356603aa540ffd9123c47542405a84afd01d24 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Mon, 14 Sep 2020 01:07:17 -0500 Subject: [PATCH 033/246] Ref: original & and use fileObj.meta fileObj.meta is part of the ostrio:files API and be passed to the constructor. This is less hacky than trying tu update a persistet object after the fact. --- client/components/cards/attachments.js | 31 +++++---- client/components/main/editor.js | 19 ++---- client/components/users/userAvatar.jade | 2 +- client/components/users/userAvatar.js | 6 +- client/lib/utils.js | 28 ++++---- models/activities.js | 2 +- models/attachments.js | 89 +++++++++---------------- models/exporter.js | 6 +- models/trelloCreator.js | 48 +++++++------ models/wekanCreator.js | 50 +++++++------- 10 files changed, 123 insertions(+), 158 deletions(-) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index f9907ebf3..aa6175c6e 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -67,19 +67,19 @@ Template.cardAttachmentsPopup.events({ const uploader = Attachments.insert( { file: event.currentTarget.files[0], + meta: Utils.getCommonAttachmentMetaFrom(card), chunkSize: 'dynamic', }, false, ); - uploader.on('uploaded', (error, fileObj) => { + uploader.on('uploaded', (error, fileRef) => { if (!error) { - if (fileObj.isImage) { - card.setCover(fileObj._id); + if (fileRef.isImage) { + card.setCover(fileRef._id); } - Utils.addCommonMetaToAttachment(card, fileObj); } }); - uploader.on('end', (error, fileObj) => { + uploader.on('end', (error, fileRef) => { Popup.back(); }); uploader.start(); @@ -131,28 +131,27 @@ Template.previewClipboardImagePopup.onRendered(() => { Template.previewClipboardImagePopup.events({ 'click .js-upload-pasted-image'() { - const results = pastedResults; - if (results && results.file) { + const card = this; + if (pastedResults && pastedResults.file) { + const file = pastedResults.file; window.oPasted = pastedResults; - const card = this; const uploader = Attachments.insert( { - file: results.file, - fileName: - results.name || results.file.type.replace('image/', 'clipboard.'), + file, + meta: Utils.getCommonAttachmentMetaFrom(card), + fileName: file.name || file.type.replace('image/', 'clipboard.'), chunkSize: 'dynamic', }, false, ); - uploader.on('uploaded', (error, fileObj) => { + uploader.on('uploaded', (error, fileRef) => { if (!error) { - if (fileObj.isImage) { - card.setCover(fileObj._id); + if (fileRef.isImage) { + card.setCover(fileRef._id); } - Utils.addCommonMetaToAttachment(card, fileObj); } }); - uploader.on('end', (error, fileObj) => { + uploader.on('end', (error, fileRef) => { pastedResults = null; $(document.body).pasteImageReader(() => {}); Popup.back(); diff --git a/client/components/main/editor.js b/client/components/main/editor.js index aa32a733a..94da9a8eb 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -160,28 +160,23 @@ BlazeComponent.extendComponent({ const currentCard = Utils.getCurrentCard(); const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL; const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO; - const insertImage = src => { - const img = document.createElement('img'); - img.src = src; - img.setAttribute('width', '100%'); - $summernote.summernote('insertNode', img); - }; const processUpload = function(file) { const uploader = Attachments.insert( { file, + meta: Utils.getCommonAttachmentMetaFrom(card), chunkSize: 'dynamic', }, false, ); - uploader.on('uploaded', (error, fileObj) => { + uploader.on('uploaded', (error, fileRef) => { if (!error) { - if (fileObj.isImage) { - insertImage( - `${location.protocol}//${location.host}${fileObj.path}`, - ); + if (fileRef.isImage) { + const img = document.createElement('img'); + img.src = fileRef.link(); + img.setAttribute('width', '100%'); + $summernote.summernote('insertNode', img); } - Utils.addCommonMetaToAttachment(currentCard, fileObj); } }); uploader.start(); diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade index 84718fe74..aaf41af23 100644 --- a/client/components/users/userAvatar.jade +++ b/client/components/users/userAvatar.jade @@ -93,7 +93,7 @@ template(name="changeAvatarPopup") unless isSelected a.js-delete-avatar {{_ 'delete'}} | - - = original.name + = name li: a.js-select-initials .member +userAvatarInitials(userId=currentUser._id) diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 1fda3a64d..0d92a754e 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -232,13 +232,13 @@ BlazeComponent.extendComponent({ }, false, ); - uploader.on('uploaded', (error, fileObj) => { + uploader.on('uploaded', (error, fileRef) => { if (!error) { - self.setAvatar(fileObj.path); + self.setAvatar(fileRef.path); // self.setAvatar(this.currentData().url(this.avatarUrlOptions())); } }); - uploader.on('error', (error, fileObj) => { + uploader.on('error', (error, fileData) => { // XXX check for actually returned error self.setError('avatar-too-big'); }); diff --git a/client/lib/utils.js b/client/lib/utils.js index 52c8ac496..f7cf640b4 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -162,23 +162,21 @@ Utils = { }) ); }, + getCommonAttachmentMetaFrom(card) { + let meta; + if (card.isLinkedCard()) { + meta.boardId = Cards.findOne(card.linkedId).boardId; + meta.cardId = card.linkedId; + } else { + meta.boardId = card.boardId; + meta.swimlaneId = card.swimlaneId; + meta.listId = card.listId; + meta.cardId = card._id; + } + return meta; + }, MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL, COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO, - addCommonMetaToAttachment(card, file) { - if (card.isLinkedCard()) { - file.boardId = Cards.findOne(card.linkedId).boardId; - file.cardId = card.linkedId; - } else { - file.boardId = card.boardId; - file.swimlaneId = card.swimlaneId; - file.listId = card.listId; - file.cardId = card._id; - } - file.userId = Meteor.userId(); - if (file.original) { - file.original.name = file.name; - } - }, shrinkImage(options) { // shrink image to certain size const dataurl = options.dataurl, diff --git a/models/activities.js b/models/activities.js index fd456cbbf..51a1f272b 100644 --- a/models/activities.js +++ b/models/activities.js @@ -242,7 +242,7 @@ if (Meteor.isServer) { } if (activity.attachmentId) { const attachment = activity.attachment(); - params.attachment = attachment.original.name; + params.attachment = attachment.name; params.attachmentId = attachment._id; } if (activity.checklistId) { diff --git a/models/attachments.js b/models/attachments.js index 9e5a2e601..a272a159b 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -7,6 +7,21 @@ import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; const attachmentBucket = createBucket('attachments'); +const insertActivity = (fileObj, activityType) => + Activities.insert({ + userId: fileObj.userId, + type: 'card', + activityType, + attachmentId: fileObj._id, + // this preserves the name so that notifications can be meaningful after + // this file is removed + attachmentName: fileObj.name, + boardId: fileObj.meta.boardId, + cardId: fileObj.meta.cardId, + listId: fileObj.meta.listId, + swimlaneId: fileObj.meta.swimlaneId, + }); + // XXX Enforce a schema for the Attachments FilesCollection // see: https://github.com/VeliovGroup/Meteor-Files/wiki/Schema @@ -14,84 +29,46 @@ export const Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', allowClientCode: false, - onAfterUpload(doc) { + onAfterUpload(fileRef) { + createOnAfterUpload(attachmentBucket)(fileRef); // If the attachment doesn't have a source field // or its source is different than import - if (!doc.source || doc.source !== 'import') { + if (!fileRef.meta.source || fileRef.meta.source !== 'import') { // Add activity about adding the attachment - Activities.insert({ - userId, - type: 'card', - activityType: 'addAttachment', - attachmentId: doc._id, - // this preserves the name so that notifications can be meaningful after - // this file is removed - attachmentName: doc.original.name, - boardId: doc.boardId, - cardId: doc.cardId, - listId: doc.listId, - swimlaneId: doc.swimlaneId, - }); - } else { - // Don't add activity about adding the attachment as the activity - // be imported and delete source field - Attachments.update( - { - _id: doc._id, - }, - { - $unset: { - source: '', - }, - }, - ); + insertActivity(fileRef, 'addAttachment'); } - createOnAfterUpload(attachmentBucket)(doc); }, interceptDownload: createInterceptDownload(attachmentBucket), - onAfterRemove(docs) { - docs.forEach(function(doc) { - Activities.insert({ - userId: doc.userId, - type: 'card', - activityType: 'deleteAttachment', - attachmentId: doc._id, - // this preserves the name so that notifications can be meaningful after - // this file is removed - attachmentName: doc.original.name, - boardId: doc.boardId, - cardId: doc.cardId, - listId: doc.listId, - swimlaneId: doc.swimlaneId, - }); + onAfterRemove(files) { + createOnAfterRemove(attachmentBucket)(files); + files.forEach(fileObj => { + insertActivity(fileObj, 'deleteAttachment'); }); - createOnAfterRemove(attachmentBucket)(docs); }, // We authorize the attachment download either: // - if the board is public, everyone (even unconnected) can download it // - if the board is private, only board members can download it - downloadCallback(doc) { - const board = Boards.findOne(doc.boardId); + protected(fileObj) { + const board = Boards.findOne(fileObj.meta.boardId); if (board.isPublic()) { return true; - } else { - return board.hasMember(this.userId); } + return board.hasMember(this.userId); }, }); if (Meteor.isServer) { Attachments.allow({ - insert(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + insert(userId, fileObj) { + return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId)); }, - update(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + update(userId, fileObj) { + return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId)); }, - remove(userId, doc) { - return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + remove(userId, fileObj) { + return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId)); }, - fetch: ['boardId'], + fetch: ['meta'], }); Meteor.startup(() => { diff --git a/models/exporter.js b/models/exporter.js index 4aefa4153..ceb32d3ab 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -80,11 +80,11 @@ export class Exporter { return { _id: attachment._id, - cardId: attachment.cardId, + cardId: attachment.meta.cardId, //url: FlowRouter.url(attachment.url()), file: filebase64, - name: attachment.original.name, - type: attachment.original.type, + name: attachment.name, + type: attachment.type, }; }); //When has a especific valid attachment return the single element diff --git a/models/trelloCreator.js b/models/trelloCreator.js index 02d9affef..5c883a5fe 100644 --- a/models/trelloCreator.js +++ b/models/trelloCreator.js @@ -425,35 +425,33 @@ export class TrelloCreator { } const attachments = this.attachments[card.id]; const trelloCoverId = card.idAttachmentCover; - // Simulating file.attachData on the client generates multiple errors - // - HEAD returns null, which causes exception down the line - // - the template then tries to display the url to the attachment which causes other errors - // so we make it server only, and let UI catch up once it is done, forget about latency comp. if (attachments && Meteor.isServer) { attachments.forEach(att => { - // Simulating file.attachData on the client generates multiple errors - // - HEAD returns null, which causes exception down the line - // - the template then tries to display the url to the attachment which causes other errors - // so we make it server only, and let UI catch up once it is done, forget about latency comp. const self = this; + const opts = { + type: att.type ? att.type : undefined, + userId: self._user(att.userId), + meta: { + boardId, + cardId, + source: 'import', + }, + }; + const cb = (error, fileObj) => { + if (error) { + throw error; + } + self.attachmentIds[att._id] = fileObj._id; + if (trelloCoverId === att._id) { + Cards.direct.update(cardId, { + $set: { coverId: fileObj._id }, + }); + } + }; if (att.url) { - Attachment.load(att.url, (error, fileObj) => { - if (error) { - throw error; - } - fileObj.boardId = boardId; - fileObj.cardId = cardId; - fileObj.userId = self._user(att.userId); - // The field source will only be used to prevent adding - // attachments' related activities automatically - fileObj.source = 'import'; - self.attachmentIds[att._id] = fileObj._id; - if (trelloCoverId === att.id) { - Cards.direct.update(cardId, { - $set: { coverId: fileObj._id }, - }); - } - }); + Attachment.load(att.url, opts, cb, true); + } else if (att.file) { + Attachment.write(att.file, opts, cb, true); } }); diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 1414fd87d..c643d8ddd 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -448,33 +448,31 @@ export class WekanCreator { const wekanCoverId = card.coverId; if (attachments && Meteor.isServer) { attachments.forEach(att => { - // Simulating file.attachData on the client generates multiple errors - // - HEAD returns null, which causes exception down the line - // - the template then tries to display the url to the attachment which causes other errors - // so we make it server only, and let UI catch up once it is done, forget about latency comp. const self = this; - if (att.url || att.file) { - Attachment.load( - att.url ? att.url : Buffer.from(att.file, 'base64'), - { type: att.type ? att.ype : undefined }, - (error, fileObj) => { - if (error) { - throw error; - } - fileObj.boardId = boardId; - fileObj.cardId = cardId; - fileObj.userId = self._user(att.userId); - // The field source will only be used to prevent adding - // attachments' related activities automatically - fileObj.source = 'import'; - self.attachmentIds[att._id] = fileObj._id; - if (wekanCoverId === att._id) { - Cards.direct.update(cardId, { - $set: { coverId: fileObj._id }, - }); - } - }, - ); + const opts = { + type: att.type ? att.type : undefined, + userId: self._user(att.userId), + meta: { + boardId, + cardId, + source: 'import', + }, + }; + const cb = (error, fileObj) => { + if (error) { + throw error; + } + self.attachmentIds[att._id] = fileObj._id; + if (wekanCoverId === att._id) { + Cards.direct.update(cardId, { + $set: { coverId: fileObj._id }, + }); + } + }; + if (att.url) { + Attachment.load(att.url, opts, cb, true); + } else if (att.file) { + Attachment.write(att.file, opts, cb, true); } }); } From 5af78c69902dfdb42d08dc66e16d498912c8a7da Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Mon, 14 Sep 2020 01:21:50 -0500 Subject: [PATCH 034/246] Mig: add migration cfs:* -> ostrio:files --- server/migrations.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/server/migrations.js b/server/migrations.js index cb1c91bee..821154324 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1123,3 +1123,38 @@ Migrations.add('add-card-details-show-lists', () => { noValidateMulti, ); }); + +Migrations.add( + 'adapt-attachments-to-ostrio-files-api-using-meta-and-drp-cfs-leacy', + () => { + Attachments.find().forEach(file => { + Attachments.update( + file._id, + { + $set: { + 'meta.boardId': file.boardId, + 'meta.cardId': file.cardId, + 'meta.listId': file.listId, + 'meta.swimlaneId': file.swimlaneId, + }, + }, + noValidate, + ); + }); + Attachments.update( + {}, + { + $unset: { + original: '', // cfs:* legacy + copies: '', // cfs:* legacy + failures: '', // cfs:* legacy + boardId: '', + cardId: '', + listId: '', + swimlaneId: '', + }, + }, + noValidateMulti, + ); + }, +); From 47397e5be3972f2d8bb0fb40a3d41881d3b4ea90 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 15 Sep 2020 16:42:56 -0500 Subject: [PATCH 035/246] Fixup(ostrio-files): wrong export --- models/lib/fsHooks/createInterceptDownload.js | 2 +- models/lib/fsHooks/createOnAfterRemove.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/models/lib/fsHooks/createInterceptDownload.js b/models/lib/fsHooks/createInterceptDownload.js index 5d1a7ee84..f369f7945 100644 --- a/models/lib/fsHooks/createInterceptDownload.js +++ b/models/lib/fsHooks/createInterceptDownload.js @@ -1,6 +1,6 @@ import { createObjectId } from '../grid/createObjectId'; -const createInterceptDownload = bucket => +export const createInterceptDownload = bucket => function interceptDownload(http, file, versionName) { const { gridFsFileId } = file.versions[versionName].meta || {}; if (gridFsFileId) { diff --git a/models/lib/fsHooks/createOnAfterRemove.js b/models/lib/fsHooks/createOnAfterRemove.js index 297d49b5a..f2e0a4ba7 100644 --- a/models/lib/fsHooks/createOnAfterRemove.js +++ b/models/lib/fsHooks/createOnAfterRemove.js @@ -1,6 +1,6 @@ import { createObjectId } from '../grid/createObjectId'; -const createOnAfterRemove = bucket => +export const createOnAfterRemove = bucket => function onAfterRemove(files) { files.forEach(file => { Object.keys(file.versions).forEach(versionName => { From 2d53cd13b67321650d94316f93249d2b175bb75e Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 15 Sep 2020 16:55:02 -0500 Subject: [PATCH 036/246] fixup! rm fix-download-unicode --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index be708d09b..8efb47068 100644 --- a/Dockerfile +++ b/Dockerfile @@ -290,7 +290,6 @@ RUN \ gosu wekan:wekan npm install && \ gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \ #rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs && \ - #chown wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \ #Removed binary version of bcrypt because of security vulnerability that is not fixed yet. #https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac #https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c From 075a9016d475059e6c283f9ce2702d79637939f0 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 15 Sep 2020 19:35:36 -0500 Subject: [PATCH 037/246] fixup! Ref: Avatars to use modern gridfs --- models/avatars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/avatars.js b/models/avatars.js index b4c24ded8..7c5dc3bcc 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -7,7 +7,7 @@ import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; const avatarsBucket = createBucket('avatars'); -export const Avatars = new FilesCollection({ +const Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', allowClientCode: false, From fa9ed55d7d1b958a3f5115567b9fbba8c0bb557d Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 15 Sep 2020 19:36:02 -0500 Subject: [PATCH 038/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- models/attachments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index a272a159b..13b40a887 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -25,7 +25,7 @@ const insertActivity = (fileObj, activityType) => // XXX Enforce a schema for the Attachments FilesCollection // see: https://github.com/VeliovGroup/Meteor-Files/wiki/Schema -export const Attachments = new FilesCollection({ +const Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', allowClientCode: false, From ef712a700e42fc691bdd9fd53eb34fb76278bf8a Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 09:49:18 -0500 Subject: [PATCH 039/246] fixup! Ref: Avatars to use modern gridfs --- server/publications/avatars.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/publications/avatars.js b/server/publications/avatars.js index dca5692bf..bc2175166 100644 --- a/server/publications/avatars.js +++ b/server/publications/avatars.js @@ -1,3 +1,4 @@ +import Avatars from '../../models/avatars'; Meteor.publish('my-avatars', function() { - return Avatars.find({ userId: this.userId }); + return Avatars.find({ userId: this.userId }).cursor; }); From 3bfe5c284fc8aec624bebe272b114ed754d9da65 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 09:49:51 -0500 Subject: [PATCH 040/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- server/publications/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/publications/notifications.js b/server/publications/notifications.js index bc55a37c7..3a59d6d56 100644 --- a/server/publications/notifications.js +++ b/server/publications/notifications.js @@ -12,7 +12,7 @@ Meteor.publish('notificationAttachments', function() { $in: activities() .map(v => v.attachmentId) .filter(v => !!v), - }, + }.cursor, }); }); From 21a9ab72c20bf7a17717ea36627ce20e9a6cc410 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 09:50:09 -0500 Subject: [PATCH 041/246] fixup! Mig: add migration cfs:* -> ostrio:files --- server/migrations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/migrations.js b/server/migrations.js index 821154324..a725289c7 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -4,6 +4,7 @@ import TableVisibilityModeSettings from '../models/tableVisibilityModeSettings'; import Actions from '../models/actions'; import Activities from '../models/activities'; import Announcements from '../models/announcements'; +import Attachments from '../models/attachments'; import Boards from '../models/boards'; import CardComments from '../models/cardComments'; import Cards from '../models/cards'; From 6f995a5bddf48ce34bb945ab27e0f058a24dcc08 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 14:39:06 -0500 Subject: [PATCH 042/246] fixup! Ref: Avatars to use modern gridfs --- models/avatars.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/models/avatars.js b/models/avatars.js index 7c5dc3bcc..6852d6baf 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -5,12 +5,15 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -const avatarsBucket = createBucket('avatars'); +let avatarsBucket; +if (Meteor.isServer) { + avatarsBucket = createBucket('avatars'); +} const Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', - allowClientCode: false, + allowClientCode: true, onBeforeUpload(file) { if (file.size <= 72000 && file.isImage) return true; return 'Please upload image, with size equal or less than 72KB'; @@ -24,11 +27,13 @@ function isOwner(userId, doc) { return userId && userId === doc.userId; } -Avatars.allow({ - insert: isOwner, - update: isOwner, - remove: isOwner, - fetch: ['userId'], -}); +if (Meteor.isServer) { + Avatars.allow({ + insert: isOwner, + update: isOwner, + remove: isOwner, + fetch: ['userId'], + }); +} export default Avatars; From c29393dd7e01e3fe9e369935a47ce2c8d672de08 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 14:39:30 -0500 Subject: [PATCH 043/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- models/attachments.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index 13b40a887..ef376e0fc 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -5,7 +5,10 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -const attachmentBucket = createBucket('attachments'); +let attachmentBucket; +if (Meteor.isServer) { + attachmentBucket = createBucket('attachments'); +} const insertActivity = (fileObj, activityType) => Activities.insert({ From 2cddcd60a169de458f9ee01703ca0b50708c665c Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 14:52:00 -0500 Subject: [PATCH 044/246] Do those imports! --- client/components/cards/attachments.js | 2 ++ client/components/main/editor.js | 2 ++ client/components/users/userAvatar.js | 1 + models/activities.js | 2 ++ models/boards.js | 1 + models/exporter.js | 3 +++ server/publications/boards.js | 2 ++ 7 files changed, 13 insertions(+) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index aa6175c6e..0bb54181d 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -1,3 +1,5 @@ +import Attachments from '../../../models/attachments'; + Template.attachmentsGalery.events({ 'click .js-add-attachment': Popup.open('cardAttachments'), 'click .js-confirm-delete': Popup.afterConfirm( diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 94da9a8eb..b7c061554 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -1,3 +1,5 @@ +import Attachments from '/models/attachments'; + const specialHandles = [ {userId: 'board_members', username: 'board_members'}, {userId: 'card_members', username: 'card_members'} diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 0d92a754e..aa47cc838 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -3,6 +3,7 @@ import Avatars from '/models/avatars'; import Users from '/models/users'; import Org from '/models/org'; import Team from '/models/team'; +import Avatars from '/models/avatars'; Template.userAvatar.helpers({ userData() { diff --git a/models/activities.js b/models/activities.js index 51a1f272b..64cf50b65 100644 --- a/models/activities.js +++ b/models/activities.js @@ -1,3 +1,5 @@ +import Attachments from './attachments'; + // Activities don't need a schema because they are always set from the a trusted // environment - the server - and there is no risk that a user change the logic // we use with this collection. Moreover using a schema for this collection diff --git a/models/boards.js b/models/boards.js index 825444a02..f88f0b1e2 100644 --- a/models/boards.js +++ b/models/boards.js @@ -8,6 +8,7 @@ import { TYPE_TEMPLATE_CONTAINER, } from '/config/const'; import Users from "./users"; +import Attachments from './attachments'; Boards = new Mongo.Collection('boards'); diff --git a/models/exporter.js b/models/exporter.js index ceb32d3ab..390e485a9 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -1,6 +1,9 @@ import moment from 'moment'; const Papa = require('papaparse'); import { TAPi18n } from '/imports/i18n'; +import Attachments from './attachments'; + +//const stringify = require('csv-stringify'); // exporter maybe is broken since Gridfs introduced, add fs and path export class Exporter { diff --git a/server/publications/boards.js b/server/publications/boards.js index 6968e3d6c..22953fce2 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -1,3 +1,5 @@ +import Attachments from '../../models/attachments'; + // This is the publication used to display the board list. We publish all the // non-archived boards: // 1. that the user is a member of From 50990b6e6a70af9ab093b9391dec82f1f6627704 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 15:17:47 -0500 Subject: [PATCH 045/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- server/publications/boards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/publications/boards.js b/server/publications/boards.js index 22953fce2..4f6a40e60 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -236,7 +236,7 @@ Meteor.publishRelations('board', function(boardId, isArchived) { cardCommentsLinkedBoard.selector = _ids => ({ boardId: _ids }); const cardCommentReactions = this.join(CardCommentReactions); cardCommentReactions.selector = _ids => ({ cardId: _ids }); - const attachments = this.join(Attachments); + const attachments = this.join(Attachments.collection); attachments.selector = _ids => ({ cardId: _ids }); const checklists = this.join(Checklists); checklists.selector = _ids => ({ cardId: _ids }); From 5e131f4c76f23d7c7e05905332cf929a53c303b7 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 15:18:25 -0500 Subject: [PATCH 046/246] fixup! Ref: original & and use fileObj.meta --- client/lib/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/lib/utils.js b/client/lib/utils.js index f7cf640b4..a4ba32e9b 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -163,7 +163,7 @@ Utils = { ); }, getCommonAttachmentMetaFrom(card) { - let meta; + const meta = {}; if (card.isLinkedCard()) { meta.boardId = Cards.findOne(card.linkedId).boardId; meta.cardId = card.linkedId; From 4158334c2d760ac5040b1e90237871021abca0d4 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 16:16:41 -0500 Subject: [PATCH 047/246] fixup! Ref: Avatars to use modern gridfs --- models/attachments.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/attachments.js b/models/attachments.js index ef376e0fc..5ebd731d5 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -32,8 +32,8 @@ const Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', allowClientCode: false, - onAfterUpload(fileRef) { - createOnAfterUpload(attachmentBucket)(fileRef); + onAfterUpload: function onAfterUpload(fileRef) { + createOnAfterUpload(attachmentBucket).call(this, fileRef); // If the attachment doesn't have a source field // or its source is different than import if (!fileRef.meta.source || fileRef.meta.source !== 'import') { @@ -42,8 +42,8 @@ const Attachments = new FilesCollection({ } }, interceptDownload: createInterceptDownload(attachmentBucket), - onAfterRemove(files) { - createOnAfterRemove(attachmentBucket)(files); + onAfterRemove: function onAfterRemove(files) { + createOnAfterRemove(attachmentBucket).call(this, files); files.forEach(fileObj => { insertActivity(fileObj, 'deleteAttachment'); }); From 4929653367cf6f89f64bf34f60e3073b1cdc252b Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 18:19:56 -0500 Subject: [PATCH 048/246] fixup! Ref: original & and use fileObj.meta --- models/cards.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/cards.js b/models/cards.js index ce67128f7..ab8d6a53f 100644 --- a/models/cards.js +++ b/models/cards.js @@ -739,12 +739,12 @@ Cards.helpers({ attachments() { if (this.isLinkedCard()) { return Attachments.find( - { cardId: this.linkedId }, + { 'meta.cardId': this.linkedId }, { sort: { uploadedAt: -1 } }, ); } else { return Attachments.find( - { cardId: this._id }, + { 'meta.cardId': this._id }, { sort: { uploadedAt: -1 } }, ); } From 48cd554229d79661e739134d8823e856862cef8d Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 18:39:57 -0500 Subject: [PATCH 049/246] fixup! Ref: Avatars to use modern gridfs --- models/avatars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/avatars.js b/models/avatars.js index 6852d6baf..59dd2e403 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -10,7 +10,7 @@ if (Meteor.isServer) { avatarsBucket = createBucket('avatars'); } -const Avatars = new FilesCollection({ +Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', allowClientCode: true, From dcac00696e0bd27f93fe2e57ad5d75c512fc604a Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 18:40:11 -0500 Subject: [PATCH 050/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- models/attachments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index 5ebd731d5..ce0e04235 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -28,7 +28,7 @@ const insertActivity = (fileObj, activityType) => // XXX Enforce a schema for the Attachments FilesCollection // see: https://github.com/VeliovGroup/Meteor-Files/wiki/Schema -const Attachments = new FilesCollection({ +Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', allowClientCode: false, From 74deeeaaa605d9d142728c7cc8fca26fe09101ad Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 18:40:17 -0500 Subject: [PATCH 051/246] Revert "Do those imports!" This reverts commit 64dcc70bd271d827c1639f8c847543a6d2ede713. --- client/components/cards/attachments.js | 2 -- client/components/main/editor.js | 2 -- client/components/users/userAvatar.js | 1 - models/activities.js | 2 -- models/boards.js | 1 - models/cards.js | 1 - models/exporter.js | 1 - server/publications/boards.js | 2 -- 8 files changed, 12 deletions(-) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index 0bb54181d..aa6175c6e 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -1,5 +1,3 @@ -import Attachments from '../../../models/attachments'; - Template.attachmentsGalery.events({ 'click .js-add-attachment': Popup.open('cardAttachments'), 'click .js-confirm-delete': Popup.afterConfirm( diff --git a/client/components/main/editor.js b/client/components/main/editor.js index b7c061554..94da9a8eb 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -1,5 +1,3 @@ -import Attachments from '/models/attachments'; - const specialHandles = [ {userId: 'board_members', username: 'board_members'}, {userId: 'card_members', username: 'card_members'} diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index aa47cc838..0d92a754e 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -3,7 +3,6 @@ import Avatars from '/models/avatars'; import Users from '/models/users'; import Org from '/models/org'; import Team from '/models/team'; -import Avatars from '/models/avatars'; Template.userAvatar.helpers({ userData() { diff --git a/models/activities.js b/models/activities.js index 64cf50b65..51a1f272b 100644 --- a/models/activities.js +++ b/models/activities.js @@ -1,5 +1,3 @@ -import Attachments from './attachments'; - // Activities don't need a schema because they are always set from the a trusted // environment - the server - and there is no risk that a user change the logic // we use with this collection. Moreover using a schema for this collection diff --git a/models/boards.js b/models/boards.js index f88f0b1e2..825444a02 100644 --- a/models/boards.js +++ b/models/boards.js @@ -8,7 +8,6 @@ import { TYPE_TEMPLATE_CONTAINER, } from '/config/const'; import Users from "./users"; -import Attachments from './attachments'; Boards = new Mongo.Collection('boards'); diff --git a/models/cards.js b/models/cards.js index ab8d6a53f..b9b231609 100644 --- a/models/cards.js +++ b/models/cards.js @@ -5,7 +5,6 @@ import { TYPE_LINKED_BOARD, TYPE_LINKED_CARD, } from '../config/const'; -import Attachments from './attachments'; Cards = new Mongo.Collection('cards'); diff --git a/models/exporter.js b/models/exporter.js index 390e485a9..8c992c0b7 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -1,7 +1,6 @@ import moment from 'moment'; const Papa = require('papaparse'); import { TAPi18n } from '/imports/i18n'; -import Attachments from './attachments'; //const stringify = require('csv-stringify'); diff --git a/server/publications/boards.js b/server/publications/boards.js index 4f6a40e60..f302829b3 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -1,5 +1,3 @@ -import Attachments from '../../models/attachments'; - // This is the publication used to display the board list. We publish all the // non-archived boards: // 1. that the user is a member of From b05fa636ea0e318f464d6e59a90591cd8d0b8cd3 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 18:56:45 -0500 Subject: [PATCH 052/246] fixup! Ref: original & and use fileObj.meta --- server/publications/boards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/publications/boards.js b/server/publications/boards.js index f302829b3..f21613853 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -235,7 +235,7 @@ Meteor.publishRelations('board', function(boardId, isArchived) { const cardCommentReactions = this.join(CardCommentReactions); cardCommentReactions.selector = _ids => ({ cardId: _ids }); const attachments = this.join(Attachments.collection); - attachments.selector = _ids => ({ cardId: _ids }); + attachments.selector = _ids => ({ 'meta.cardId': _ids }); const checklists = this.join(Checklists); checklists.selector = _ids => ({ cardId: _ids }); const checklistItems = this.join(ChecklistItems); From 0f272b1e6613274540f74ffa248c69b970d8e57d Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 20:22:20 -0500 Subject: [PATCH 053/246] fixup! Ref: Attachments to use modern gridfs (rm localstore) --- models/attachments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index ce0e04235..614dd3332 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -31,7 +31,7 @@ const insertActivity = (fileObj, activityType) => Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', - allowClientCode: false, + allowClientCode: true, onAfterUpload: function onAfterUpload(fileRef) { createOnAfterUpload(attachmentBucket).call(this, fileRef); // If the attachment doesn't have a source field From 5dcf7f55fd84e0748e0d0b8ad52aad3b043a1b27 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 20:26:54 -0500 Subject: [PATCH 054/246] fixup! Ref: original & and use fileObj.meta --- client/components/cards/attachments.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index aa6175c6e..b83026061 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -13,10 +13,10 @@ Template.attachmentsGalery.events({ event.stopPropagation(); }, 'click .js-add-cover'() { - Cards.findOne(this.cardId).setCover(this._id); + Cards.findOne(this.meta.cardId).setCover(this._id); }, 'click .js-remove-cover'() { - Cards.findOne(this.cardId).unsetCover(); + Cards.findOne(this.meta.cardId).unsetCover(); }, 'click .js-preview-image'(event) { Popup.open('previewAttachedImage').call(this, event); From e4e8da4718b0013454b8e31d4d7da6b794941510 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 21:18:07 -0500 Subject: [PATCH 055/246] fix: cover image - works now --- client/components/cards/minicard.jade | 2 +- models/cards.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 6b4eafcfe..0d41377a8 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -7,7 +7,7 @@ template(name="minicard") .handle .fa.fa-arrows if cover - .minicard-cover(style="background-image: url('{{cover.url}}');") + .minicard-cover(style="background-image: url('{{cover.link}}');") if labels .minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}") each labels diff --git a/models/cards.js b/models/cards.js index b9b231609..7b282fe9c 100644 --- a/models/cards.js +++ b/models/cards.js @@ -751,10 +751,7 @@ Cards.helpers({ cover() { if (!this.coverId) return false; - const cover = Attachments.findOne(this.coverId); - // if we return a cover before it is fully stored, we will get errors when we try to display it - // todo XXX we could return a default "upload pending" image in the meantime? - return cover && cover.url() && cover; + return Attachments.findOne(this.coverId); }, checklists() { From 0d97b1314db1fb25e9c2ec4263d3c888c67c2edc Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 21:19:32 -0500 Subject: [PATCH 056/246] fix: activity download link --- client/components/activities/activities.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index 4470f72de..5764ea051 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -197,14 +197,14 @@ BlazeComponent.extendComponent({ // trying to display url before file is stored generates js errors return ( (attachment && - attachment.url({ download: true }) && + attachment.path && Blaze.toHTML( HTML.A( { - href: attachment.url({ download: true }), + href: `${attachment.link()}?download=true`, target: '_blank', }, - DOMPurify.sanitize(attachment.name()), + DOMPurify.sanitize(attachment.name), ), )) || DOMPurify.sanitize(this.currentData().activity.attachmentName) From bb780976e9cce34037e7e1d76399b915b77f2342 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 22:42:34 -0500 Subject: [PATCH 057/246] fixup! Hello gridfs lib + fsHooks for mongodb bucket storage --- models/lib/fsHooks/createInterceptDownload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/lib/fsHooks/createInterceptDownload.js b/models/lib/fsHooks/createInterceptDownload.js index f369f7945..c375d03f8 100644 --- a/models/lib/fsHooks/createInterceptDownload.js +++ b/models/lib/fsHooks/createInterceptDownload.js @@ -39,7 +39,7 @@ export const createInterceptDownload = bucket => const getContentDisposition = (name, downloadFlag) => { const dispositionType = downloadFlag === 'true' ? 'attachment;' : 'inline;'; - const encodedName = encodeURIComponent(fileName); + const encodedName = encodeURIComponent(name); const dispositionName = `filename="${encodedName}"; filename=*UTF-8"${encodedName}";`; const dispositionEncoding = 'charset=utf-8'; From 94bf192f1221bd91c14638cd92f19e6babe041d4 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 16 Sep 2020 22:57:06 -0500 Subject: [PATCH 058/246] fixup! fix: cover image - works now --- client/components/cards/minicard.jade | 2 +- models/cards.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 0d41377a8..e382e4a1e 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -7,7 +7,7 @@ template(name="minicard") .handle .fa.fa-arrows if cover - .minicard-cover(style="background-image: url('{{cover.link}}');") + .minicard-cover(style="background-image: url('{{cover.link 'original' '/'}}');") if labels .minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}") each labels diff --git a/models/cards.js b/models/cards.js index 7b282fe9c..f1c49c4af 100644 --- a/models/cards.js +++ b/models/cards.js @@ -751,7 +751,10 @@ Cards.helpers({ cover() { if (!this.coverId) return false; - return Attachments.findOne(this.coverId); + const cover = Attachments.findOne(this.coverId); + // if we return a cover before it is fully stored, we will get errors when we try to display it + // todo XXX we could return a default "upload pending" image in the meantime? + return cover && cover.path && cover; }, checklists() { From f847439e10fc6ab30a841068bbd2591916d22e64 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 00:13:28 -0500 Subject: [PATCH 059/246] fix: thumbnail images now wrok --- client/components/cards/attachments.jade | 16 ++++++++-------- models/cards.js | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 88276c76f..3a2949ff8 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -12,7 +12,7 @@ template(name="previewClipboardImagePopup") button.primary.js-upload-pasted-image {{_ 'upload'}} template(name="previewAttachedImagePopup") - img.preview-large-image.js-large-image-clicked(src="{{url}}") + img.preview-large-image.js-large-image-clicked(src="{{link}}") template(name="attachmentDeletePopup") p {{_ "attachment-delete-pop"}} @@ -22,22 +22,22 @@ template(name="attachmentsGalery") .attachments-galery each attachments .attachment-item - a.attachment-thumbnail.swipebox(href="{{url}}" title="{{name}}") + a.attachment-thumbnail.swipebox(href="{{link}}" title="{{name}}") if isUploaded if isImage - img.attachment-thumbnail-img(src="{{url}}") + img.attachment-thumbnail-img(src="{{link}}") else if($eq extension 'mp3') video(width="100%" height="100%" controls="true") - source(src="{{url}}" type="audio/mpeg") + source(src="{{link}}" type="audio/mpeg") else if($eq extension 'ogg') video(width="100%" height="100%" controls="true") - source(src="{{url}}" type="video/ogg") + source(src="{{link}}" type="video/ogg") else if($eq extension 'webm') video(width="100%" height="100%" controls="true") - source(src="{{url}}" type="video/webm") + source(src="{{link}}" type="video/webm") else if($eq extension 'mp4') video(width="100%" height="100%" controls="true") - source(src="{{url}}" type="video/mp4") + source(src="{{link}}" type="video/mp4") else span.attachment-thumbnail-ext= extension else @@ -46,7 +46,7 @@ template(name="attachmentsGalery") = name span.file-size ({{fileSize size}} KB) span.attachment-details-actions - a.js-download(href="{{url download=true}}") + a.js-download(href="{{link}}?download=true") i.fa.fa-download | {{_ 'download'}} if currentUser.isBoardMember diff --git a/models/cards.js b/models/cards.js index f1c49c4af..35761587e 100644 --- a/models/cards.js +++ b/models/cards.js @@ -740,12 +740,12 @@ Cards.helpers({ return Attachments.find( { 'meta.cardId': this.linkedId }, { sort: { uploadedAt: -1 } }, - ); + ).each(); } else { return Attachments.find( { 'meta.cardId': this._id }, { sort: { uploadedAt: -1 } }, - ); + ).each(); } }, @@ -754,7 +754,7 @@ Cards.helpers({ const cover = Attachments.findOne(this.coverId); // if we return a cover before it is fully stored, we will get errors when we try to display it // todo XXX we could return a default "upload pending" image in the meantime? - return cover && cover.path && cover; + return cover && cover.link() && cover; }, checklists() { From 71b82e0049cda9a6ac312df684e5673171145720 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 00:29:16 -0500 Subject: [PATCH 060/246] Rem: unused previewAttachedImagePopup --- client/components/cards/attachments.jade | 3 --- client/components/cards/attachments.js | 31 ------------------------ client/components/cards/attachments.styl | 5 ---- 3 files changed, 39 deletions(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 3a2949ff8..9bdd019d1 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -11,9 +11,6 @@ template(name="previewClipboardImagePopup") img.preview-clipboard-image() button.primary.js-upload-pasted-image {{_ 'upload'}} -template(name="previewAttachedImagePopup") - img.preview-large-image.js-large-image-clicked(src="{{link}}") - template(name="attachmentDeletePopup") p {{_ "attachment-delete-pop"}} button.js-confirm.negate.full(type="submit") {{_ 'delete'}} diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index b83026061..bfa345186 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -18,31 +18,6 @@ Template.attachmentsGalery.events({ 'click .js-remove-cover'() { Cards.findOne(this.meta.cardId).unsetCover(); }, - 'click .js-preview-image'(event) { - Popup.open('previewAttachedImage').call(this, event); - // when multiple thumbnails, if click one then another very fast, - // we might get a wrong width from previous img. - // when popup reused, onRendered() won't be called, so we cannot get there. - // here make sure to get correct size when this img fully loaded. - const img = $('img.preview-large-image')[0]; - if (!img) return; - const rePosPopup = () => { - const w = img.width; - const h = img.height; - // if the image is too large, we resize & center the popup. - if (w > 300) { - $('div.pop-over').css({ - width: w + 20, - position: 'absolute', - left: (window.innerWidth - w) / 2, - top: (window.innerHeight - h) / 2, - }); - } - }; - const url = $(event.currentTarget).attr('src'); - if (img.src === url && img.complete) rePosPopup(); - else img.onload = rePosPopup; - }, }); Template.attachmentsGalery.helpers({ @@ -54,12 +29,6 @@ Template.attachmentsGalery.helpers({ }, }); -Template.previewAttachedImagePopup.events({ - 'click .js-large-image-clicked'() { - Popup.back(); - }, -}); - Template.cardAttachmentsPopup.events({ 'change .js-attach-file'(event) { const card = this; diff --git a/client/components/cards/attachments.styl b/client/components/cards/attachments.styl index e437aaa36..a8320adcd 100644 --- a/client/components/cards/attachments.styl +++ b/client/components/cards/attachments.styl @@ -51,11 +51,6 @@ display: block box-shadow: 0 1px 2px rgba(0,0,0,.2) -.preview-large-image - max-width: 1000px - display: block - box-shadow: 0 1px 2px rgba(0,0,0,.2) - .preview-clipboard-image width: 280px max-width: 100%; From 31d7fbe5fb5aa603b364364b3f74764dd52a6e03 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 00:42:31 -0500 Subject: [PATCH 061/246] Rem: upload spinner. attachmentGalery would need refactoring to an individual attachment component with component state that could be set on the onUpdated event. I'm not capable of doing this within reasonable time. --- client/components/cards/attachments.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 9bdd019d1..bf9838ab5 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -38,7 +38,7 @@ template(name="attachmentsGalery") else span.attachment-thumbnail-ext= extension else - +spinner + span.attachment-thumbnail-ext= extension p.attachment-details = name span.file-size ({{fileSize size}} KB) From 72abf50b3639a7679d886cb3d5a1bcc632477ceb Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 01:36:58 -0500 Subject: [PATCH 062/246] Fix: image download dont open -> download --- client/components/cards/attachments.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index bf9838ab5..ef8740181 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -43,7 +43,7 @@ template(name="attachmentsGalery") = name span.file-size ({{fileSize size}} KB) span.attachment-details-actions - a.js-download(href="{{link}}?download=true") + a.js-download(href="{{link}}?download=true", download="{{name}}") i.fa.fa-download | {{_ 'download'}} if currentUser.isBoardMember From 1875551a9362649bed5712b8f1a042290c77b76d Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 01:41:29 -0500 Subject: [PATCH 063/246] Ref: pass through image size error message (correctly) --- client/components/users/userAvatar.js | 3 +-- models/avatars.js | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 0d92a754e..5b7d9e256 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -239,8 +239,7 @@ BlazeComponent.extendComponent({ } }); uploader.on('error', (error, fileData) => { - // XXX check for actually returned error - self.setError('avatar-too-big'); + self.setError(error.reason); }); uploader.start(); } diff --git a/models/avatars.js b/models/avatars.js index 59dd2e403..c0a8cfcb4 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -15,8 +15,10 @@ Avatars = new FilesCollection({ collectionName: 'avatars', allowClientCode: true, onBeforeUpload(file) { - if (file.size <= 72000 && file.isImage) return true; - return 'Please upload image, with size equal or less than 72KB'; + if (file.size <= 72000 && file.type.startsWith("image/")) { + return true; + }; + return 'avatar-too-big'; }, onAfterUpload: createOnAfterUpload(avatarsBucket), interceptDownload: createInterceptDownload(avatarsBucket), From efcca9739a40a9a88c2e392e704ba2554a583813 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 01:57:58 -0500 Subject: [PATCH 064/246] fix: user avatar images & upload --- client/components/users/userAvatar.jade | 2 +- client/components/users/userAvatar.js | 19 +++++++------------ models/avatars.js | 4 ++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade index aaf41af23..8d0fec8b3 100644 --- a/client/components/users/userAvatar.jade +++ b/client/components/users/userAvatar.jade @@ -85,7 +85,7 @@ template(name="changeAvatarPopup") each uploadedAvatars li: a.js-select-avatar .member - img.avatar.avatar-image(src="{{url avatarUrlOptions}}") + img.avatar.avatar-image(src="{{link}}?auth=false&brokenIsFine=true") | {{_ 'uploaded-avatar'}} if isSelected i.fa.fa-check diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 5b7d9e256..173873b28 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -3,6 +3,7 @@ import Avatars from '/models/avatars'; import Users from '/models/users'; import Org from '/models/org'; import Team from '/models/team'; +import { formatFleURL } from 'meteor/ostrio:files/lib'; Template.userAvatar.helpers({ userData() { @@ -184,21 +185,14 @@ BlazeComponent.extendComponent({ Meteor.subscribe('my-avatars'); }, - avatarUrlOptions() { - return { - auth: false, - brokenIsFine: true, - }; - }, - uploadedAvatars() { - return Avatars.find({ userId: Meteor.userId() }); + return Avatars.find({ userId: Meteor.userId() }).each(); }, isSelected() { const userProfile = Meteor.user().profile; const avatarUrl = userProfile && userProfile.avatarUrl; - const currentAvatarUrl = this.currentData().url(this.avatarUrlOptions()); + const currentAvatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`; return avatarUrl === currentAvatarUrl; }, @@ -234,8 +228,9 @@ BlazeComponent.extendComponent({ ); uploader.on('uploaded', (error, fileRef) => { if (!error) { - self.setAvatar(fileRef.path); - // self.setAvatar(this.currentData().url(this.avatarUrlOptions())); + self.setAvatar( + `${formatFleURL(fileRef)}?auth=false&brokenIsFine=true`, + ); } }); uploader.on('error', (error, fileData) => { @@ -245,7 +240,7 @@ BlazeComponent.extendComponent({ } }, 'click .js-select-avatar'() { - const avatarUrl = this.currentData().url(this.avatarUrlOptions()); + const avatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`; this.setAvatar(avatarUrl); }, 'click .js-select-initials'() { diff --git a/models/avatars.js b/models/avatars.js index c0a8cfcb4..d45dc3df6 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -15,9 +15,9 @@ Avatars = new FilesCollection({ collectionName: 'avatars', allowClientCode: true, onBeforeUpload(file) { - if (file.size <= 72000 && file.type.startsWith("image/")) { + if (file.size <= 72000 && file.type.startsWith('image/')) { return true; - }; + } return 'avatar-too-big'; }, onAfterUpload: createOnAfterUpload(avatarsBucket), From 3d6085157e056d4132eccede230da1ffb59f347a Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Thu, 17 Sep 2020 02:47:30 -0500 Subject: [PATCH 065/246] Fix: access denied on second load --- models/attachments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index 614dd3332..08360a6e4 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -56,7 +56,7 @@ Attachments = new FilesCollection({ if (board.isPublic()) { return true; } - return board.hasMember(this.userId); + return board.hasMember(fileObj.userId); }, }); From 09553b7672df0406216baa885b5039c44dbca951 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 20 Oct 2020 12:55:28 -0500 Subject: [PATCH 066/246] migration: extract files from old storage and load into new storage --- models/attachments_old.js | 116 +++++++++++++++++++++++++++ models/avatars_old.js | 29 +++++++ server/migrations.js | 162 ++++++++++++++++++++++++++++++-------- 3 files changed, 275 insertions(+), 32 deletions(-) create mode 100644 models/attachments_old.js create mode 100644 models/avatars_old.js diff --git a/models/attachments_old.js b/models/attachments_old.js new file mode 100644 index 000000000..3ef8a388e --- /dev/null +++ b/models/attachments_old.js @@ -0,0 +1,116 @@ +const storeName = 'attachments'; +const defaultStoreOptions = { + beforeWrite: fileObj => { + if (!fileObj.isImage()) { + return { + type: 'application/octet-stream', + }; + } + return {}; + }, +}; +let store; +store = new FS.Store.GridFS(storeName, { + // XXX Add a new store for cover thumbnails so we don't load big images in + // the general board view + // If the uploaded document is not an image we need to enforce browser + // download instead of execution. This is particularly important for HTML + // files that the browser will just execute if we don't serve them with the + // appropriate `application/octet-stream` MIME header which can lead to user + // data leaks. I imagine other formats (like PDF) can also be attack vectors. + // See https://github.com/wekan/wekan/issues/99 + // XXX Should we use `beforeWrite` option of CollectionFS instead of + // collection-hooks? + // We should use `beforeWrite`. + ...defaultStoreOptions, +}); +AttachmentsOld = new FS.Collection('attachments', { + stores: [store], +}); + +if (Meteor.isServer) { + Meteor.startup(() => { + AttachmentsOld.files._ensureIndex({ cardId: 1 }); + }); + + AttachmentsOld.allow({ + insert(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + update(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + remove(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + // We authorize the attachment download either: + // - if the board is public, everyone (even unconnected) can download it + // - if the board is private, only board members can download it + download(userId, doc) { + const board = Boards.findOne(doc.boardId); + if (board.isPublic()) { + return true; + } else { + return board.hasMember(userId); + } + }, + + fetch: ['boardId'], + }); +} + +// XXX Enforce a schema for the AttachmentsOld CollectionFS + +if (Meteor.isServer) { + AttachmentsOld.files.after.insert((userId, doc) => { + // If the attachment doesn't have a source field + // or its source is different than import + if (!doc.source || doc.source !== 'import') { + // Add activity about adding the attachment + Activities.insert({ + userId, + type: 'card', + activityType: 'addAttachment', + attachmentId: doc._id, + // this preserves the name so that notifications can be meaningful after + // this file is removed + attachmentName: doc.original.name, + boardId: doc.boardId, + cardId: doc.cardId, + listId: doc.listId, + swimlaneId: doc.swimlaneId, + }); + } else { + // Don't add activity about adding the attachment as the activity + // be imported and delete source field + AttachmentsOld.update( + { + _id: doc._id, + }, + { + $unset: { + source: '', + }, + }, + ); + } + }); + + AttachmentsOld.files.before.remove((userId, doc) => { + Activities.insert({ + userId, + type: 'card', + activityType: 'deleteAttachment', + attachmentId: doc._id, + // this preserves the name so that notifications can be meaningful after + // this file is removed + attachmentName: doc.original.name, + boardId: doc.boardId, + cardId: doc.cardId, + listId: doc.listId, + swimlaneId: doc.swimlaneId, + }); + }); +} + +export default AttachmentsOld; diff --git a/models/avatars_old.js b/models/avatars_old.js new file mode 100644 index 000000000..deae4bbc6 --- /dev/null +++ b/models/avatars_old.js @@ -0,0 +1,29 @@ +AvatarsOld = new FS.Collection('avatars', { + stores: [new FS.Store.GridFS('avatars')], + filter: { + maxSize: 72000, + allow: { + contentTypes: ['image/*'], + }, + }, +}); + +function isOwner(userId, file) { + return userId && userId === file.userId; +} + +AvatarsOld.allow({ + insert: isOwner, + update: isOwner, + remove: isOwner, + download() { + return true; + }, + fetch: ['userId'], +}); + +AvatarsOld.files.before.insert((userId, doc) => { + doc.userId = userId; +}); + +export default AvatarsOld; diff --git a/server/migrations.js b/server/migrations.js index a725289c7..173f112b7 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -5,6 +5,9 @@ import Actions from '../models/actions'; import Activities from '../models/activities'; import Announcements from '../models/announcements'; import Attachments from '../models/attachments'; +import AttachmentsOld from '../models/attachments_old'; +import Avatars from '../models/avatars'; +import AvatarsOld from '../models/avatars_old'; import Boards from '../models/boards'; import CardComments from '../models/cardComments'; import Cards from '../models/cards'; @@ -1125,37 +1128,132 @@ Migrations.add('add-card-details-show-lists', () => { ); }); -Migrations.add( - 'adapt-attachments-to-ostrio-files-api-using-meta-and-drp-cfs-leacy', - () => { - Attachments.find().forEach(file => { - Attachments.update( - file._id, - { - $set: { - 'meta.boardId': file.boardId, - 'meta.cardId': file.cardId, - 'meta.listId': file.listId, - 'meta.swimlaneId': file.swimlaneId, - }, - }, - noValidate, - ); +Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { + AttachmentsOld.find().forEach(function(fileObj) { + //console.log('File: ', fileObj.userId); + + // This directory must be writable on server, so a test run first + // We are going to copy the files locally, then move them to S3 + const fileName = `./assets/app/uploads/attachments/${fileObj.name()}`; + const newFileName = fileObj.name(); + + // This is "example" variable, change it to the userId that you might be using. + const userId = fileObj.userId; + + const fileType = fileObj.type(); + const fileSize = fileObj.size(); + const fileId = fileObj._id; + + const readStream = fileObj.createReadStream('attachments'); + const writeStream = fs.createWriteStream(fileName); + + writeStream.on('error', function(err) { + console.log('Writing error: ', err, fileName); }); - Attachments.update( - {}, - { - $unset: { - original: '', // cfs:* legacy - copies: '', // cfs:* legacy - failures: '', // cfs:* legacy - boardId: '', - cardId: '', - listId: '', - swimlaneId: '', + + // Once we have a file, then upload it to our new data storage + readStream.on('end', () => { + console.log('Ended: ', fileName); + // UserFiles is the new Meteor-Files/FilesCollection collection instance + + Attachments.addFile( + fileName, + { + fileName: newFileName, + type: fileType, + meta: { + boardId: fileObj.boardId, + cardId: fileObj.cardId, + listId: fileObj.listId, + swimlaneId: fileObj.swimlaneId, + }, + userId, + size: fileSize, + fileId, }, - }, - noValidateMulti, - ); - }, -); + (err, fileRef) => { + if (err) { + console.log(err); + } else { + console.log('File Inserted: ', fileRef._id); + // Set the userId again + Attachments.update({ _id: fileRef._id }, { $set: { userId } }); + fileObj.remove(); + } + }, + true, + ); // proceedAfterUpload + }); + + readStream.on('error', error => { + console.log('Error: ', fileName, error); + }); + + readStream.pipe(writeStream); + }); +}); + +Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { + AvatarsOld.find().forEach(function(fileObj) { + //console.log('File: ', fileObj.userId); + + // This directory must be writable on server, so a test run first + // We are going to copy the files locally, then move them to S3 + const fileName = `./assets/app/uploads/avatars/${fileObj.name()}`; + const newFileName = fileObj.name(); + + // This is "example" variable, change it to the userId that you might be using. + const userId = fileObj.userId; + + const fileType = fileObj.type(); + const fileSize = fileObj.size(); + const fileId = fileObj._id; + + const readStream = fileObj.createReadStream('avatars'); + const writeStream = fs.createWriteStream(fileName); + + writeStream.on('error', function(err) { + console.log('Writing error: ', err, fileName); + }); + + // Once we have a file, then upload it to our new data storage + readStream.on('end', () => { + console.log('Ended: ', fileName); + // UserFiles is the new Meteor-Files/FilesCollection collection instance + + Avatars.addFile( + fileName, + { + fileName: newFileName, + type: fileType, + meta: { + boardId: fileObj.boardId, + cardId: fileObj.cardId, + listId: fileObj.listId, + swimlaneId: fileObj.swimlaneId, + }, + userId, + size: fileSize, + fileId, + }, + (err, fileRef) => { + if (err) { + console.log(err); + } else { + console.log('File Inserted: ', fileRef._id); + // Set the userId again + Avatars.update({ _id: fileRef._id }, { $set: { userId } }); + fileObj.remove(); + } + }, + true, + ); // proceedAfterUpload + }); + + readStream.on('error', error => { + console.log('Error: ', fileName, error); + }); + + readStream.pipe(writeStream); + }); +}); From 2265d726ae68109afbdef70c4a4d9a3903e23dfb Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 20 Oct 2020 13:23:04 -0500 Subject: [PATCH 067/246] Revert "Adios cfs:* | Hello ostrio:file" This reverts commit 093819e33cc513db6f06aa30d5e37e3fc758d6e8. --- .meteor/packages | 4 ++++ .meteor/versions | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/.meteor/packages b/.meteor/packages index ead7e135f..b3c0f4166 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -17,6 +17,7 @@ es5-shim@4.8.0 # Collections aldeed:collection2 +cfs:standard-packages cottz:publish-relations dburles:collection-helpers idmontie:migrations @@ -59,6 +60,8 @@ shell-server@0.5.0 email@2.2.0 horka:swipebox dynamic-import@0.7.2 + +cfs:gridfs rzymek:fullcalendar browser-policy-framing@1.1.0 msavin:usercache @@ -69,6 +72,7 @@ meteorhacks:aggregate@1.3.0 wekan-markdown konecty:mongo-counter percolate:synced-cron +cfs:filesystem ostrio:cookies ostrio:files@2.0.1 rajit:bootstrap3-datepicker-fi diff --git a/.meteor/versions b/.meteor/versions index 4c3090241..1aa29ebba 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -21,6 +21,24 @@ browser-policy-framing@1.1.0 caching-compiler@1.2.2 caching-html-compiler@1.2.1 callback-hook@1.4.0 +cfs:access-point@0.1.49 +cfs:base-package@0.0.30 +cfs:collection@0.5.5 +cfs:collection-filters@0.2.4 +cfs:data-man@0.0.6 +cfs:file@0.1.17 +cfs:filesystem@0.1.2 +cfs:gridfs@0.0.34 +cfs:http-methods@0.0.32 +cfs:http-publish@0.0.13 +cfs:power-queue@0.9.11 +cfs:reactive-list@0.0.9 +cfs:reactive-property@0.0.4 +cfs:standard-packages@0.5.10 +cfs:storage-adapter@0.2.4 +cfs:tempstore@0.1.6 +cfs:upload-http@0.0.20 +cfs:worker@0.1.5 check@1.3.1 coagmano:stylus@1.1.0 coffeescript@2.4.1 From 2288c8ac1591df185fcda34c14c0443f957eb4f4 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Tue, 20 Oct 2020 17:44:04 -0500 Subject: [PATCH 068/246] hack: Nasty hack for covercard auth --- client/components/cards/minicard.jade | 2 +- client/components/cards/minicard.js | 6 ++++++ models/attachments.js | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index e382e4a1e..4ffcfb485 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -7,7 +7,7 @@ template(name="minicard") .handle .fa.fa-arrows if cover - .minicard-cover(style="background-image: url('{{cover.link 'original' '/'}}');") + .minicard-cover(style="background-image: url('{{cover.link 'original' '/'}}?dummyReloadAfterSessionEstablished={{sess}}');") if labels .minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}") each labels diff --git a/client/components/cards/minicard.js b/client/components/cards/minicard.js index e1a642ee0..228491fff 100644 --- a/client/components/cards/minicard.js +++ b/client/components/cards/minicard.js @@ -116,6 +116,12 @@ Template.minicard.helpers({ return false; } }, + // XXX resolve this nasty hack for https://github.com/veliovgroup/Meteor-Files/issues/763 + sess() { + return Meteor.connection && Meteor.connection._lastSessionId + ? Meteor.connection._lastSessionId + : null; + }, }); BlazeComponent.extendComponent({ diff --git a/models/attachments.js b/models/attachments.js index 08360a6e4..614dd3332 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -56,7 +56,7 @@ Attachments = new FilesCollection({ if (board.isPublic()) { return true; } - return board.hasMember(fileObj.userId); + return board.hasMember(this.userId); }, }); From 06b812b5900eec39f4d2c7b58deb996493caa6fc Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 21 Oct 2020 09:39:00 -0500 Subject: [PATCH 069/246] fixup: migration --- server/migrations.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/server/migrations.js b/server/migrations.js index 173f112b7..ee9df6437 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -24,6 +24,8 @@ import Triggers from '../models/triggers'; import UnsavedEdits from '../models/unsavedEdits'; import Users from '../models/users'; +const fs = require('fs'); + // Anytime you change the schema of one of the collection in a non-backward // compatible way you have to write a migration in this file using the following // API: @@ -1134,7 +1136,9 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { // This directory must be writable on server, so a test run first // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/attachments/${fileObj.name()}`; + const fileName = `./assets/app/uploads/attachments/${ + fileObj._id + }-${fileObj.name()}`; const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. @@ -1199,7 +1203,9 @@ Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { // This directory must be writable on server, so a test run first // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/avatars/${fileObj.name()}`; + const fileName = `./assets/app/uploads/avatars/${ + fileObj._id + }-${fileObj.name()}`; const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. @@ -1240,14 +1246,30 @@ Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { if (err) { console.log(err); } else { - console.log('File Inserted: ', fileRef._id); + console.log('File Inserted: ', newFileName, fileRef._id); // Set the userId again Avatars.update({ _id: fileRef._id }, { $set: { userId } }); + Users.find().forEach(user => { + const old_url = fileObj.url(); + new_url = Avatars.findOne({ _id: fileRef._id }).link( + 'original', + '/', + ); + if (user.profile.avatarUrl.startsWith(old_url)) { + // Set avatar url to new url + Users.direct.update( + { _id: user._id }, + { $set: { 'profile.avatarUrl': new_url } }, + noValidate, + ); + console.log('User avatar updated: ', user._id, new_url); + } + }); fileObj.remove(); } }, - true, - ); // proceedAfterUpload + true, // proceedAfterUpload + ); }); readStream.on('error', error => { From 80d0ec08985fa9b2e70e66d82e23dab9cd04cc2a Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 21 Oct 2020 12:39:49 -0500 Subject: [PATCH 070/246] use tempdirs --- models/attachments.js | 3 +++ models/avatars.js | 3 +++ server/migrations.js | 26 ++++++++++++++------------ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/models/attachments.js b/models/attachments.js index 614dd3332..773bb4a43 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -5,6 +5,8 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; +const os = require('os'); + let attachmentBucket; if (Meteor.isServer) { attachmentBucket = createBucket('attachments'); @@ -31,6 +33,7 @@ const insertActivity = (fileObj, activityType) => Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', + storagePath: os.tmpdir(), allowClientCode: true, onAfterUpload: function onAfterUpload(fileRef) { createOnAfterUpload(attachmentBucket).call(this, fileRef); diff --git a/models/avatars.js b/models/avatars.js index d45dc3df6..b739f8eb3 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -5,6 +5,8 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; +const os = require('os'); + let avatarsBucket; if (Meteor.isServer) { avatarsBucket = createBucket('avatars'); @@ -13,6 +15,7 @@ if (Meteor.isServer) { Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', + storagePath: os.tmpdir(), allowClientCode: true, onBeforeUpload(file) { if (file.size <= 72000 && file.type.startsWith('image/')) { diff --git a/server/migrations.js b/server/migrations.js index ee9df6437..24bf9bcb3 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -23,9 +23,6 @@ import Swimlanes from '../models/swimlanes'; import Triggers from '../models/triggers'; import UnsavedEdits from '../models/unsavedEdits'; import Users from '../models/users'; - -const fs = require('fs'); - // Anytime you change the schema of one of the collection in a non-backward // compatible way you have to write a migration in this file using the following // API: @@ -1131,14 +1128,17 @@ Migrations.add('add-card-details-show-lists', () => { }); Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { + const os = require('os'); + const fs = require('fs'); + const path = require('path'); + tmdir = os.tmpdir(); + AttachmentsOld.find().forEach(function(fileObj) { //console.log('File: ', fileObj.userId); // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/attachments/${ - fileObj._id - }-${fileObj.name()}`; + // We are going to copy the files locally, then move them to mongo bucket + const fileName = path.join(tmpdir, `${fileObj._id}-${fileObj.name()}`); const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. @@ -1196,16 +1196,18 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { readStream.pipe(writeStream); }); }); - Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { + const os = require('os'); + const fs = require('fs'); + const path = require('path'); + tmdir = os.tmpdir(); + AvatarsOld.find().forEach(function(fileObj) { //console.log('File: ', fileObj.userId); // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/avatars/${ - fileObj._id - }-${fileObj.name()}`; + // We are going to copy the files locally, then move them to mongo bucket + const fileName = path.join(tmpdir, `${fileObj._id}-${fileObj.name()}`); const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. From 1cddd607ec5974a1ccd25b7b5719926a4059ff13 Mon Sep 17 00:00:00 2001 From: David Arnold <dar@xoe.solutions> Date: Wed, 21 Oct 2020 12:51:04 -0500 Subject: [PATCH 071/246] Revert "use tempdirs" This reverts commit a7d51cf21b663d87f83e2585502ed9323b3d3788. --- models/attachments.js | 3 --- models/avatars.js | 3 --- server/migrations.js | 26 ++++++++++++-------------- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/models/attachments.js b/models/attachments.js index 773bb4a43..614dd3332 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -5,8 +5,6 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -const os = require('os'); - let attachmentBucket; if (Meteor.isServer) { attachmentBucket = createBucket('attachments'); @@ -33,7 +31,6 @@ const insertActivity = (fileObj, activityType) => Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', - storagePath: os.tmpdir(), allowClientCode: true, onAfterUpload: function onAfterUpload(fileRef) { createOnAfterUpload(attachmentBucket).call(this, fileRef); diff --git a/models/avatars.js b/models/avatars.js index b739f8eb3..d45dc3df6 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -5,8 +5,6 @@ import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove'; -const os = require('os'); - let avatarsBucket; if (Meteor.isServer) { avatarsBucket = createBucket('avatars'); @@ -15,7 +13,6 @@ if (Meteor.isServer) { Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', - storagePath: os.tmpdir(), allowClientCode: true, onBeforeUpload(file) { if (file.size <= 72000 && file.type.startsWith('image/')) { diff --git a/server/migrations.js b/server/migrations.js index 24bf9bcb3..ee9df6437 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -23,6 +23,9 @@ import Swimlanes from '../models/swimlanes'; import Triggers from '../models/triggers'; import UnsavedEdits from '../models/unsavedEdits'; import Users from '../models/users'; + +const fs = require('fs'); + // Anytime you change the schema of one of the collection in a non-backward // compatible way you have to write a migration in this file using the following // API: @@ -1128,17 +1131,14 @@ Migrations.add('add-card-details-show-lists', () => { }); Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { - const os = require('os'); - const fs = require('fs'); - const path = require('path'); - tmdir = os.tmpdir(); - AttachmentsOld.find().forEach(function(fileObj) { //console.log('File: ', fileObj.userId); // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to mongo bucket - const fileName = path.join(tmpdir, `${fileObj._id}-${fileObj.name()}`); + // We are going to copy the files locally, then move them to S3 + const fileName = `./assets/app/uploads/attachments/${ + fileObj._id + }-${fileObj.name()}`; const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. @@ -1196,18 +1196,16 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { readStream.pipe(writeStream); }); }); -Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { - const os = require('os'); - const fs = require('fs'); - const path = require('path'); - tmdir = os.tmpdir(); +Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { AvatarsOld.find().forEach(function(fileObj) { //console.log('File: ', fileObj.userId); // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to mongo bucket - const fileName = path.join(tmpdir, `${fileObj._id}-${fileObj.name()}`); + // We are going to copy the files locally, then move them to S3 + const fileName = `./assets/app/uploads/avatars/${ + fileObj._id + }-${fileObj.name()}`; const newFileName = fileObj.name(); // This is "example" variable, change it to the userId that you might be using. From a4732bacce54425601d35accb8484209a0997d56 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Sun, 30 Jan 2022 15:26:11 +0300 Subject: [PATCH 072/246] Support WRITEABLE_PATH envrionemnt variable --- models/attachments.js | 7 +++++++ models/avatars.js | 7 +++++++ server/migrations.js | 42 ++++++++++++++++-------------------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/models/attachments.js b/models/attachments.js index 614dd3332..ae56dad7d 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { FilesCollection } from 'meteor/ostrio:files'; +import path from 'path'; import { createBucket } from './lib/grid/createBucket'; import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; @@ -32,6 +33,12 @@ Attachments = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'attachments', allowClientCode: true, + storagePath() { + if (process.env.WRITABLE_PATH) { + return path.join(process.env.WRITABLE_PATH, 'uploads', 'attachments'); + } + return path.normalize(`assets/app/uploads/${this.collectionName}`); + }, onAfterUpload: function onAfterUpload(fileRef) { createOnAfterUpload(attachmentBucket).call(this, fileRef); // If the attachment doesn't have a source field diff --git a/models/avatars.js b/models/avatars.js index d45dc3df6..146c79203 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { FilesCollection } from 'meteor/ostrio:files'; +import path from 'path'; import { createBucket } from './lib/grid/createBucket'; import { createOnAfterUpload } from './lib/fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './lib/fsHooks/createInterceptDownload'; @@ -14,6 +15,12 @@ Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging collectionName: 'avatars', allowClientCode: true, + storagePath() { + if (process.env.WRITABLE_PATH) { + return path.join(process.env.WRITABLE_PATH, 'uploads', 'avatars'); + } + return path.normalize(`assets/app/uploads/${this.collectionName}`);; + }, onBeforeUpload(file) { if (file.size <= 72000 && file.type.startsWith('image/')) { return true; diff --git a/server/migrations.js b/server/migrations.js index ee9df6437..82df5a1a5 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1,3 +1,5 @@ +import fs from 'fs'; +import path from 'path'; import { TAPi18n } from '/imports/i18n'; import AccountSettings from '../models/accountSettings'; import TableVisibilityModeSettings from '../models/tableVisibilityModeSettings'; @@ -24,8 +26,6 @@ import Triggers from '../models/triggers'; import UnsavedEdits from '../models/unsavedEdits'; import Users from '../models/users'; -const fs = require('fs'); - // Anytime you change the schema of one of the collection in a non-backward // compatible way you have to write a migration in this file using the following // API: @@ -1132,14 +1132,9 @@ Migrations.add('add-card-details-show-lists', () => { Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { AttachmentsOld.find().forEach(function(fileObj) { - //console.log('File: ', fileObj.userId); - - // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/attachments/${ - fileObj._id - }-${fileObj.name()}`; const newFileName = fileObj.name(); + const storagePath = Attachments.storagePath({}); + const filePath = path.join(storagePath, `${fileObj._id}-${newFileName}`); // This is "example" variable, change it to the userId that you might be using. const userId = fileObj.userId; @@ -1149,19 +1144,19 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { const fileId = fileObj._id; const readStream = fileObj.createReadStream('attachments'); - const writeStream = fs.createWriteStream(fileName); + const writeStream = fs.createWriteStream(filePath); writeStream.on('error', function(err) { - console.log('Writing error: ', err, fileName); + console.log('Writing error: ', err, filePath); }); // Once we have a file, then upload it to our new data storage readStream.on('end', () => { - console.log('Ended: ', fileName); + console.log('Ended: ', filePath); // UserFiles is the new Meteor-Files/FilesCollection collection instance Attachments.addFile( - fileName, + filePath, { fileName: newFileName, type: fileType, @@ -1190,7 +1185,7 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { }); readStream.on('error', error => { - console.log('Error: ', fileName, error); + console.log('Error: ', filePath, error); }); readStream.pipe(writeStream); @@ -1199,14 +1194,9 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { AvatarsOld.find().forEach(function(fileObj) { - //console.log('File: ', fileObj.userId); - - // This directory must be writable on server, so a test run first - // We are going to copy the files locally, then move them to S3 - const fileName = `./assets/app/uploads/avatars/${ - fileObj._id - }-${fileObj.name()}`; const newFileName = fileObj.name(); + const storagePath = Avatars.storagePath({}); + const filePath = path.join(storagePath, `${fileObj._id}-${newFileName}`); // This is "example" variable, change it to the userId that you might be using. const userId = fileObj.userId; @@ -1216,19 +1206,19 @@ Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { const fileId = fileObj._id; const readStream = fileObj.createReadStream('avatars'); - const writeStream = fs.createWriteStream(fileName); + const writeStream = fs.createWriteStream(filePath); writeStream.on('error', function(err) { - console.log('Writing error: ', err, fileName); + console.log('Writing error: ', err, filePath); }); // Once we have a file, then upload it to our new data storage readStream.on('end', () => { - console.log('Ended: ', fileName); + console.log('Ended: ', filePath); // UserFiles is the new Meteor-Files/FilesCollection collection instance Avatars.addFile( - fileName, + filePath, { fileName: newFileName, type: fileType, @@ -1273,7 +1263,7 @@ Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { }); readStream.on('error', error => { - console.log('Error: ', fileName, error); + console.log('Error: ', filePath, error); }); readStream.pipe(writeStream); From 2b579372c3b16cdaa1d36c882e4eb8b24c94bce0 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Sun, 20 Feb 2022 19:24:58 +0300 Subject: [PATCH 073/246] Disable Organisation name i18n --- client/components/boards/boardsList.jade | 2 +- client/components/settings/peopleBody.jade | 4 ++-- client/components/sidebar/sidebar.jade | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade index 30d28d8cb..8cd14fbc2 100644 --- a/client/components/boards/boardsList.jade +++ b/client/components/boards/boardsList.jade @@ -13,7 +13,7 @@ template(name="boardList") select.js-AllBoardOrgs#jsAllBoardOrgs("multiple") option(value="-1") {{_ 'organizations'}} : each orgsDatas - option(value="{{orgId}}") {{_ orgDisplayName}} + option(value="{{orgId}}") {{orgDisplayName}} //li.AllBoardTemplates // if userHasTemplates diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index f0b6da965..07bdd7df4 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -403,7 +403,7 @@ template(name="editUserPopup") select.js-orgs#jsOrgs option(value="-1") {{_ 'organizations'}} : each value in orgsDatas - option(value="{{value._id}}") {{_ value.orgDisplayName}} + option(value="{{value._id}}") {{value.orgDisplayName}} input#jsUserOrgsInPut.js-userOrgs(type="text" value=user.orgsUserBelongs, disabled) input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="text" value=user.orgIdsUserBelongs) label @@ -543,7 +543,7 @@ template(name="newUserPopup") select.js-orgsNewUser#jsOrgsNewUser option(value="-1") {{_ 'organizations'}} : each value in orgsDatas - option(value="{{value._id}}") {{_ value.orgDisplayName}} + option(value="{{value._id}}") {{value.orgDisplayName}} input#jsUserOrgsInPutNewUser.js-userOrgsNewUser(type="text" value=user.orgsUserBelongs, disabled) input#jsUserOrgIdsInPutNewUser.js-userOrgIdsNewUser.hide(type="text" value=user.orgIdsUserBelongs) label diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index ef114a31f..b50dcee4b 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -494,7 +494,7 @@ template(name="addBoardOrgPopup") select.js-boardOrgs#jsBoardOrgs option(value="-1") {{_ 'organizations'}} : each value in orgsDatas - option(value="{{value._id}}") {{_ value.orgDisplayName}} + option(value="{{value._id}}") {{value.orgDisplayName}} template(name="removeBoardOrgPopup") form From 1b83399236c2e0dd2e1169dc062e1d582c6c10c5 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Sun, 20 Feb 2022 20:07:03 +0300 Subject: [PATCH 074/246] Fix errant escape-string-regexp importing --- models/cardComments.js | 3 ++- server/publications/cards.js | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/cardComments.js b/models/cardComments.js index 0ac5984fe..d580e91ca 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -1,4 +1,5 @@ -const escapeForRegex = require('escape-string-regexp'); +import escapeForRegex from 'escape-string-regexp'; + CardComments = new Mongo.Collection('card_comments'); /** diff --git a/server/publications/cards.js b/server/publications/cards.js index 456da3b67..5b9f96bfa 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import escapeForRegex from 'escape-string-regexp'; import Users from '../../models/users'; import Boards from '../../models/boards'; import Lists from '../../models/lists'; @@ -52,8 +53,6 @@ import { CARD_TYPES } from '../../config/const'; import Org from "../../models/org"; import Team from "../../models/team"; -const escapeForRegex = require('escape-string-regexp'); - Meteor.publish('card', cardId => { check(cardId, String); const ret = Cards.find({ _id: cardId }); From 855be8057266ae4af91c8177171b122ba9db9518 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Mon, 21 Feb 2022 14:14:43 +0300 Subject: [PATCH 075/246] Add missing simple:rest-accounts-password dependency --- .meteor/packages | 4 +++- .meteor/versions | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.meteor/packages b/.meteor/packages index b3c0f4166..25b78654d 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -133,7 +133,9 @@ matb33:collection-hooks simple:json-routes kadira:flow-router spacebars -communitypackages:picker useraccounts:core useraccounts:flow-routing useraccounts:unstyled +service-configuration +communitypackages:picker +simple:rest-accounts-password diff --git a/.meteor/versions b/.meteor/versions index 1aa29ebba..5dcc25ed1 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -201,7 +201,11 @@ service-configuration@1.3.0 session@1.2.0 sha@1.0.9 shell-server@0.5.0 +simple:authenticate-user-by-token@1.2.1 simple:json-routes@2.3.1 +simple:rest-accounts-password@1.2.1 +simple:rest-bearer-token-parser@1.1.1 +simple:rest-json-error-handler@1.1.1 socket-stream-client@0.4.0 spacebars@1.2.0 spacebars-compiler@1.3.0 From 44dbca5e05c84e1371447a4c5e252156efb8468f Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Mon, 18 Apr 2022 15:45:18 +0300 Subject: [PATCH 076/246] Fix automated tests --- .meteor/packages | 2 +- .meteor/versions | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 25b78654d..e83c4fe11 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -126,7 +126,7 @@ rajit:bootstrap3-datepicker-zh-tw easylogic:summernote pascoual:pdfkit lmieulet:meteor-coverage -meteortesting:mocha +meteortesting:mocha@2.0.3 aldeed:simple-schema accounts-password matb33:collection-hooks diff --git a/.meteor/versions b/.meteor/versions index 5dcc25ed1..f44c188dc 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -95,8 +95,9 @@ meteorhacks:aggregate@1.3.0 meteorhacks:collection-utils@1.2.0 meteorhacks:picker@1.0.3 meteorhacks:subs-manager@1.6.4 -meteortesting:browser-tests@0.2.0 -meteortesting:mocha@0.6.0 +meteortesting:browser-tests@1.3.5 +meteortesting:mocha@2.0.3 +meteortesting:mocha-core@8.0.1 minifier-css@1.6.0 minifier-js@2.7.3 minifiers@1.1.8-faster-rebuild.0 @@ -135,7 +136,6 @@ peerlibrary:computed-field@0.10.0 peerlibrary:data-lookup@0.3.0 peerlibrary:reactive-field@0.6.0 percolate:synced-cron@1.3.2 -practicalmeteor:mocha-core@1.0.1 promise@0.12.0 raix:eventemitter@0.1.3 raix:handlebar-helpers@0.2.5 From 6b7cbd9d8154d8467bd0166a6b0f95eaa566e685 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Mon, 18 Apr 2022 17:30:22 +0300 Subject: [PATCH 077/246] Add VSCode debugging configuration for an automated testing --- .vscode/launch.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 243eeb203..1cb8d89fa 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,6 +17,23 @@ "outputCapture": "std", "port": 9229, "timeout": 60000 + }, + { + "type": "node", + "request": "launch", + "name": "Test: Node", + "runtimeExecutable": "meteor", + "runtimeArgs": [ + "test", + "--inspect-brk=9229", + "--port=4040", + "--exclude-archs=web.browser.legacy,web.cordova", + "--driver-package=meteortesting:mocha", + "--settings=settings.json" + ], + "outputCapture": "std", + "port": 9229, + "timeout": 60000 } ], "compounds": [ From c0979fffbd8ec59b7c83cf0b2a81326d821b2dae Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 18 Apr 2022 21:27:44 +0300 Subject: [PATCH 078/246] Updated moment. --- package-lock.json | 5839 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 5635 insertions(+), 206 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe8c36ead..f40c63755 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,5454 @@ { "name": "wekan", "version": "v6.18.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "wekan", + "version": "v6.18.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/runtime": "^7.15.4", + "@mapbox/node-pre-gyp": "^1.0.8", + "@wekanteam/markdown-it-mermaid": "^0.5.2", + "ajv": "^6.12.6", + "babel-runtime": "^6.26.0", + "bcryptjs": "^2.4.3", + "bson": "^4.5.2", + "bunyan": "^1.8.15", + "chai-as-promised": "^7.1.1", + "core-js": "^3.18.2", + "dompurify": "^2.3.2", + "es6-promise": "^4.2.4", + "escape-string-regexp": "^5.0.0", + "exceljs": "^4.2.1", + "fibers": "^5.0.0", + "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", + "i18next": "^21.6.16", + "i18next-sprintf-postprocessor": "^0.2.2", + "jquery": "^2.2.4", + "jquery-ui": "^1.13.0", + "jquery-ui-touch-punch": "^0.2.3", + "jszip": "^3.7.1", + "ldapjs": "^2.3.1", + "markdown-it": "^12.3.2", + "markdown-it-emoji": "^2.0.0", + "meteor-accounts-t9n": "^2.6.0", + "meteor-node-stubs": "^1.1.0", + "moment": "^2.29.3", + "mongodb": "^3.7.3", + "nodemailer": "^6.6.3", + "os": "^0.1.2", + "page": "^1.11.6", + "papaparse": "^5.3.1", + "qs": "^6.10.1", + "simpl-schema": "^1.12.0", + "sinon-chai": "^3.7.0", + "source-map-support": "^0.5.20", + "uuid": "^8.3.2" + }, + "devDependencies": { + "babel-plugin-istanbul": "^6.1.1", + "chai": "^4.3.4", + "flatted": "^3.2.2", + "puppeteer": "^1.20.0", + "sinon": "^11.1.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dependencies": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "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" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/electron-to-chromium": { + "version": "1.4.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", + "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==" + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", + "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==", + "deprecated": "Potential XSS vulnerability patched in v6.0.0." + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + }, + "node_modules/@types/node": { + "version": "14.17.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", + "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==" + }, + "node_modules/@wekanteam/cli-table3": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.3.tgz", + "integrity": "sha512-P8utbj+no50cRDlkq21dJC68kjVigl/dPStXJLRFxndgHELC1N0mYIdwQLDBi9DsouUBFcjSP3rtewu0/Z23Ug==", + "dependencies": { + "string-width": "^5.1.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@wekanteam/markdown-it-mermaid": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.3.tgz", + "integrity": "sha512-voYErAXo/pp8qXOO/lX6odNldonQ4mhvOR4JBwUkPzfg2QxKCp8qE4rRKXbNYrwCvEnsM4dhOEpqjFWnqLUK7w==", + "dependencies": { + "@wekanteam/cli-table3": "^0.7.3", + "mermaid": "^8.14.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archiver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bson": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", + "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", + "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.3.0.tgz", + "integrity": "sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "dependencies": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/dagre-d3/node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/dagre-d3/node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/dagre-d3/node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/dagre-d3/node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/dagre-d3/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/dagre-d3/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/dagre-d3/node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/dagre-d3/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/dagre-d3/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/dagre-d3/node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "node_modules/dagre-d3/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/dagre-d3/node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/dagre-d3/node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/dagre-d3/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/dagre-d3/node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre-d3/node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fibers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", + "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/flushwritable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", + "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gridfs-stream": { + "version": "1.1.1", + "resolved": "https://github.com/wekan/gridfs-stream/tarball/master", + "integrity": "sha1-LHDhvuPAD0qFNEiT8YnbeXCmV9s= sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", + "dependencies": { + "flushwritable": "^1.0.0" + }, + "engines": { + "node": ">= 0.4.2" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/i18next": { + "version": "21.6.16", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz", + "integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, + "node_modules/i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" + }, + "node_modules/i18next/node_modules/@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jquery": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", + "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" + }, + "node_modules/jquery-ui": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.0.tgz", + "integrity": "sha512-Osf7ECXNTYHtKBkn9xzbIf9kifNrBhfywFEKxOeB/OVctVmLlouV9mfc2qXCp6uyO4Pn72PXKOnj09qXetopCw==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + }, + "node_modules/khroma": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.4.1.tgz", + "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.1.tgz", + "integrity": "sha512-kf0tHHLrpwKaBAQOhYHXgdeh2PkFuCCxWgLb1MRn67ZQVo787D2pij3mmHVZx193GIdM8xcfi8HF6AIYYnj0fQ==", + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", + "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mermaid": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.14.0.tgz", + "integrity": "sha512-ITSHjwVaby1Li738sxhF48sLTxcNyUAoWfoqyztL1f7J6JOLpHOuQPNLBb6lxGPUA0u7xP9IRULgvod0dKu35A==", + "dependencies": { + "@braintree/sanitize-url": "^3.1.0", + "d3": "^7.0.0", + "dagre": "^0.8.5", + "dagre-d3": "^0.6.4", + "dompurify": "2.3.5", + "graphlib": "^2.1.8", + "khroma": "^1.4.1", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" + } + }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", + "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==" + }, + "node_modules/message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "dependencies": { + "lodash.template": "^4.5.0" + } + }, + "node_modules/meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, + "node_modules/meteor-node-stubs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", + "integrity": "sha512-YvMQb4zcfWA82wFdRVTyxq28GO+Us7GSdtP+bTtC/mV35yipKnWo4W4665O57AmLVFnz4zR+WIZW11b4sfCtJw==", + "bundleDependencies": [ + "assert", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "crypto-browserify", + "domain-browser", + "events", + "https-browserify", + "os-browserify", + "path-browserify", + "process", + "punycode", + "querystring-es3", + "readable-stream", + "stream-browserify", + "stream-http", + "string_decoder", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ], + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", + "elliptic": "^6.5.4", + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js": { + "version": "5.4.1", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/assert": { + "version": "2.0.0", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { + "version": "1.0.4", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/base64-js": { + "version": "1.5.1", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/bn.js": { + "version": "5.2.0", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/brorand": { + "version": "1.1.0", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/browserify-aes": { + "version": "1.2.0", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { + "version": "1.0.1", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-des": { + "version": "1.0.2", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { + "version": "4.1.0", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-sign": { + "version": "4.2.1", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { + "version": "0.2.0", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer": { + "version": "6.0.3", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer-xor": { + "version": "1.0.3", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { + "version": "3.0.0", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/call-bind": { + "version": "1.0.2", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/cipher-base": { + "version": "1.0.4", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/console-browserify": { + "version": "1.2.0", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "inBundle": true + }, + "node_modules/meteor-node-stubs/node_modules/constants-browserify": { + "version": "1.0.0", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh": { + "version": "4.0.4", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-hash": { + "version": "1.2.0", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-hmac": { + "version": "1.1.7", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { + "version": "3.12.0", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/define-properties": { + "version": "1.1.3", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/des.js": { + "version": "1.0.1", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { + "version": "5.0.3", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/domain-browser": { + "version": "4.19.0", + "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic": { + "version": "6.5.4", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/es-abstract": { + "version": "1.18.3", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { + "version": "1.2.1", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { + "version": "1.1.0", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/events": { + "version": "3.3.0", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { + "version": "1.0.3", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/foreach": { + "version": "2.0.5", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/function-bind": { + "version": "1.1.1", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { + "version": "1.1.1", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has": { + "version": "1.0.3", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-bigints": { + "version": "1.0.1", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-symbols": { + "version": "1.0.2", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash-base": { + "version": "3.1.0", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash.js": { + "version": "1.1.7", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { + "version": "1.0.1", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/https-browserify": { + "version": "1.0.0", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/ieee754": { + "version": "1.2.1", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/meteor-node-stubs/node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/is-arguments": { + "version": "1.1.0", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-bigint": { + "version": "1.0.2", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { + "version": "1.1.1", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-callable": { + "version": "1.2.3", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-date-object": { + "version": "1.0.4", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-generator-function": { + "version": "1.0.9", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-nan": { + "version": "1.3.2", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { + "version": "2.0.1", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-number-object": { + "version": "1.0.5", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-regex": { + "version": "1.1.3", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-string": { + "version": "1.0.6", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "version": "1.0.4", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-typed-array": { + "version": "1.1.5", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/md5.js": { + "version": "1.3.5", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin": { + "version": "4.0.1", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { + "version": "1.0.1", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/object-inspect": { + "version": "1.10.3", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-is": { + "version": "1.1.5", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-keys": { + "version": "1.1.1", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/object.assign": { + "version": "4.1.2", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/os-browserify": { + "version": "0.3.0", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pako": { + "version": "1.0.11", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "inBundle": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/meteor-node-stubs/node_modules/parse-asn1": { + "version": "5.1.6", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/path-browserify": { + "version": "1.0.1", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pbkdf2": { + "version": "3.1.2", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/meteor-node-stubs/node_modules/process": { + "version": "0.11.10", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt": { + "version": "4.0.3", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/punycode": { + "version": "2.1.1", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring": { + "version": "0.2.0", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring-es3": { + "version": "0.2.1", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/randombytes": { + "version": "2.1.0", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/randomfill": { + "version": "1.0.4", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/readable-stream": { + "version": "3.6.0", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/meteor-node-stubs/node_modules/ripemd160": { + "version": "2.0.2", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/setimmediate": { + "version": "1.0.5", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/sha.js": { + "version": "2.4.11", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "inBundle": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-browserify": { + "version": "3.0.0", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-http": { + "version": "3.2.0", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/string_decoder": { + "version": "1.3.0", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/timers-browserify": { + "version": "2.0.12", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/tty-browserify": { + "version": "0.0.1", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { + "version": "1.0.1", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/url": { + "version": "0.11.0", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/util": { + "version": "0.12.4", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/vm-browserify": { + "version": "1.1.2", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "version": "1.0.2", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/which-typed-array": { + "version": "1.1.4", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/xtend": { + "version": "4.0.2", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "node_modules/mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, + "node_modules/mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + }, + "node_modules/nodemailer": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", + "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/papaparse": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", + "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "deprecated": "Version no longer supported. Upgrade to @latest", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simpl-schema": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", + "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", + "dependencies": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, + "node_modules/sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "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" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.10.0" + } + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.16.0", @@ -371,7 +5817,6 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, "requires": { "type-detect": "4.0.8" } @@ -380,7 +5825,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -389,7 +5833,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -399,8 +5842,7 @@ "@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" }, "@types/node": { "version": "14.17.33", @@ -574,8 +6016,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "async": { "version": "3.2.2", @@ -778,7 +6219,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -1539,7 +6979,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, "requires": { "type-detect": "^4.0.0" } @@ -1570,8 +7009,7 @@ "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "dompurify": { "version": "2.3.6", @@ -1877,8 +7315,7 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" }, "get-intrinsic": { "version": "1.1.1", @@ -2161,8 +7598,7 @@ "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, "khroma": { "version": "1.4.1", @@ -2292,8 +7728,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.groupby": { "version": "4.6.0", @@ -2477,8 +7912,8 @@ "dependencies": { "asn1.js": { "version": "5.4.1", - "resolved": false, "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "bundled": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -2488,15 +7923,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "assert": { "version": "2.0.0", - "resolved": false, "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "bundled": true, "requires": { "es6-object-assign": "^1.1.0", "is-nan": "^1.2.1", @@ -2506,28 +7941,28 @@ }, "available-typed-arrays": { "version": "1.0.4", - "resolved": false, - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "bundled": true }, "base64-js": { "version": "1.5.1", - "resolved": false, - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "bundled": true }, "bn.js": { "version": "5.2.0", - "resolved": false, - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "bundled": true }, "brorand": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "bundled": true }, "browserify-aes": { "version": "1.2.0", - "resolved": false, "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "bundled": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -2539,8 +7974,8 @@ }, "browserify-cipher": { "version": "1.0.1", - "resolved": false, "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "bundled": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -2549,8 +7984,8 @@ }, "browserify-des": { "version": "1.0.2", - "resolved": false, "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "bundled": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -2560,8 +7995,8 @@ }, "browserify-rsa": { "version": "4.1.0", - "resolved": false, "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "bundled": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -2569,8 +8004,8 @@ }, "browserify-sign": { "version": "4.2.1", - "resolved": false, "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "bundled": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -2585,16 +8020,16 @@ }, "browserify-zlib": { "version": "0.2.0", - "resolved": false, "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "bundled": true, "requires": { "pako": "~1.0.5" } }, "buffer": { "version": "6.0.3", - "resolved": false, "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "bundled": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2602,18 +8037,18 @@ }, "buffer-xor": { "version": "1.0.3", - "resolved": false, - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "bundled": true }, "builtin-status-codes": { "version": "3.0.0", - "resolved": false, - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "bundled": true }, "call-bind": { "version": "1.0.2", - "resolved": false, "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "bundled": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2621,8 +8056,8 @@ }, "cipher-base": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "bundled": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2630,18 +8065,18 @@ }, "console-browserify": { "version": "1.2.0", - "resolved": false, - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "bundled": true }, "constants-browserify": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "bundled": true }, "create-ecdh": { "version": "4.0.4", - "resolved": false, "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "bundled": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -2649,15 +8084,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "create-hash": { "version": "1.2.0", - "resolved": false, "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "bundled": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -2668,8 +8103,8 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": false, "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "bundled": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -2681,8 +8116,8 @@ }, "crypto-browserify": { "version": "3.12.0", - "resolved": false, "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "bundled": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -2699,16 +8134,16 @@ }, "define-properties": { "version": "1.1.3", - "resolved": false, "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "bundled": true, "requires": { "object-keys": "^1.0.12" } }, "des.js": { "version": "1.0.1", - "resolved": false, "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "bundled": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -2716,8 +8151,8 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": false, "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "bundled": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -2726,20 +8161,20 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "domain-browser": { "version": "4.19.0", - "resolved": false, - "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" + "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==", + "bundled": true }, "elliptic": { "version": "6.5.4", - "resolved": false, "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "bundled": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -2752,15 +8187,15 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "es-abstract": { "version": "1.18.3", - "resolved": false, "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "bundled": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -2782,8 +8217,8 @@ }, "es-to-primitive": { "version": "1.2.1", - "resolved": false, "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "bundled": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2792,18 +8227,18 @@ }, "es6-object-assign": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "bundled": true }, "events": { "version": "3.3.0", - "resolved": false, - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "bundled": true }, "evp_bytestokey": { "version": "1.0.3", - "resolved": false, "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "bundled": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -2811,18 +8246,18 @@ }, "foreach": { "version": "2.0.5", - "resolved": false, - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "bundled": true }, "function-bind": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "bundled": true }, "get-intrinsic": { "version": "1.1.1", - "resolved": false, "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "bundled": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -2831,26 +8266,26 @@ }, "has": { "version": "1.0.3", - "resolved": false, "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "bundled": true, "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.1", - "resolved": false, - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "bundled": true }, "has-symbols": { "version": "1.0.2", - "resolved": false, - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "bundled": true }, "hash-base": { "version": "3.1.0", - "resolved": false, "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "bundled": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -2859,8 +8294,8 @@ }, "hash.js": { "version": "1.1.7", - "resolved": false, "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "bundled": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -2868,8 +8303,8 @@ }, "hmac-drbg": { "version": "1.0.1", - "resolved": false, "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "bundled": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -2878,59 +8313,59 @@ }, "https-browserify": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "bundled": true }, "ieee754": { "version": "1.2.1", - "resolved": false, - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "bundled": true }, "inherits": { "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "bundled": true }, "is-arguments": { "version": "1.1.0", - "resolved": false, "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "bundled": true, "requires": { "call-bind": "^1.0.0" } }, "is-bigint": { "version": "1.0.2", - "resolved": false, - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "bundled": true }, "is-boolean-object": { "version": "1.1.1", - "resolved": false, "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "bundled": true, "requires": { "call-bind": "^1.0.2" } }, "is-callable": { "version": "1.2.3", - "resolved": false, - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "bundled": true }, "is-date-object": { "version": "1.0.4", - "resolved": false, - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "bundled": true }, "is-generator-function": { "version": "1.0.9", - "resolved": false, - "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "bundled": true }, "is-nan": { "version": "1.3.2", - "resolved": false, "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "bundled": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -2938,18 +8373,18 @@ }, "is-negative-zero": { "version": "2.0.1", - "resolved": false, - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "bundled": true }, "is-number-object": { "version": "1.0.5", - "resolved": false, - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "bundled": true }, "is-regex": { "version": "1.1.3", - "resolved": false, "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "bundled": true, "requires": { "call-bind": "^1.0.2", "has-symbols": "^1.0.2" @@ -2957,21 +8392,21 @@ }, "is-string": { "version": "1.0.6", - "resolved": false, - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "bundled": true }, "is-symbol": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "bundled": true, "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { "version": "1.1.5", - "resolved": false, "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "bundled": true, "requires": { "available-typed-arrays": "^1.0.2", "call-bind": "^1.0.2", @@ -2982,8 +8417,8 @@ }, "md5.js": { "version": "1.3.5", - "resolved": false, "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "bundled": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -2992,8 +8427,8 @@ }, "miller-rabin": { "version": "4.0.1", - "resolved": false, "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "bundled": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -3001,30 +8436,30 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "minimalistic-assert": { "version": "1.0.1", - "resolved": false, - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "bundled": true }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": false, - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "bundled": true }, "object-inspect": { "version": "1.10.3", - "resolved": false, - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "bundled": true }, "object-is": { "version": "1.1.5", - "resolved": false, "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "bundled": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -3032,13 +8467,13 @@ }, "object-keys": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "bundled": true }, "object.assign": { "version": "4.1.2", - "resolved": false, "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "bundled": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -3048,18 +8483,18 @@ }, "os-browserify": { "version": "0.3.0", - "resolved": false, - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "bundled": true }, "pako": { "version": "1.0.11", - "resolved": false, - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "bundled": true }, "parse-asn1": { "version": "5.1.6", - "resolved": false, "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "bundled": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -3070,13 +8505,13 @@ }, "path-browserify": { "version": "1.0.1", - "resolved": false, - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "bundled": true }, "pbkdf2": { "version": "3.1.2", - "resolved": false, "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "bundled": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -3087,13 +8522,13 @@ }, "process": { "version": "0.11.10", - "resolved": false, - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "bundled": true }, "public-encrypt": { "version": "4.0.3", - "resolved": false, "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "bundled": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -3105,38 +8540,38 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "resolved": false, - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "bundled": true } } }, "punycode": { "version": "2.1.1", - "resolved": false, - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "bundled": true }, "querystring": { "version": "0.2.0", - "resolved": false, - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "bundled": true }, "querystring-es3": { "version": "0.2.1", - "resolved": false, - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "bundled": true }, "randombytes": { "version": "2.1.0", - "resolved": false, "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "bundled": true, "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "bundled": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -3144,8 +8579,8 @@ }, "readable-stream": { "version": "3.6.0", - "resolved": false, "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "bundled": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3154,8 +8589,8 @@ }, "ripemd160": { "version": "2.0.2", - "resolved": false, "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "bundled": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -3163,23 +8598,23 @@ }, "safe-buffer": { "version": "5.2.1", - "resolved": false, - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "bundled": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true }, "setimmediate": { "version": "1.0.5", - "resolved": false, - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "bundled": true }, "sha.js": { "version": "2.4.11", - "resolved": false, "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "bundled": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3187,8 +8622,8 @@ }, "stream-browserify": { "version": "3.0.0", - "resolved": false, "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "bundled": true, "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -3196,8 +8631,8 @@ }, "stream-http": { "version": "3.2.0", - "resolved": false, "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -3205,10 +8640,18 @@ "xtend": "^4.0.2" } }, + "string_decoder": { + "version": "1.3.0", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string.prototype.trimend": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "bundled": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -3216,38 +8659,30 @@ }, "string.prototype.trimstart": { "version": "1.0.4", - "resolved": false, "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "bundled": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": false, - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "timers-browserify": { "version": "2.0.12", - "resolved": false, "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "bundled": true, "requires": { "setimmediate": "^1.0.4" } }, "tty-browserify": { "version": "0.0.1", - "resolved": false, - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "bundled": true }, "unbox-primitive": { "version": "1.0.1", - "resolved": false, "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "bundled": true, "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -3257,8 +8692,8 @@ }, "url": { "version": "0.11.0", - "resolved": false, "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "bundled": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -3266,15 +8701,15 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": false, - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "bundled": true } } }, "util": { "version": "0.12.4", - "resolved": false, "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "bundled": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -3286,18 +8721,18 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true }, "vm-browserify": { "version": "1.1.2", - "resolved": false, - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "bundled": true }, "which-boxed-primitive": { "version": "1.0.2", - "resolved": false, "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "bundled": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -3308,8 +8743,8 @@ }, "which-typed-array": { "version": "1.1.4", - "resolved": false, "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "bundled": true, "requires": { "available-typed-arrays": "^1.0.2", "call-bind": "^1.0.0", @@ -3322,8 +8757,8 @@ }, "xtend": { "version": "4.0.2", - "resolved": false, - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "bundled": true } } }, @@ -3372,9 +8807,9 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "moment-mini": { "version": "2.24.0", @@ -3438,7 +8873,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^7.0.4", @@ -3451,7 +8885,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, "requires": { "isarray": "0.0.1" } @@ -3595,8 +9028,7 @@ "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "pend": { "version": "1.2.0", @@ -3824,7 +9256,6 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^7.1.2", @@ -3837,14 +9268,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3854,7 +9283,8 @@ "sinon-chai": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==" + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "requires": {} }, "source-map": { "version": "0.5.7", @@ -3886,16 +9316,6 @@ "memory-pager": "^1.0.2" } }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3911,6 +9331,16 @@ } } }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -4023,8 +9453,7 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "typedarray": { "version": "0.0.6", diff --git a/package.json b/package.json index 9625b8a0d..73df38ab8 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "markdown-it-emoji": "^2.0.0", "meteor-accounts-t9n": "^2.6.0", "meteor-node-stubs": "^1.1.0", - "moment": "^2.29.1", + "moment": "^2.29.3", "mongodb": "^3.7.3", "nodemailer": "^6.6.3", "os": "^0.1.2", From 59531f785ab27855c4b32045ebedad5020d33890 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 18 Apr 2022 22:29:27 +0300 Subject: [PATCH 079/246] Updated translations. --- imports/i18n/data/fr.i18n.json | 24 +- imports/i18n/data/he.i18n.json | 6 +- imports/i18n/data/uk-UA.i18n.json | 1167 +++++++++++++++++++++++++++++ imports/i18n/data/uk.i18n.json | 1167 +++++++++++++++++++++++++++++ 4 files changed, 2349 insertions(+), 15 deletions(-) create mode 100644 imports/i18n/data/uk-UA.i18n.json create mode 100644 imports/i18n/data/uk.i18n.json diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json index a63bb6383..dccddc3ce 100644 --- a/imports/i18n/data/fr.i18n.json +++ b/imports/i18n/data/fr.i18n.json @@ -135,12 +135,12 @@ "avatar-too-big": "La taille du fichier de l'avatar est trop importante (520 ko au maximum)", "back": "Retour", "board-change-color": "Changer la couleur", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", + "show-at-all-boards-page": "Afficher sur la page de tous les tableaux", + "board-info-on-my-boards": "Paramètres de tous les tableaux", + "boardInfoOnMyBoardsPopup-title": "Paramètres de tous les tableaux", + "boardInfoOnMyBoards-title": "Paramètres de tous les tableaux", + "show-card-counter-per-list": "Afficher le nombre de cartes par liste", + "show-board_members-avatar": "Afficher les avatars des participants du tableau.", "board-nb-stars": "%s étoiles", "board-not-found": "Tableau non trouvé", "board-private-info": "Ce tableau sera <strong>privé</strong>", @@ -707,10 +707,10 @@ "queue": "Queue", "subtask-settings": "Paramètres des sous-tâches", "card-settings": "Paramètres de la carte", - "minicard-settings": "Minicard Settings", + "minicard-settings": "Paramètres de la minicarte", "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches du tableau", "boardCardSettingsPopup-title": "Paramètres de la carte", - "boardMinicardSettingsPopup-title": "Minicard Settings", + "boardMinicardSettingsPopup-title": "Paramètres de la minicarte", "deposit-subtasks-board": "Déposer des sous-tâches dans ce tableau :", "deposit-subtasks-list": "Liste de destination pour les sous-tâches déposées ici :", "show-parent-in-minicard": "Voir la carte parente dans la mini-carte :", @@ -892,7 +892,7 @@ "cardAssigneesPopup-title": "Personne assignée", "addmore-detail": "Ajouter une description plus détaillée", "show-on-card": "Afficher sur la carte", - "show-on-minicard": "Show on Minicard", + "show-on-minicard": "Afficher sur la minicarte", "new": "Nouveau", "editOrgPopup-title": "Éditer l'organisation", "newOrgPopup-title": "Nouvelle organisation", @@ -938,10 +938,10 @@ "card": "Carte", "board": "Tableau", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "Vue mes cartes", + "myCardsViewChangePopup-title": "Vue mes cartes", "myCardsViewChange-choice-boards": "Tableaux", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "Tableau", "myCardsSortChange-title": "Trier Mes Cartes", "myCardsSortChangePopup-title": "Trier Mes Cartes", "myCardsSortChange-choice-board": "Par tableau", diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index ae51e0916..9c72badc1 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -938,10 +938,10 @@ "card": "כרטיס", "board": "לוח", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "תצוגת הכרטיסים שלי", + "myCardsViewChangePopup-title": "תצוגת הכרטיסים שלי", "myCardsViewChange-choice-boards": "לוחות", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "טבלה", "myCardsSortChange-title": "סידור הכרטיסים שלי", "myCardsSortChangePopup-title": "סידור הכרטיסים שלי", "myCardsSortChange-choice-board": "הלוח שלי", diff --git a/imports/i18n/data/uk-UA.i18n.json b/imports/i18n/data/uk-UA.i18n.json new file mode 100644 index 000000000..757c156a1 --- /dev/null +++ b/imports/i18n/data/uk-UA.i18n.json @@ -0,0 +1,1167 @@ +{ + "accept": "Прийняти", + "act-activity-notify": "Сповіщення про дії учасників", + "act-addAttachment": "прикріплено вкладення __attachment__ до картки__card__ у списку __list__ на доріжці __swimlane__ дошки__board__", + "act-deleteAttachment": "видалено вкладення __attachment__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addSubtask": "додано підзадачу __subtask__ для картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addLabel": "Додано мітку __label__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addedLabel": "Додано мітку __label__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removeLabel": "Знято мітку __label__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removedLabel": "Знято мітку __label__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addChecklist": "додано контрольний список __checklist__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addChecklistItem": "додано пункт __checklistItem__ до контрольного списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removeChecklist": "видалено контрольний список __checklist__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removeChecklistItem": "видалено пункт __checklistItem__ з контрольного списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-checkedItem": "позначено виконаним __checklistItem__ у контрольному списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-uncheckedItem": "позначено як невиконане __checklistItem__ у контрольному списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "Дошку __board__створено", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Дошку __board__ переміщено до Архіву", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "Імпортовано дошку __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Дії", + "activities": "Діяльності", + "activity": "Діяльність", + "activity-added": "%s додано до %s", + "activity-archived": "%s перенесено до архіву", + "activity-attached": "%s прикріплено до %s", + "activity-created": "%sстворено", + "activity-customfield-created": "Створено спеціальне поле%s", + "activity-excluded": "%s виключено з %s", + "activity-imported": "%s імпортовано до %s з %s", + "activity-imported-board": "%s імпортовано з %s", + "activity-joined": "%s приєднано", + "activity-moved": "%s переміщено з %s до %s", + "activity-on": "%s", + "activity-removed": "%s видалено з %s", + "activity-sent": "%s відправлено до %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "Додано підзадачу до %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "Додано контрольний список до %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Додати", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "відредаговано коментар %s", + "activity-deleteComment": "видалено коментар %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Додати вкладення", + "add-board": "Додати дошку", + "add-template": "Додати шаблон", + "add-card": "Додати картку", + "add-card-to-top-of-list": "Додати картку на початок списку", + "add-card-to-bottom-of-list": "Додати картку у кінець списку", + "add-swimlane": "Add Swimlane", + "add-subtask": "Додати підзадачу", + "add-checklist": "Додати контрольній список", + "add-checklist-item": "Додати елемент в список", + "convertChecklistItemToCardPopup-title": "Перетворити у картку", + "add-cover": "Додати обкладинку", + "add-label": "Додати мітку", + "add-list": "Додати список", + "add-members": "Додати користувача", + "added": "Доданно", + "addMemberPopup-title": "Користувачі", + "memberPopup-title": "Налаштування користувачів", + "admin": "Адмін", + "admin-desc": "Може переглядати і редагувати картки, відаляти учасників та змінювати налаштування для дошки.", + "admin-announcement": "Оголошення", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "Всі дошки", + "and-n-other-card": "та __count__ інших карток", + "and-n-other-card_plural": "та __count__ інших карток", + "apply": "Прийняти", + "app-is-offline": "Завантаження, будь ласка, зачекайте. Оновлення сторінки призведе до втрати даних. Якщо завантаження не працює, перевірте, чи не зупинився сервер.", + "app-try-reconnect": "Повторити зєднання.", + "archive": "Перенести до Архіву", + "archive-all": "Перенести Все до Архіву", + "archive-board": "Перенести Дошку до Архіву", + "archive-card": "Перенести Картку до Архіву", + "archive-list": "Перенести Список до Архіву", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Перенести Дошку до Архіву?", + "archived-items": "Архів", + "archived-boards": "Дошки в архіві", + "restore-board": "Відновити дошку", + "no-archived-boards": "Немає дошок в архіві", + "archives": "Архів", + "template": "Шаблон", + "templates": "Шаблони", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Призначити користувача", + "attached": "доданно", + "attachment": "Додаток", + "attachment-delete-pop": "Видалення Додатку безповоротне. Тут нема відміні (undo).", + "attachmentDeletePopup-title": "Видалити Додаток?", + "attachments": "Додатки", + "auto-watch": "Автоматично дивитися дошки, коли вони створені", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Назад", + "board-change-color": "Змінити колір", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Дошка не знайдена", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Змінити Фон Дошки", + "boardChangeTitlePopup-title": "Перейменувати дошку", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Вид Дошки", + "boards": "Дошки", + "board-view": "Вид Дошки", + "board-view-cal": "Календар", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Відміна", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Цю дію неможливо буде скасувати. Всі зміни, які ви вносили в картку будуть втрачені.", + "card-delete-pop": "Усі дії буде видалено з каналу активності, і ви не зможете повторно відкрити картку. Цю дію не можна скасувати.", + "card-delete-suggest-archive": "Ви можете перемістити картку до архіву, щоб прибрати її з дошки, зберігаючи всю історію дій учасників.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Витрачено часу", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Редагувати мітки", + "card-edit-members": "Редагувати учасників", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Видалити картку?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Користувачі", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Картки", + "cards-count": "Картки", + "cards-count-one": "Картка", + "casSignIn": "Sign In with CAS", + "cardType-card": "Картка", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Змінити", + "change-avatar": "Змінити аватар", + "change-password": "Змінити пароль", + "change-permissions": "Change permissions", + "change-settings": "Змінити налаштування", + "changeAvatarPopup-title": "Змінити аватар", + "changeLanguagePopup-title": "Змінити мову", + "changePasswordPopup-title": "Змінити пароль", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Змінити налаштування", + "subtasks": "Підзадачі", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Закрити", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "чорний", + "color-blue": "синій", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "зелений", + "color-indigo": "indigo", + "color-lime": "лайм", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "помаранчевий", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "рожевий", + "color-plum": "plum", + "color-purple": "фіолетовий", + "color-red": "червоний", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "жовтий", + "unset-color": "Unset", + "comment": "Коментар", + "comment-placeholder": "Написати коментар", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "Немає коментарів", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Скопіювати посилання на картку в буфер обміну", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Шукати", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Дата", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Номер", + "custom-field-text": "Текст", + "custom-fields": "Custom Fields", + "date": "Дата", + "decline": "Відхилити", + "default-avatar": "Аватар за замовчуванням", + "delete": "Видалити", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Опис", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Відхилити", + "done": "Done", + "download": "Завантажити", + "edit": "Редагувати", + "edit-avatar": "Змінити аватар", + "edit-profile": "Редагувати Профіль", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Редагувати Профіль", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Версія", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "приєднано", + "just-invited": "Ви тільки що приєдналися до цієї дошки", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Мова", + "last-admin-desc": "Ви не можете змінити ролі, бо повинен бути хоча б один адміністратор", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Залишити Дошку?", + "link-card": "Посилання на цю картку", + "list-archive-cards": "Перенести всі картки в цьому переліку до Архиву", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Встановити Колір", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Користувачі", + "menu": "Меню", + "move-selection": "Перенести обране", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Перенести до Низу", + "moveCardToTop-title": "Перенести на Початок", + "moveSelectionPopup-title": "Перенести обране", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "Це приватна дошка. Тільки люди, додані до цієї дошки можуть переглядати та редагувати її.", + "profile": "Profile", + "public": "Public", + "public-desc": "Цю дошку можуть переглядати усі, у кого є посилання. Також ця дошка може бути проіндексована пошуковими системами. Вносити зміни можуть тільки учасники.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Видалити Обкладинку", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Видалити Список?", + "remove-member": "Видалити Учасника", + "remove-member-from-card": "Видалити з Картки", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Видалити Учасника?", + "rename": "Перейменувати", + "rename-board": "Перейменувати дошку", + "restore": "Відновити", + "save": "Зберегти", + "search": "Шукати", + "rules": "Правила", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Оберіть Коліп", + "select-board": "Оберіть Дошку", + "set-wip-limit-value": "Встановіть обмеження максимальної кількості завдань в цьому списку", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Призначити себе до поточної картки", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Автозавершення учасників", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Фільтрувати мої картки", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Перемкнути бічну панель Фільтра", + "shortcut-toggle-searchbar": "Перемкнути бічну панель Пошуку", + "shortcut-toggle-sidebar": "Перемкнути бічну панель Дошки", + "show-cards-minimum-count": "Показувати кількість карток, якщо список містить більше, ніж", + "sidebar-open": "Відкрити бокову панель", + "sidebar-close": "Закрити бокову панель", + "signupPopup-title": "Створити Обліковий запис", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Команда", + "this-board": "ця дошка", + "this-card": "ця картка", + "spent-time-hours": "Витрачено часу(годин)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Час", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "Ви будете повідомлені про будь-які зміни в тих картках, в яких ви є творцем або учасником.", + "type": "Тип", + "unassign-member": "Unassign member", + "unsaved-description": "Ви маєте незбрежений опис", + "unwatch": "Unwatch", + "upload": "Завантажити", + "upload-avatar": "Завантажити аватар", + "uploaded-avatar": "Завантажений аватар", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "Переглянути це", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Шаблони Дошок", + "what-to-do": "Що ви хочете зробити?", + "wipLimitErrorPopup-title": "Некоректне Обмеження WIP", + "wipLimitErrorPopup-dialog-pt1": "Кількість завдань у цьому списку перевищує встановлений вами ліміт", + "wipLimitErrorPopup-dialog-pt2": "Будь ласка, перенесіть деякі завдання з цього списку або збільште ліміт на кількість завдань", + "admin-panel": "Панель Адміністратора", + "settings": "Налаштування", + "people": "Люди", + "registration": "Реєстрація", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "Лист перевірки SMTP", + "email-smtp-test-text": "Ви успішно надіслали e-mail", + "error-invitation-code-not-exist": "Код запрошення не існує", + "error-notAuthorized": "Ви не авторизовані для перегляду цієї сторінки.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Дозволити Зміну Email", + "accounts-allowUserNameChange": "Дозволити Зміну Імені Користувача", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Створено", + "modifiedAt": "Modified at", + "verified": "Перевірено", + "active": "Активно", + "card-received": "Отримано", + "card-received-on": "Received on", + "card-end": "Кінець", + "card-end-on": "Закінчується на", + "editCardReceivedDatePopup-title": "Змінити дату отримання", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Оберіть колір", + "setSwimlaneColorPopup-title": "Оберіть колір", + "setListColorPopup-title": "Оберіть колір", + "assigned-by": "Assigned By", + "requested-by": "Запитано", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Це видалення назавжди. Ви втратите всі листи, картки та дії, пов'язані з цією дошкою.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Правило", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Дошка правил", + "r-add-rule": "Add rule", + "r-view-rule": "Переглянути правило", + "r-delete-rule": "Видалити правило", + "r-new-rule-name": "Заголовок нового правила", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Видалити з", + "r-the-board": "Дошка", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "переміщено до", + "r-moved-from": "переміщено з", + "r-archived": "переміщено до Архіву", + "r-unarchived": "Відновлено з Архіву", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Перенести до Архіву", + "r-unarchive": "Restore from Archive", + "r-card": "Картка", + "r-add": "Додати", + "r-remove": "Видалити", + "r-label": "label", + "r-member": "Користувач", + "r-remove-all": "Видалити усіх учасників картки", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Обрати", + "r-uncheck": "Відхилити Обрання", + "r-item": "одиниця", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "Об'єкт", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Відправити email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "Об'єкт", + "r-d-send-email-message": "повідомлення", + "r-d-archive": "Перенести Картку до Архиву", + "r-d-unarchive": "Відновити Картку з Архіву", + "r-d-add-label": "Додатку мітку", + "r-d-remove-label": "Видалити мітку", + "r-create-card": "Створити нову картку", + "r-in-list": "в переліку", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Додати користувача", + "r-d-remove-member": "Видалити користувача", + "r-d-remove-all-member": "Видалити всіх учасників", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Оновити", + "r-datefield": "поле для дати", + "r-df-start-at": "початок", + "r-df-due-at": "до", + "r-df-end-at": "кінець", + "r-df-received-at": "отримано", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "метод Автентифікації", + "authentication-type": "тип Автентифікації", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Відновити все", + "delete-all": "Видалити все", + "loading": "Завантаження, зачекайте будь-ласка.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ має 1-ше нагадування визначеного терміну [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "Ви були згадані у [__board__] __list__/__card__", + "delete-user-confirm-popup": "Ви дійсно бажаєте видалити даний обліковий запис? Цю дію не можна відмінити.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Дозволити користувачам видаляти їх власні облікові записи", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Статус", + "swimlane": "Swimlane", + "owner": "Власник", + "last-modified-at": "Востаннє змінено", + "last-activity": "Остання активність", + "voting": "Голосування", + "archived": "Архівовано", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Сховати обрані елементи", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Картка", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Дошки", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "Користувач", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "до", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "до", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "початок", + "predicate-end": "кінець", + "predicate-assignee": "assignee", + "predicate-member": "Користувач", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Номер", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Відкрити", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Видалити", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Додати організацію", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Копійовано!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions" +} \ No newline at end of file diff --git a/imports/i18n/data/uk.i18n.json b/imports/i18n/data/uk.i18n.json new file mode 100644 index 000000000..1e0cf62a8 --- /dev/null +++ b/imports/i18n/data/uk.i18n.json @@ -0,0 +1,1167 @@ +{ + "accept": "Прийняти", + "act-activity-notify": "Сповіщення про дії учасників", + "act-addAttachment": "прикріплено вкладення __attachment__ до картки__card__ у списку __list__ на доріжці __swimlane__ дошки__board__", + "act-deleteAttachment": "видалено вкладення __attachment__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addSubtask": "додано підзадачу __subtask__ для картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addLabel": "Додано мітку __label__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__\n ", + "act-addedLabel": "Додано мітку __label__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__\n ", + "act-removeLabel": "Знято мітку __label__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removedLabel": "Знято мітку __label__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addChecklist": "додано контрольний список __checklist__ до картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-addChecklistItem": "додано пункт __checklistItem__ до контрольного списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removeChecklist": "видалено контрольний список __checklist__ з картки __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-removeChecklistItem": "видалено пункт __checklistItem__ з контрольного списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-checkedItem": "позначено виконаним __checklistItem__ у контрольному списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-uncheckedItem": "позначено як невиконане __checklistItem__ у контрольному списку __checklist__ у картці __card__ у списку __list__ на доріжці __swimlane__ дошки __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "Дошку __board__створено", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Дошку __board__ переміщено до Архіву", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "Імпортовано дошку __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Дії", + "activities": "Діяльності", + "activity": "Діяльність", + "activity-added": "%s додано до %s", + "activity-archived": "%s перенесено до архіву", + "activity-attached": "%s прикріплено до %s", + "activity-created": "%sстворено", + "activity-customfield-created": "Створено спеціальне поле%s", + "activity-excluded": "%s виключено з %s", + "activity-imported": "%s імпортовано до %s з %s", + "activity-imported-board": "%s імпортовано з %s", + "activity-joined": "%s приєднано", + "activity-moved": "%s переміщено з %s до %s", + "activity-on": "%s", + "activity-removed": "%s видалено з %s", + "activity-sent": "%s відправлено до %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "Додано підзадачу до %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "Додано контрольний список до %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Додати", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "відредаговано коментар %s", + "activity-deleteComment": "видалено коментар %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Додати вкладення", + "add-board": "Додати дошку", + "add-template": "Add Template", + "add-card": "Додати картку", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Додати підзадачу", + "add-checklist": "Add Checklist", + "add-checklist-item": "Додати елемент в список", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Додати обкладинку", + "add-label": "Додати мітку", + "add-list": "Додати список", + "add-members": "Додати користувача", + "added": "Доданно", + "addMemberPopup-title": "Користувачі", + "memberPopup-title": "Member Settings", + "admin": "Адмін", + "admin-desc": "Може переглядати і редагувати картки, відаляти учасників та змінювати налаштування для дошки.", + "admin-announcement": "Оголошення", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "Всі дошки", + "and-n-other-card": "та __count__ інших карток", + "and-n-other-card_plural": "та __count__ інших карток", + "apply": "Прийняти", + "app-is-offline": "Завантаження, будь ласка, зачекайте. Оновлення сторінки призведе до втрати даних. Якщо завантаження не працює, перевірте, чи не зупинився сервер.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Перенести до Архіву", + "archive-all": "Перенести Все до Архіву", + "archive-board": "Перенести Дошку до Архіву", + "archive-card": "Перенести Картку до Архіву", + "archive-list": "Перенести Список до Архіву", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Перенести Дошку до Архіву?", + "archived-items": "Архів", + "archived-boards": "Дошки в архіві", + "restore-board": "Відновити дошку", + "no-archived-boards": "Немає дошок в архіві", + "archives": "Архів", + "template": "Шаблон", + "templates": "Шаблони", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Призначити користувача", + "attached": "доданно", + "attachment": "Додаток", + "attachment-delete-pop": "Видалення Додатку безповоротне. Тут нема відміні (undo).", + "attachmentDeletePopup-title": "Видалити Додаток?", + "attachments": "Додатки", + "auto-watch": "Автоматично дивитися дошки, коли вони створені", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Назад", + "board-change-color": "Змінити колір", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Дошка не знайдена", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Змінити Фон Дошки", + "boardChangeTitlePopup-title": "Перейменувати дошку", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Вид Дошки", + "boards": "Дошки", + "board-view": "Вид Дошки", + "board-view-cal": "Календар", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Відміна", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Цю дію неможливо буде скасувати. Всі зміни, які ви вносили в картку будуть втрачені.", + "card-delete-pop": "Усі дії буде видалено з каналу активності, і ви не зможете повторно відкрити картку. Цю дію не можна скасувати.", + "card-delete-suggest-archive": "Ви можете перемістити картку до архіву, щоб прибрати її з дошки, зберігаючи всю історію дій учасників.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Витрачено часу", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Редагувати мітки", + "card-edit-members": "Редагувати учасників", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Видалити картку?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Користувачі", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Картки", + "cards-count": "Картки", + "cards-count-one": "Картка", + "casSignIn": "Sign In with CAS", + "cardType-card": "Картка", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Змінити", + "change-avatar": "Змінити аватар", + "change-password": "Змінити пароль", + "change-permissions": "Change permissions", + "change-settings": "Змінити налаштування", + "changeAvatarPopup-title": "Змінити аватар", + "changeLanguagePopup-title": "Змінити мову", + "changePasswordPopup-title": "Змінити пароль", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Змінити налаштування", + "subtasks": "Підзадачі", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Закрити", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "чорний", + "color-blue": "синій", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "зелений", + "color-indigo": "indigo", + "color-lime": "лайм", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "помаранчевий", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "рожевий", + "color-plum": "plum", + "color-purple": "фіолетовий", + "color-red": "червоний", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "жовтий", + "unset-color": "Unset", + "comment": "Коментар", + "comment-placeholder": "Написати коментар", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "Немає коментарів", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Скопіювати посилання на картку в буфер обміну", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Шукати", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Дата", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Номер", + "custom-field-text": "Текст", + "custom-fields": "Custom Fields", + "date": "Дата", + "decline": "Відхилити", + "default-avatar": "Аватар за замовчуванням", + "delete": "Видалити", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Опис", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Відхилити", + "done": "Done", + "download": "Завантажити", + "edit": "Редагувати", + "edit-avatar": "Змінити аватар", + "edit-profile": "Редагувати Профіль", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Редагувати Профіль", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Версія", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "приєднано", + "just-invited": "Ви тільки що приєдналися до цієї дошки", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Мова", + "last-admin-desc": "Ви не можете змінити ролі, бо повинен бути хоча б один адміністратор", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Залишити Дошку?", + "link-card": "Посилання на цю картку", + "list-archive-cards": "Перенести всі картки в цьому переліку до Архиву ", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Встановити Колір", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Користувачі", + "menu": "Меню", + "move-selection": "Перенести обране", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Перенести до Низу", + "moveCardToTop-title": "Перенести на Початок", + "moveSelectionPopup-title": "Перенести обране", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "Це приватна дошка. Тільки люди, додані до цієї дошки можуть переглядати та редагувати її.", + "profile": "Profile", + "public": "Public", + "public-desc": "Цю дошку можуть переглядати усі, у кого є посилання. Також ця дошка може бути проіндексована пошуковими системами. Вносити зміни можуть тільки учасники.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Видалити Обкладинку", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Видалити Список?", + "remove-member": "Видалити Учасника", + "remove-member-from-card": "Видалити з Картки", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Видалити Учасника?", + "rename": "Перейменувати", + "rename-board": "Перейменувати дошку", + "restore": "Відновити", + "save": "Зберегти", + "search": "Шукати", + "rules": "Правила", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Оберіть Коліп", + "select-board": "Оберіть Дошку ", + "set-wip-limit-value": "Встановіть обмеження максимальної кількості завдань в цьому списку", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Призначити себе до поточної картки", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Автозавершення учасників", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Фільтрувати мої картки", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Перемкнути бічну панель Фільтра", + "shortcut-toggle-searchbar": "Перемкнути бічну панель Пошуку", + "shortcut-toggle-sidebar": "Перемкнути бічну панель Дошки", + "show-cards-minimum-count": "Показувати кількість карток, якщо список містить більше, ніж", + "sidebar-open": "Відкрити бокову панель", + "sidebar-close": "Закрити бокову панель", + "signupPopup-title": "Створити Обліковий запис", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Команда", + "this-board": "ця дошка", + "this-card": "ця картка", + "spent-time-hours": "Витрачено часу(годин)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Час", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "Ви будете повідомлені про будь-які зміни в тих картках, в яких ви є творцем або учасником.", + "type": "Тип", + "unassign-member": "Unassign member", + "unsaved-description": "Ви маєте незбрежений опис", + "unwatch": "Unwatch", + "upload": "Завантажити", + "upload-avatar": "Завантажити аватар", + "uploaded-avatar": "Завантажений аватар", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "Переглянути це", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Шаблони Дошок", + "what-to-do": "Що ви хочете зробити?", + "wipLimitErrorPopup-title": "Некоректне Обмеження WIP", + "wipLimitErrorPopup-dialog-pt1": "Кількість завдань у цьому списку перевищує встановлений вами ліміт", + "wipLimitErrorPopup-dialog-pt2": "Будь ласка, перенесіть деякі завдання з цього списку або збільште ліміт на кількість завдань", + "admin-panel": "Панель Адміністратора", + "settings": "Налаштування", + "people": "Люди", + "registration": "Реєстрація", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "Лист перевірки SMTP", + "email-smtp-test-text": "Ви успішно надіслали e-mail", + "error-invitation-code-not-exist": "Код запрошення не існує", + "error-notAuthorized": "Ви не авторизовані для перегляду цієї сторінки.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Дозволити Зміну Email", + "accounts-allowUserNameChange": "Дозволити Зміну Імені Користувача", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Створено", + "modifiedAt": "Modified at", + "verified": "Перевірено", + "active": "Активно", + "card-received": "Отримано", + "card-received-on": "Received on", + "card-end": "Кінець", + "card-end-on": "Закінчується на", + "editCardReceivedDatePopup-title": "Змінити дату отримання", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Оберіть колір", + "setSwimlaneColorPopup-title": "Оберіть колір", + "setListColorPopup-title": "Оберіть колір", + "assigned-by": "Assigned By", + "requested-by": "Запитано", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Це видалення назавжди. Ви втратите всі листи, картки та дії, пов'язані з цією дошкою.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Правило", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Дошка правил", + "r-add-rule": "Add rule", + "r-view-rule": "Переглянути правило", + "r-delete-rule": "Видалити правило", + "r-new-rule-name": "Заголовок нового правила\n", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Видалити з", + "r-the-board": "Дошка", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "переміщено до", + "r-moved-from": "переміщено з", + "r-archived": "переміщено до Архіву", + "r-unarchived": "Відновлено з Архіву", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Перенести до Архіву", + "r-unarchive": "Restore from Archive", + "r-card": "Картка", + "r-add": "Додати", + "r-remove": "Видалити\n", + "r-label": "label", + "r-member": "Користувач", + "r-remove-all": "Видалити усіх учасників картки", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Обрати", + "r-uncheck": "Відхилити Обрання", + "r-item": "одиниця", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "Об'єкт", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Відправити email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "Об'єкт", + "r-d-send-email-message": "повідомлення", + "r-d-archive": "Перенести Картку до Архиву", + "r-d-unarchive": "Відновити Картку з Архіву", + "r-d-add-label": "Додатку мітку", + "r-d-remove-label": "Видалити мітку", + "r-create-card": "Створити нову картку", + "r-in-list": "в переліку", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Додати користувача", + "r-d-remove-member": "Видалити користувача", + "r-d-remove-all-member": "Видалити всіх учасників", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Оновити", + "r-datefield": "поле для дати", + "r-df-start-at": "початок", + "r-df-due-at": "до", + "r-df-end-at": "кінець", + "r-df-received-at": "отримано", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "метод Автентифікації", + "authentication-type": "тип Автентифікації", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Відновити все", + "delete-all": "Видалити все", + "loading": "Завантаження, зачекайте будь-ласка.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ має 1-ше нагадування визначеного терміну [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "Ви були згадані у [__board__] __list__/__card__", + "delete-user-confirm-popup": "Ви дійсно бажаєте видалити даний обліковий запис? Цю дію не можна відмінити.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Дозволити користувачам видаляти їх власні облікові записи", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Статус", + "swimlane": "Swimlane", + "owner": "Власник", + "last-modified-at": "Востаннє змінено", + "last-activity": "Остання активність", + "voting": "Голосування", + "archived": "Архівовано", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Сховати обрані елементи", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Картка", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Дошки", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "Користувач", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "до", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "до", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "початок", + "predicate-end": "кінець", + "predicate-assignee": "assignee", + "predicate-member": "Користувач", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Номер", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Видалити\n", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions" +} \ No newline at end of file From 74fc42a08c06b9629e973d39830277dc3c657b6b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 18 Apr 2022 23:28:33 +0300 Subject: [PATCH 080/246] Upgraded to Meteor 2.7.2-beta.0 . Thanks to denihs ! Related https://github.com/meteor/meteor/pull/11999, related https://github.com/wekan/wekan/pull/4482 --- .meteor/packages | 2 +- .meteor/release | 2 +- .meteor/versions | 10 +-- package-lock.json | 212 ---------------------------------------------- 4 files changed, 7 insertions(+), 219 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index f684ee6e8..974527a7e 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -22,7 +22,7 @@ cottz:publish-relations dburles:collection-helpers idmontie:migrations matteodem:easy-search -mongo@1.14.6 +mongo@1.15.0-beta272.0 mquandalle:collection-mutations # Account system diff --git a/.meteor/release b/.meteor/release index 8e3f1708a..375811b97 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.1 +METEOR@2.7.2-beta.0 diff --git a/.meteor/versions b/.meteor/versions index efcb075c9..4e1be1297 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,4 +1,4 @@ -accounts-base@2.2.2 +accounts-base@2.2.3-beta272.0 accounts-password@2.3.1 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 @@ -102,12 +102,12 @@ minifier-js@2.7.4 minifiers@1.1.8-faster-rebuild.0 minimongo@1.8.0 mobile-status-bar@1.1.0 -modern-browsers@0.1.7 +modern-browsers@0.1.8-beta272.0 modules@0.18.0 modules-runtime@0.13.0 momentjs:moment@2.29.3 -mongo@1.14.6 -mongo-decimal@0.1.2 +mongo@1.15.0-beta272.0 +mongo-decimal@0.1.3 mongo-dev-server@1.1.0 mongo-id@1.0.8 mongo-livedata@1.0.12 @@ -206,7 +206,7 @@ simple:json-routes@2.3.1 simple:rest-accounts-password@1.2.1 simple:rest-bearer-token-parser@1.1.1 simple:rest-json-error-handler@1.1.1 -socket-stream-client@0.4.0 +socket-stream-client@0.5.0-beta272.0 spacebars@1.3.0 spacebars-compiler@1.3.1 standard-minifier-css@1.8.1 diff --git a/package-lock.json b/package-lock.json index f40c63755..56995e8bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3120,7 +3120,6 @@ }, "node_modules/meteor-node-stubs/node_modules/asn1.js": { "version": "5.4.1", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3132,13 +3131,11 @@ }, "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/assert": { "version": "2.0.0", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3150,7 +3147,6 @@ }, "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { "version": "1.0.4", - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", "inBundle": true, "license": "MIT", "engines": { @@ -3162,7 +3158,6 @@ }, "node_modules/meteor-node-stubs/node_modules/base64-js": { "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3182,19 +3177,16 @@ }, "node_modules/meteor-node-stubs/node_modules/bn.js": { "version": "5.2.0", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/brorand": { "version": "1.1.0", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/browserify-aes": { "version": "1.2.0", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3208,7 +3200,6 @@ }, "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { "version": "1.0.1", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3219,7 +3210,6 @@ }, "node_modules/meteor-node-stubs/node_modules/browserify-des": { "version": "1.0.2", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3231,7 +3221,6 @@ }, "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { "version": "4.1.0", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3241,7 +3230,6 @@ }, "node_modules/meteor-node-stubs/node_modules/browserify-sign": { "version": "4.2.1", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "inBundle": true, "license": "ISC", "dependencies": { @@ -3258,7 +3246,6 @@ }, "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { "version": "0.2.0", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3267,7 +3254,6 @@ }, "node_modules/meteor-node-stubs/node_modules/buffer": { "version": "6.0.3", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -3291,19 +3277,16 @@ }, "node_modules/meteor-node-stubs/node_modules/buffer-xor": { "version": "1.0.3", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { "version": "3.0.0", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/call-bind": { "version": "1.0.2", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3316,7 +3299,6 @@ }, "node_modules/meteor-node-stubs/node_modules/cipher-base": { "version": "1.0.4", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3326,18 +3308,15 @@ }, "node_modules/meteor-node-stubs/node_modules/console-browserify": { "version": "1.2.0", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "inBundle": true }, "node_modules/meteor-node-stubs/node_modules/constants-browserify": { "version": "1.0.0", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/create-ecdh": { "version": "4.0.4", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3347,13 +3326,11 @@ }, "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/create-hash": { "version": "1.2.0", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3366,7 +3343,6 @@ }, "node_modules/meteor-node-stubs/node_modules/create-hmac": { "version": "1.1.7", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3380,7 +3356,6 @@ }, "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { "version": "3.12.0", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3402,7 +3377,6 @@ }, "node_modules/meteor-node-stubs/node_modules/define-properties": { "version": "1.1.3", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3414,7 +3388,6 @@ }, "node_modules/meteor-node-stubs/node_modules/des.js": { "version": "1.0.1", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3424,7 +3397,6 @@ }, "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { "version": "5.0.3", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3435,13 +3407,11 @@ }, "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/domain-browser": { "version": "4.19.0", - "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==", "inBundle": true, "license": "MIT", "engines": { @@ -3453,7 +3423,6 @@ }, "node_modules/meteor-node-stubs/node_modules/elliptic": { "version": "6.5.4", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3468,13 +3437,11 @@ }, "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/es-abstract": { "version": "1.18.3", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3504,7 +3471,6 @@ }, "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { "version": "1.2.1", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3521,13 +3487,11 @@ }, "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { "version": "1.1.0", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/events": { "version": "3.3.0", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "inBundle": true, "license": "MIT", "engines": { @@ -3536,7 +3500,6 @@ }, "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { "version": "1.0.3", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3546,19 +3509,16 @@ }, "node_modules/meteor-node-stubs/node_modules/foreach": { "version": "2.0.5", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/function-bind": { "version": "1.1.1", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3572,7 +3532,6 @@ }, "node_modules/meteor-node-stubs/node_modules/has": { "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3584,7 +3543,6 @@ }, "node_modules/meteor-node-stubs/node_modules/has-bigints": { "version": "1.0.1", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "inBundle": true, "license": "MIT", "funding": { @@ -3593,7 +3551,6 @@ }, "node_modules/meteor-node-stubs/node_modules/has-symbols": { "version": "1.0.2", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "inBundle": true, "license": "MIT", "engines": { @@ -3605,7 +3562,6 @@ }, "node_modules/meteor-node-stubs/node_modules/hash-base": { "version": "3.1.0", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3619,7 +3575,6 @@ }, "node_modules/meteor-node-stubs/node_modules/hash.js": { "version": "1.1.7", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3629,7 +3584,6 @@ }, "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { "version": "1.0.1", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "inBundle": true, "license": "MIT", "dependencies": { @@ -3640,13 +3594,11 @@ }, "node_modules/meteor-node-stubs/node_modules/https-browserify": { "version": "1.0.0", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/ieee754": { "version": "1.2.1", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -3666,13 +3618,11 @@ }, "node_modules/meteor-node-stubs/node_modules/inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "inBundle": true, "license": "ISC" }, "node_modules/meteor-node-stubs/node_modules/is-arguments": { "version": "1.1.0", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3687,7 +3637,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-bigint": { "version": "1.0.2", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "inBundle": true, "license": "MIT", "funding": { @@ -3696,7 +3645,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { "version": "1.1.1", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3711,7 +3659,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-callable": { "version": "1.2.3", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "inBundle": true, "license": "MIT", "engines": { @@ -3723,7 +3670,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-date-object": { "version": "1.0.4", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "inBundle": true, "license": "MIT", "engines": { @@ -3735,7 +3681,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-generator-function": { "version": "1.0.9", - "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", "inBundle": true, "license": "MIT", "engines": { @@ -3747,7 +3692,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-nan": { "version": "1.3.2", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3763,7 +3707,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { "version": "2.0.1", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "inBundle": true, "license": "MIT", "engines": { @@ -3775,7 +3718,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-number-object": { "version": "1.0.5", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "inBundle": true, "license": "MIT", "engines": { @@ -3787,7 +3729,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-regex": { "version": "1.1.3", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3803,7 +3744,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-string": { "version": "1.0.6", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "inBundle": true, "license": "MIT", "engines": { @@ -3815,7 +3755,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-symbol": { "version": "1.0.4", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3830,7 +3769,6 @@ }, "node_modules/meteor-node-stubs/node_modules/is-typed-array": { "version": "1.1.5", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3849,7 +3787,6 @@ }, "node_modules/meteor-node-stubs/node_modules/md5.js": { "version": "1.3.5", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3860,7 +3797,6 @@ }, "node_modules/meteor-node-stubs/node_modules/miller-rabin": { "version": "4.0.1", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3873,25 +3809,21 @@ }, "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { "version": "1.0.1", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "inBundle": true, "license": "ISC" }, "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/object-inspect": { "version": "1.10.3", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "inBundle": true, "license": "MIT", "funding": { @@ -3900,7 +3832,6 @@ }, "node_modules/meteor-node-stubs/node_modules/object-is": { "version": "1.1.5", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3916,7 +3847,6 @@ }, "node_modules/meteor-node-stubs/node_modules/object-keys": { "version": "1.1.1", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "inBundle": true, "license": "MIT", "engines": { @@ -3925,7 +3855,6 @@ }, "node_modules/meteor-node-stubs/node_modules/object.assign": { "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3943,19 +3872,16 @@ }, "node_modules/meteor-node-stubs/node_modules/os-browserify": { "version": "0.3.0", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/pako": { "version": "1.0.11", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "inBundle": true, "license": "(MIT AND Zlib)" }, "node_modules/meteor-node-stubs/node_modules/parse-asn1": { "version": "5.1.6", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "inBundle": true, "license": "ISC", "dependencies": { @@ -3968,13 +3894,11 @@ }, "node_modules/meteor-node-stubs/node_modules/path-browserify": { "version": "1.0.1", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/pbkdf2": { "version": "3.1.2", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -3990,7 +3914,6 @@ }, "node_modules/meteor-node-stubs/node_modules/process": { "version": "0.11.10", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "inBundle": true, "license": "MIT", "engines": { @@ -3999,7 +3922,6 @@ }, "node_modules/meteor-node-stubs/node_modules/public-encrypt": { "version": "4.0.3", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4013,13 +3935,11 @@ }, "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/punycode": { "version": "2.1.1", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "inBundle": true, "license": "MIT", "engines": { @@ -4028,7 +3948,6 @@ }, "node_modules/meteor-node-stubs/node_modules/querystring": { "version": "0.2.0", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "inBundle": true, "engines": { "node": ">=0.4.x" @@ -4036,7 +3955,6 @@ }, "node_modules/meteor-node-stubs/node_modules/querystring-es3": { "version": "0.2.1", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "inBundle": true, "engines": { "node": ">=0.4.x" @@ -4044,7 +3962,6 @@ }, "node_modules/meteor-node-stubs/node_modules/randombytes": { "version": "2.1.0", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4053,7 +3970,6 @@ }, "node_modules/meteor-node-stubs/node_modules/randomfill": { "version": "1.0.4", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4063,7 +3979,6 @@ }, "node_modules/meteor-node-stubs/node_modules/readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4077,7 +3992,6 @@ }, "node_modules/meteor-node-stubs/node_modules/ripemd160": { "version": "2.0.2", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4087,7 +4001,6 @@ }, "node_modules/meteor-node-stubs/node_modules/safe-buffer": { "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4107,19 +4020,16 @@ }, "node_modules/meteor-node-stubs/node_modules/safer-buffer": { "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/setimmediate": { "version": "1.0.5", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/sha.js": { "version": "2.4.11", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "inBundle": true, "license": "(MIT AND BSD-3-Clause)", "dependencies": { @@ -4132,7 +4042,6 @@ }, "node_modules/meteor-node-stubs/node_modules/stream-browserify": { "version": "3.0.0", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4142,7 +4051,6 @@ }, "node_modules/meteor-node-stubs/node_modules/stream-http": { "version": "3.2.0", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4154,7 +4062,6 @@ }, "node_modules/meteor-node-stubs/node_modules/string_decoder": { "version": "1.3.0", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4163,7 +4070,6 @@ }, "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { "version": "1.0.4", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4176,7 +4082,6 @@ }, "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { "version": "1.0.4", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4189,7 +4094,6 @@ }, "node_modules/meteor-node-stubs/node_modules/timers-browserify": { "version": "2.0.12", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4201,13 +4105,11 @@ }, "node_modules/meteor-node-stubs/node_modules/tty-browserify": { "version": "0.0.1", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { "version": "1.0.1", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4222,7 +4124,6 @@ }, "node_modules/meteor-node-stubs/node_modules/url": { "version": "0.11.0", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "inBundle": true, "license": "MIT", "dependencies": { @@ -4232,13 +4133,11 @@ }, "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { "version": "1.3.2", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/util": { "version": "0.12.4", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4252,19 +4151,16 @@ }, "node_modules/meteor-node-stubs/node_modules/util-deprecate": { "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/vm-browserify": { "version": "1.1.2", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "inBundle": true, "license": "MIT" }, "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { "version": "1.0.2", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4280,7 +4176,6 @@ }, "node_modules/meteor-node-stubs/node_modules/which-typed-array": { "version": "1.1.4", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -4301,7 +4196,6 @@ }, "node_modules/meteor-node-stubs/node_modules/xtend": { "version": "4.0.2", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "inBundle": true, "license": "MIT", "engines": { @@ -7912,7 +7806,6 @@ "dependencies": { "asn1.js": { "version": "5.4.1", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "bundled": true, "requires": { "bn.js": "^4.0.0", @@ -7923,14 +7816,12 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "assert": { "version": "2.0.0", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "bundled": true, "requires": { "es6-object-assign": "^1.1.0", @@ -7941,27 +7832,22 @@ }, "available-typed-arrays": { "version": "1.0.4", - "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", "bundled": true }, "base64-js": { "version": "1.5.1", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "bundled": true }, "bn.js": { "version": "5.2.0", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "bundled": true }, "brorand": { "version": "1.1.0", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "bundled": true }, "browserify-aes": { "version": "1.2.0", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "bundled": true, "requires": { "buffer-xor": "^1.0.3", @@ -7974,7 +7860,6 @@ }, "browserify-cipher": { "version": "1.0.1", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "bundled": true, "requires": { "browserify-aes": "^1.0.4", @@ -7984,7 +7869,6 @@ }, "browserify-des": { "version": "1.0.2", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "bundled": true, "requires": { "cipher-base": "^1.0.1", @@ -7995,7 +7879,6 @@ }, "browserify-rsa": { "version": "4.1.0", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "bundled": true, "requires": { "bn.js": "^5.0.0", @@ -8004,7 +7887,6 @@ }, "browserify-sign": { "version": "4.2.1", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "bundled": true, "requires": { "bn.js": "^5.1.1", @@ -8020,7 +7902,6 @@ }, "browserify-zlib": { "version": "0.2.0", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "bundled": true, "requires": { "pako": "~1.0.5" @@ -8028,7 +7909,6 @@ }, "buffer": { "version": "6.0.3", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "bundled": true, "requires": { "base64-js": "^1.3.1", @@ -8037,17 +7917,14 @@ }, "buffer-xor": { "version": "1.0.3", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "bundled": true }, "builtin-status-codes": { "version": "3.0.0", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "bundled": true }, "call-bind": { "version": "1.0.2", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "bundled": true, "requires": { "function-bind": "^1.1.1", @@ -8056,7 +7933,6 @@ }, "cipher-base": { "version": "1.0.4", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "bundled": true, "requires": { "inherits": "^2.0.1", @@ -8065,17 +7941,14 @@ }, "console-browserify": { "version": "1.2.0", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "bundled": true }, "constants-browserify": { "version": "1.0.0", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "bundled": true }, "create-ecdh": { "version": "4.0.4", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "bundled": true, "requires": { "bn.js": "^4.1.0", @@ -8084,14 +7957,12 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "create-hash": { "version": "1.2.0", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "bundled": true, "requires": { "cipher-base": "^1.0.1", @@ -8103,7 +7974,6 @@ }, "create-hmac": { "version": "1.1.7", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "bundled": true, "requires": { "cipher-base": "^1.0.3", @@ -8116,7 +7986,6 @@ }, "crypto-browserify": { "version": "3.12.0", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "bundled": true, "requires": { "browserify-cipher": "^1.0.0", @@ -8134,7 +8003,6 @@ }, "define-properties": { "version": "1.1.3", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "bundled": true, "requires": { "object-keys": "^1.0.12" @@ -8142,7 +8010,6 @@ }, "des.js": { "version": "1.0.1", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "bundled": true, "requires": { "inherits": "^2.0.1", @@ -8151,7 +8018,6 @@ }, "diffie-hellman": { "version": "5.0.3", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "bundled": true, "requires": { "bn.js": "^4.1.0", @@ -8161,19 +8027,16 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "domain-browser": { "version": "4.19.0", - "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==", "bundled": true }, "elliptic": { "version": "6.5.4", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "bundled": true, "requires": { "bn.js": "^4.11.9", @@ -8187,14 +8050,12 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "es-abstract": { "version": "1.18.3", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "bundled": true, "requires": { "call-bind": "^1.0.2", @@ -8217,7 +8078,6 @@ }, "es-to-primitive": { "version": "1.2.1", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "bundled": true, "requires": { "is-callable": "^1.1.4", @@ -8227,17 +8087,14 @@ }, "es6-object-assign": { "version": "1.1.0", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "bundled": true }, "events": { "version": "3.3.0", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "bundled": true }, "evp_bytestokey": { "version": "1.0.3", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "bundled": true, "requires": { "md5.js": "^1.3.4", @@ -8246,17 +8103,14 @@ }, "foreach": { "version": "2.0.5", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "bundled": true }, "function-bind": { "version": "1.1.1", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "bundled": true }, "get-intrinsic": { "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "bundled": true, "requires": { "function-bind": "^1.1.1", @@ -8266,7 +8120,6 @@ }, "has": { "version": "1.0.3", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "bundled": true, "requires": { "function-bind": "^1.1.1" @@ -8274,17 +8127,14 @@ }, "has-bigints": { "version": "1.0.1", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "bundled": true }, "has-symbols": { "version": "1.0.2", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "bundled": true }, "hash-base": { "version": "3.1.0", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "bundled": true, "requires": { "inherits": "^2.0.4", @@ -8294,7 +8144,6 @@ }, "hash.js": { "version": "1.1.7", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "bundled": true, "requires": { "inherits": "^2.0.3", @@ -8303,7 +8152,6 @@ }, "hmac-drbg": { "version": "1.0.1", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "bundled": true, "requires": { "hash.js": "^1.0.3", @@ -8313,22 +8161,18 @@ }, "https-browserify": { "version": "1.0.0", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "bundled": true }, "ieee754": { "version": "1.2.1", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "bundled": true }, "inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "bundled": true }, "is-arguments": { "version": "1.1.0", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", "bundled": true, "requires": { "call-bind": "^1.0.0" @@ -8336,12 +8180,10 @@ }, "is-bigint": { "version": "1.0.2", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "bundled": true }, "is-boolean-object": { "version": "1.1.1", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "bundled": true, "requires": { "call-bind": "^1.0.2" @@ -8349,22 +8191,18 @@ }, "is-callable": { "version": "1.2.3", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "bundled": true }, "is-date-object": { "version": "1.0.4", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "bundled": true }, "is-generator-function": { "version": "1.0.9", - "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", "bundled": true }, "is-nan": { "version": "1.3.2", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "bundled": true, "requires": { "call-bind": "^1.0.0", @@ -8373,17 +8211,14 @@ }, "is-negative-zero": { "version": "2.0.1", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "bundled": true }, "is-number-object": { "version": "1.0.5", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "bundled": true }, "is-regex": { "version": "1.1.3", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "bundled": true, "requires": { "call-bind": "^1.0.2", @@ -8392,12 +8227,10 @@ }, "is-string": { "version": "1.0.6", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "bundled": true }, "is-symbol": { "version": "1.0.4", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "bundled": true, "requires": { "has-symbols": "^1.0.2" @@ -8405,7 +8238,6 @@ }, "is-typed-array": { "version": "1.1.5", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", "bundled": true, "requires": { "available-typed-arrays": "^1.0.2", @@ -8417,7 +8249,6 @@ }, "md5.js": { "version": "1.3.5", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "bundled": true, "requires": { "hash-base": "^3.0.0", @@ -8427,7 +8258,6 @@ }, "miller-rabin": { "version": "4.0.1", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "bundled": true, "requires": { "bn.js": "^4.0.0", @@ -8436,29 +8266,24 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "minimalistic-assert": { "version": "1.0.1", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "bundled": true }, "minimalistic-crypto-utils": { "version": "1.0.1", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "bundled": true }, "object-inspect": { "version": "1.10.3", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "bundled": true }, "object-is": { "version": "1.1.5", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "bundled": true, "requires": { "call-bind": "^1.0.2", @@ -8467,12 +8292,10 @@ }, "object-keys": { "version": "1.1.1", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "bundled": true }, "object.assign": { "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "bundled": true, "requires": { "call-bind": "^1.0.0", @@ -8483,17 +8306,14 @@ }, "os-browserify": { "version": "0.3.0", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "bundled": true }, "pako": { "version": "1.0.11", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "bundled": true }, "parse-asn1": { "version": "5.1.6", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "bundled": true, "requires": { "asn1.js": "^5.2.0", @@ -8505,12 +8325,10 @@ }, "path-browserify": { "version": "1.0.1", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "bundled": true }, "pbkdf2": { "version": "3.1.2", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "bundled": true, "requires": { "create-hash": "^1.1.2", @@ -8522,12 +8340,10 @@ }, "process": { "version": "0.11.10", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "bundled": true }, "public-encrypt": { "version": "4.0.3", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "bundled": true, "requires": { "bn.js": "^4.1.0", @@ -8540,29 +8356,24 @@ "dependencies": { "bn.js": { "version": "4.12.0", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "bundled": true } } }, "punycode": { "version": "2.1.1", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "bundled": true }, "querystring": { "version": "0.2.0", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "bundled": true }, "querystring-es3": { "version": "0.2.1", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "bundled": true }, "randombytes": { "version": "2.1.0", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "bundled": true, "requires": { "safe-buffer": "^5.1.0" @@ -8570,7 +8381,6 @@ }, "randomfill": { "version": "1.0.4", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "bundled": true, "requires": { "randombytes": "^2.0.5", @@ -8579,7 +8389,6 @@ }, "readable-stream": { "version": "3.6.0", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "bundled": true, "requires": { "inherits": "^2.0.3", @@ -8589,7 +8398,6 @@ }, "ripemd160": { "version": "2.0.2", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "bundled": true, "requires": { "hash-base": "^3.0.0", @@ -8598,22 +8406,18 @@ }, "safe-buffer": { "version": "5.2.1", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "bundled": true }, "safer-buffer": { "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "bundled": true }, "setimmediate": { "version": "1.0.5", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "bundled": true }, "sha.js": { "version": "2.4.11", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "bundled": true, "requires": { "inherits": "^2.0.1", @@ -8622,7 +8426,6 @@ }, "stream-browserify": { "version": "3.0.0", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "bundled": true, "requires": { "inherits": "~2.0.4", @@ -8631,7 +8434,6 @@ }, "stream-http": { "version": "3.2.0", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -8642,7 +8444,6 @@ }, "string_decoder": { "version": "1.3.0", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "bundled": true, "requires": { "safe-buffer": "~5.2.0" @@ -8650,7 +8451,6 @@ }, "string.prototype.trimend": { "version": "1.0.4", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "bundled": true, "requires": { "call-bind": "^1.0.2", @@ -8659,7 +8459,6 @@ }, "string.prototype.trimstart": { "version": "1.0.4", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "bundled": true, "requires": { "call-bind": "^1.0.2", @@ -8668,7 +8467,6 @@ }, "timers-browserify": { "version": "2.0.12", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "bundled": true, "requires": { "setimmediate": "^1.0.4" @@ -8676,12 +8474,10 @@ }, "tty-browserify": { "version": "0.0.1", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "bundled": true }, "unbox-primitive": { "version": "1.0.1", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "bundled": true, "requires": { "function-bind": "^1.1.1", @@ -8692,7 +8488,6 @@ }, "url": { "version": "0.11.0", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "bundled": true, "requires": { "punycode": "1.3.2", @@ -8701,14 +8496,12 @@ "dependencies": { "punycode": { "version": "1.3.2", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "bundled": true } } }, "util": { "version": "0.12.4", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "bundled": true, "requires": { "inherits": "^2.0.3", @@ -8721,17 +8514,14 @@ }, "util-deprecate": { "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "bundled": true }, "vm-browserify": { "version": "1.1.2", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "bundled": true }, "which-boxed-primitive": { "version": "1.0.2", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "bundled": true, "requires": { "is-bigint": "^1.0.1", @@ -8743,7 +8533,6 @@ }, "which-typed-array": { "version": "1.1.4", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", "bundled": true, "requires": { "available-typed-arrays": "^1.0.2", @@ -8757,7 +8546,6 @@ }, "xtend": { "version": "4.0.2", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "bundled": true } } From 41837aac747f1a79d5fb489af4236d607c1101e0 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Tue, 19 Apr 2022 15:17:50 +0300 Subject: [PATCH 081/246] Remove outdated moment Meteor dependencies --- .meteor/packages | 2 -- .meteor/versions | 2 -- 2 files changed, 4 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 974527a7e..bb1a39465 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -65,8 +65,6 @@ email@2.2.1 horka:swipebox dynamic-import@0.7.2 -momentjs:moment@2.22.2 -mquandalle:moment cfs:gridfs rzymek:fullcalendar msavin:usercache diff --git a/.meteor/versions b/.meteor/versions index 4e1be1297..afed8e1e5 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -117,7 +117,6 @@ mquandalle:collection-mutations@0.1.0 mquandalle:jade@0.4.9 mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 -mquandalle:moment@1.0.1 mquandalle:mousetrap-bindglobal@0.0.1 msavin:usercache@1.8.0 npm-mongo@4.3.1 @@ -211,7 +210,6 @@ spacebars@1.3.0 spacebars-compiler@1.3.1 standard-minifier-css@1.8.1 standard-minifier-js@2.8.0 -tap:i18n@1.3.2 templates:tabs@2.3.0 templating@1.4.1 templating-compiler@1.4.1 From 2a802ec986b0ac932683f4bf970eb60e175cbf6f Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Tue, 19 Apr 2022 15:26:59 +0300 Subject: [PATCH 082/246] Make testing NPM dependencies appear in development mode only --- package-lock.json | 5468 +-------------------------------------------- package.json | 8 +- 2 files changed, 83 insertions(+), 5393 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56995e8bb..92ccdc611 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5348 +1,8 @@ { "name": "wekan", "version": "v6.18.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "wekan", - "version": "v6.18.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.2", - "ajv": "^6.12.6", - "babel-runtime": "^6.26.0", - "bcryptjs": "^2.4.3", - "bson": "^4.5.2", - "bunyan": "^1.8.15", - "chai-as-promised": "^7.1.1", - "core-js": "^3.18.2", - "dompurify": "^2.3.2", - "es6-promise": "^4.2.4", - "escape-string-regexp": "^5.0.0", - "exceljs": "^4.2.1", - "fibers": "^5.0.0", - "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", - "i18next": "^21.6.16", - "i18next-sprintf-postprocessor": "^0.2.2", - "jquery": "^2.2.4", - "jquery-ui": "^1.13.0", - "jquery-ui-touch-punch": "^0.2.3", - "jszip": "^3.7.1", - "ldapjs": "^2.3.1", - "markdown-it": "^12.3.2", - "markdown-it-emoji": "^2.0.0", - "meteor-accounts-t9n": "^2.6.0", - "meteor-node-stubs": "^1.1.0", - "moment": "^2.29.3", - "mongodb": "^3.7.3", - "nodemailer": "^6.6.3", - "os": "^0.1.2", - "page": "^1.11.6", - "papaparse": "^5.3.1", - "qs": "^6.10.1", - "simpl-schema": "^1.12.0", - "sinon-chai": "^3.7.0", - "source-map-support": "^0.5.20", - "uuid": "^8.3.2" - }, - "devDependencies": { - "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.4", - "flatted": "^3.2.2", - "puppeteer": "^1.20.0", - "sinon": "^11.1.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", - "dependencies": { - "@babel/types": "^7.15.4", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", - "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "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" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/electron-to-chromium": { - "version": "1.4.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", - "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==" - }, - "node_modules/@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", - "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", - "dependencies": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", - "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", - "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", - "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==", - "deprecated": "Potential XSS vulnerability patched in v6.0.0." - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - }, - "node_modules/@types/node": { - "version": "14.17.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", - "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==" - }, - "node_modules/@wekanteam/cli-table3": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.3.tgz", - "integrity": "sha512-P8utbj+no50cRDlkq21dJC68kjVigl/dPStXJLRFxndgHELC1N0mYIdwQLDBi9DsouUBFcjSP3rtewu0/Z23Ug==", - "dependencies": { - "string-width": "^5.1.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@wekanteam/markdown-it-mermaid": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.3.tgz", - "integrity": "sha512-voYErAXo/pp8qXOO/lX6odNldonQ4mhvOR4JBwUkPzfg2QxKCp8qE4rRKXbNYrwCvEnsM4dhOEpqjFWnqLUK7w==", - "dependencies": { - "@wekanteam/cli-table3": "^0.7.3", - "mermaid": "^8.14.0" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/bson": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", - "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", - "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.3.0.tgz", - "integrity": "sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "3", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", - "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", - "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", - "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/dagre-d3/node_modules/d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/dagre-d3/node_modules/d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "node_modules/dagre-d3/node_modules/d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/dagre-d3/node_modules/d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/dagre-d3/node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/dagre-d3/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "node_modules/dagre-d3/node_modules/d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "dependencies": { - "d3-dsv": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/dagre-d3/node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/dagre-d3/node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/dagre-d3/node_modules/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "node_modules/dagre-d3/node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/dagre-d3/node_modules/d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "node_modules/dagre-d3/node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "node_modules/dagre-d3/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/dagre-d3/node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/dagre-d3/node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dayjs": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exceljs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", - "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", - "dependencies": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fibers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", - "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "node_modules/flushwritable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", - "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/gridfs-stream": { - "version": "1.1.1", - "resolved": "https://github.com/wekan/gridfs-stream/tarball/master", - "integrity": "sha1-LHDhvuPAD0qFNEiT8YnbeXCmV9s= sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", - "dependencies": { - "flushwritable": "^1.0.0" - }, - "engines": { - "node": ">= 0.4.2" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/i18next": { - "version": "21.6.16", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz", - "integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" - } - }, - "node_modules/i18next-sprintf-postprocessor": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", - "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" - }, - "node_modules/i18next/node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" - }, - "node_modules/jquery-ui": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.0.tgz", - "integrity": "sha512-Osf7ECXNTYHtKBkn9xzbIf9kifNrBhfywFEKxOeB/OVctVmLlouV9mfc2qXCp6uyO4Pn72PXKOnj09qXetopCw==", - "dependencies": { - "jquery": ">=1.8.0 <4.0.0" - } - }, - "node_modules/jquery-ui-touch-punch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", - "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" - }, - "node_modules/khroma": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.4.1.tgz", - "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.1.tgz", - "integrity": "sha512-kf0tHHLrpwKaBAQOhYHXgdeh2PkFuCCxWgLb1MRn67ZQVo787D2pij3mmHVZx193GIdM8xcfi8HF6AIYYnj0fQ==", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", - "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/mermaid": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.14.0.tgz", - "integrity": "sha512-ITSHjwVaby1Li738sxhF48sLTxcNyUAoWfoqyztL1f7J6JOLpHOuQPNLBb6lxGPUA0u7xP9IRULgvod0dKu35A==", - "dependencies": { - "@braintree/sanitize-url": "^3.1.0", - "d3": "^7.0.0", - "dagre": "^0.8.5", - "dagre-d3": "^0.6.4", - "dompurify": "2.3.5", - "graphlib": "^2.1.8", - "khroma": "^1.4.1", - "moment-mini": "^2.24.0", - "stylis": "^4.0.10" - } - }, - "node_modules/mermaid/node_modules/dompurify": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", - "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==" - }, - "node_modules/message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "dependencies": { - "lodash.template": "^4.5.0" - } - }, - "node_modules/meteor-accounts-t9n": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", - "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" - }, - "node_modules/meteor-node-stubs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", - "integrity": "sha512-YvMQb4zcfWA82wFdRVTyxq28GO+Us7GSdtP+bTtC/mV35yipKnWo4W4665O57AmLVFnz4zR+WIZW11b4sfCtJw==", - "bundleDependencies": [ - "assert", - "browserify-zlib", - "buffer", - "console-browserify", - "constants-browserify", - "crypto-browserify", - "domain-browser", - "events", - "https-browserify", - "os-browserify", - "path-browserify", - "process", - "punycode", - "querystring-es3", - "readable-stream", - "stream-browserify", - "stream-http", - "string_decoder", - "timers-browserify", - "tty-browserify", - "url", - "util", - "vm-browserify" - ], - "dependencies": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", - "elliptic": "^6.5.4", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/call-bind": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "4.19.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/es-abstract": { - "version": "1.18.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/foreach": { - "version": "2.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-bigints": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-symbols": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/is-arguments": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-bigint": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-callable": { - "version": "1.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-date-object": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-generator-function": { - "version": "1.0.9", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-nan": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-number-object": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-regex": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-string": { - "version": "1.0.6", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-symbol": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-typed-array": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-inspect": { - "version": "1.10.3", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-is": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-keys": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/object.assign": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.12.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/which-typed-array": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "node_modules/mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" - }, - "node_modules/nodemailer": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", - "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "dependencies": { - "path-to-regexp": "~1.2.1" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", - "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "deprecated": "Version no longer supported. Upgrade to @latest", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/puppeteer/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simpl-schema": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", - "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", - "dependencies": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "node_modules/sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "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" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "verror": "1.10.0" - } - }, - "node_modules/vasync/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@babel/code-frame": { "version": "7.16.0", @@ -5711,22 +371,25 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, "@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -5736,7 +399,8 @@ "@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true }, "@types/node": { "version": "14.17.33", @@ -5910,7 +574,8 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true }, "async": { "version": "3.2.2", @@ -6110,14 +775,16 @@ "dev": true }, "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } @@ -6126,6 +793,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, "requires": { "check-error": "^1.0.2" } @@ -6158,7 +826,8 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true }, "chownr": { "version": "2.0.0", @@ -6873,6 +1542,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, "requires": { "type-detect": "^4.0.0" } @@ -6903,7 +1573,8 @@ "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true }, "dompurify": { "version": "2.3.6", @@ -7209,7 +1880,8 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true }, "get-intrinsic": { "version": "1.1.1", @@ -7492,7 +2164,8 @@ "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, "khroma": { "version": "1.4.1", @@ -7622,7 +2295,8 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true }, "lodash.groupby": { "version": "4.6.0", @@ -7686,6 +2360,15 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -8442,13 +3125,6 @@ "xtend": "^4.0.2" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -8465,6 +3141,13 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -8658,12 +3341,13 @@ "optional": true }, "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -8673,6 +3357,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, "requires": { "isarray": "0.0.1" } @@ -8816,7 +3501,8 @@ "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true }, "pend": { "version": "1.2.0", @@ -9041,27 +3727,30 @@ } }, "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", + "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", "diff": "^5.0.0", - "nise": "^5.1.0", + "nise": "^5.1.1", "supports-color": "^7.2.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -9072,7 +3761,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "requires": {} + "dev": true }, "source-map": { "version": "0.5.7", @@ -9104,6 +3793,16 @@ "memory-pager": "^1.0.2" } }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9119,16 +3818,6 @@ } } }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -9241,7 +3930,8 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, "typedarray": { "version": "0.0.6", diff --git a/package.json b/package.json index 73df38ab8..d7916691f 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "homepage": "https://wekan.github.io", "devDependencies": { "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.4", + "chai": "^4.3.6", + "chai-as-promised": "^7.1.1", "flatted": "^3.2.2", "puppeteer": "^1.20.0", - "sinon": "^11.1.2" + "sinon": "^13.0.2", + "sinon-chai": "^3.7.0" }, "dependencies": { "@babel/core": "^7.15.5", @@ -29,7 +31,6 @@ "bcryptjs": "^2.4.3", "bson": "^4.5.2", "bunyan": "^1.8.15", - "chai-as-promised": "^7.1.1", "core-js": "^3.18.2", "dompurify": "^2.3.2", "es6-promise": "^4.2.4", @@ -56,7 +57,6 @@ "papaparse": "^5.3.1", "qs": "^6.10.1", "simpl-schema": "^1.12.0", - "sinon-chai": "^3.7.0", "source-map-support": "^0.5.20", "uuid": "^8.3.2" }, From 25f8dd5141fb659c0a0ead28502fad8cb7a57ae2 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Tue, 19 Apr 2022 15:28:15 +0300 Subject: [PATCH 083/246] Remove outdated gridfs-stream NPM dependency --- package-lock.json | 12 ------------ package.json | 1 - 2 files changed, 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92ccdc611..c9f88526b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1787,11 +1787,6 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "flushwritable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", - "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1930,13 +1925,6 @@ "lodash": "^4.17.15" } }, - "gridfs-stream": { - "version": "https://github.com/wekan/gridfs-stream/tarball/master", - "integrity": "sha1-LHDhvuPAD0qFNEiT8YnbeXCmV9s= sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", - "requires": { - "flushwritable": "^1.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", diff --git a/package.json b/package.json index d7916691f..d34478e04 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "escape-string-regexp": "^5.0.0", "exceljs": "^4.2.1", "fibers": "^5.0.0", - "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", "i18next": "^21.6.16", "i18next-sprintf-postprocessor": "^0.2.2", "jquery": "^2.2.4", From 42a8f040587ed74de1c41f0be78144ef051bc75b Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Tue, 19 Apr 2022 15:41:44 +0300 Subject: [PATCH 084/246] Revery migrations regression appeared after the merge --- server/migrations.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/migrations.js b/server/migrations.js index 9fce9864e..a00a6bd7a 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1216,6 +1216,7 @@ Migrations.add('migrate-attachments-collectionFS-to-ostrioFiles', () => { cardId: fileObj.cardId, listId: fileObj.listId, swimlaneId: fileObj.swimlaneId, + source: 'import,' }, userId, size: fileSize, @@ -1320,3 +1321,10 @@ Migrations.add('migrate-avatars-collectionFS-to-ostrioFiles', () => { readStream.pipe(writeStream); }); }); + +Migrations.add('migrate-attachment-drop-index-cardId', () => { + try { + Attachments.collection._dropIndex({'cardId': 1}); + } catch (error) { + } +}); From f40b0d495db12824e46a60d9676e94464cc9897a Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Thu, 21 Apr 2022 19:11:16 +0300 Subject: [PATCH 085/246] Add missing language names --- imports/i18n/languages.js | 90 +++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 48a421de6..44f8a6d91 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -8,13 +8,13 @@ export default { "ar": { code: "ar", isoCode: "ar", - name: "ar", + name: "العربية", load: () => import('./data/ar.i18n.json'), }, "bg": { code: "bg", isoCode: "bg", - name: "bg", + name: "Български", load: () => import('./data/bg.i18n.json'), }, "br": { @@ -26,19 +26,19 @@ export default { "ca": { code: "ca", isoCode: "ca", - name: "ca", + name: "Català", load: () => import('./data/ca.i18n.json'), }, "cs": { code: "cs", isoCode: "cs", - name: "cs", + name: "čeština", load: () => import('./data/cs.i18n.json'), }, "da": { code: "da", isoCode: "da", - name: "da", + name: "Dansk", load: () => import('./data/da.i18n.json'), }, "de-AT": { @@ -80,7 +80,7 @@ export default { "en-GB": { code: "en", isoCode: "en-GB", - name: "English (Great Britain)", + name: "English (UK)", load: () => import('./data/en-GB.i18n.json'), }, "en-IT": { @@ -98,7 +98,7 @@ export default { "eo": { code: "eo", isoCode: "eo", - name: "eo", + name: "Esperanto", load: () => import('./data/eo.i18n.json'), }, "es-AR": { @@ -152,7 +152,7 @@ export default { "eu": { code: "eu", isoCode: "eu", - name: "eu", + name: "Euskara", load: () => import('./data/eu.i18n.json'), }, "fa-IR": { @@ -164,12 +164,12 @@ export default { "fa": { code: "fa", isoCode: "fa", - name: "fa", + name: "فارسی", load: () => import('./data/fa.i18n.json'), }, - "fi-FI": { + "fi": { code: "fi", - isoCode: "fi-FI", + isoCode: "fi", name: "Suomi", load: () => import('./data/fi-FI.i18n.json'), }, @@ -218,7 +218,7 @@ export default { "he": { code: "he", isoCode: "he", - name: "he", + name: "עברית", load: () => import('./data/he.i18n.json'), }, "hi-IN": { @@ -230,31 +230,31 @@ export default { "hi": { code: "hi", isoCode: "hi", - name: "hi", + name: "हिन्दी", load: () => import('./data/hi.i18n.json'), }, "hr": { code: "hr", isoCode: "hr", - name: "hr", + name: "Hrvatski", load: () => import('./data/hr.i18n.json'), }, "hu": { code: "hu", isoCode: "hu", - name: "hu", + name: "Magyar", load: () => import('./data/hu.i18n.json'), }, "hy": { code: "hy", isoCode: "hy", - name: "hy", + name: "Հայերեն", load: () => import('./data/hy.i18n.json'), }, "id": { code: "id", isoCode: "id", - name: "id", + name: "Bahasa Indonesia", load: () => import('./data/id.i18n.json'), }, "ig": { @@ -266,55 +266,55 @@ export default { "it": { code: "it", isoCode: "it", - name: "it", + name: "Italiano", load: () => import('./data/it.i18n.json'), }, "ja": { code: "ja", isoCode: "ja", - name: "ja", + name: "日本語", load: () => import('./data/ja.i18n.json'), }, "ka": { code: "ka", isoCode: "ka", - name: "ka", + name: "ქართული", load: () => import('./data/ka.i18n.json'), }, "km": { code: "km", isoCode: "km", - name: "km", + name: "ភាសាខ្មែរ", load: () => import('./data/km.i18n.json'), }, "ko": { code: "ko", isoCode: "ko", - name: "ko", + name: "한국어", load: () => import('./data/ko.i18n.json'), }, "lt": { code: "lt", isoCode: "lt", - name: "lt", + name: "Lietuvių kalba", load: () => import('./data/lt.i18n.json'), }, "lv": { code: "lv", isoCode: "lv", - name: "Latviešu", + name: "latviešu valoda", load: () => import('./data/lv.i18n.json'), }, "mk": { code: "mk", isoCode: "mk", - name: "mk", + name: "македонски јазик", load: () => import('./data/mk.i18n.json'), }, "mn": { code: "mn", isoCode: "mn", - name: "mn", + name: "Монгол", load: () => import('./data/mn.i18n.json'), }, "ms-MY": { @@ -326,13 +326,13 @@ export default { "nb": { code: "nb", isoCode: "nb", - name: "nb", + name: "Norsk bokmål", load: () => import('./data/nb.i18n.json'), }, "nl": { code: "nl", isoCode: "nl", - name: "nl", + name: "Nederlands", load: () => import('./data/nl.i18n.json'), }, "oc": { @@ -344,31 +344,31 @@ export default { "pa": { code: "pa", isoCode: "pa", - name: "pa", + name: "ਪੰਜਾਬੀ", load: () => import('./data/pa.i18n.json'), }, "pl": { code: "pl", isoCode: "pl", - name: "pl", + name: "Polski", load: () => import('./data/pl.i18n.json'), }, "pt-BR": { code: "pt", isoCode: "pt-BR", - name: "pt-BR", + name: "Português do Brasil", load: () => import('./data/pt-BR.i18n.json'), }, "pt": { code: "pt", isoCode: "pt", - name: "pt", + name: "Português", load: () => import('./data/pt.i18n.json'), }, "ro": { code: "ro", isoCode: "ro", - name: "ro", + name: "Română", load: () => import('./data/ro.i18n.json'), }, "ru-UA": { @@ -386,49 +386,49 @@ export default { "sk": { code: "sk", isoCode: "sk", - name: "sk", + name: "Slovenčina", load: () => import('./data/sk.i18n.json'), }, "sl": { code: "sl", isoCode: "sl", - name: "sl", + name: "slovenščina", load: () => import('./data/sl.i18n.json'), }, "sr": { code: "sr", isoCode: "sr", - name: "sr", + name: "Српски језик", load: () => import('./data/sr.i18n.json'), }, "sv": { code: "sv", isoCode: "sv", - name: "sv", + name: "Svenska", load: () => import('./data/sv.i18n.json'), }, "sw": { code: "sw", isoCode: "sw", - name: "sw", + name: "Kiswahili", load: () => import('./data/sw.i18n.json'), }, "ta": { code: "ta", isoCode: "ta", - name: "ta", + name: "தமிழ்", load: () => import('./data/ta.i18n.json'), }, "th": { code: "th", isoCode: "th", - name: "th", + name: "ไทย", load: () => import('./data/th.i18n.json'), }, "tr": { code: "tr", isoCode: "tr", - name: "tr", + name: "Türkçe", load: () => import('./data/tr.i18n.json'), }, "ua-UA": { @@ -446,25 +446,25 @@ export default { "vi": { code: "vi", isoCode: "vi", - name: "vi", + name: "Tiếng Việt", load: () => import('./data/vi.i18n.json'), }, "zh-CN": { code: "zh", isoCode: "zh-CN", - name: "zh-CN", + name: "简体中文", load: () => import('./data/zh-CN.i18n.json'), }, "zh-HK": { code: "zh", isoCode: "zh-HK", - name: "zh-HK", + name: "繁体中文(香港)", load: () => import('./data/zh-HK.i18n.json'), }, "zh-TW": { code: "zh", isoCode: "zh-TW", - name: "繁體中文(台灣)", + name: "繁体中文(台湾)", load: () => import('./data/zh-TW.i18n.json'), } }; From c858e0b7965847587c5e16b775c4cd44cbefbee0 Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Thu, 21 Apr 2022 19:14:30 +0300 Subject: [PATCH 086/246] Rename isoCode to tag (cause they are IETF tags actually) --- client/components/main/layouts.js | 2 +- client/components/users/userHeader.js | 2 +- imports/i18n/i18n.test.js | 2 +- imports/i18n/languages.js | 156 +++++++++++++------------- imports/i18n/tap.js | 4 +- 5 files changed, 83 insertions(+), 83 deletions(-) diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index 49721466a..8e0ca4217 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -116,7 +116,7 @@ Template.userFormsLayout.helpers({ languages() { return TAPi18n.getSupportedLanguages() - .map(({ isoCode, name }) => ({ tag: isoCode, name })) + .map(({ tag, name }) => ({ tag: tag, name })) .sort((a, b) => { if (a.name === b.name) { return 0; diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 92f6f37eb..b3745ac61 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -259,7 +259,7 @@ Template.changePasswordPopup.onRendered(function() { Template.changeLanguagePopup.helpers({ languages() { return TAPi18n.getSupportedLanguages() - .map(({ isoCode, name }) => ({ tag: isoCode, name })) + .map(({ tag, name }) => ({ tag: tag, name })) .sort((a, b) => { if (a.name === b.name) { return 0; diff --git a/imports/i18n/i18n.test.js b/imports/i18n/i18n.test.js index c51d4a525..7805dbdc8 100644 --- a/imports/i18n/i18n.test.js +++ b/imports/i18n/i18n.test.js @@ -45,7 +45,7 @@ describe('TAPi18n', () => { const languages = TAPi18n.getSupportedLanguages(); expect(languages).to.be.an('array'); for (const language of languages) { - expect(language).to.have.keys('name', 'code', 'isoCode'); + expect(language).to.have.keys('name', 'code', 'tag'); } }); diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 44f8a6d91..195a6ec14 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -1,469 +1,469 @@ export default { "ar-EG": { code: "ar", - isoCode: "ar-EG", + tag: "ar-EG", name: "مَصرى", load: () => import('./data/ar-EG.i18n.json'), }, "ar": { code: "ar", - isoCode: "ar", + tag: "ar", name: "العربية", load: () => import('./data/ar.i18n.json'), }, "bg": { code: "bg", - isoCode: "bg", + tag: "bg", name: "Български", load: () => import('./data/bg.i18n.json'), }, "br": { code: "br", - isoCode: "br", + tag: "br", name: "Brezhoneg", load: () => import('./data/xxx.i18n.json'), }, "ca": { code: "ca", - isoCode: "ca", + tag: "ca", name: "Català", load: () => import('./data/ca.i18n.json'), }, "cs": { code: "cs", - isoCode: "cs", + tag: "cs", name: "čeština", load: () => import('./data/cs.i18n.json'), }, "da": { code: "da", - isoCode: "da", + tag: "da", name: "Dansk", load: () => import('./data/da.i18n.json'), }, "de-AT": { code: "de", - isoCode: "de-AT", + tag: "de-AT", name: "Deutsch (Österreich)", load: () => import('./data/de-AT.i18n.json'), }, "de-CH": { code: "de", - isoCode: "de-CH", + tag: "de-CH", name: "Deutsch (Schweiz)", load: () => import('./data/de-CH.i18n.json'), }, "de": { code: "de", - isoCode: "de", + tag: "de", name: "Deutsch", load: () => import('./data/de.i18n.json'), }, "el-GR": { code: "el", - isoCode: "el-GR", + tag: "el-GR", name: "Ελληνικά (Ελλάδα)", load: () => import('./data/el-GR.i18n.json'), }, "el": { code: "el", - isoCode: "el", + tag: "el", name: "el", load: () => import('./data/el.i18n.json'), }, "en-DE": { code: "en", - isoCode: "en-DE", + tag: "en-DE", name: "English (Germany)", load: () => import('./data/en-DE.i18n.json'), }, "en-GB": { code: "en", - isoCode: "en-GB", + tag: "en-GB", name: "English (UK)", load: () => import('./data/en-GB.i18n.json'), }, "en-IT": { code: "en", - isoCode: "en-IT", + tag: "en-IT", name: "English (Italy)", load: () => import('./data/en-IT.i18n.json'), }, "en": { code: "en", - isoCode: "en", + tag: "en", name: "English", load: () => import('./data/en.i18n.json'), }, "eo": { code: "eo", - isoCode: "eo", + tag: "eo", name: "Esperanto", load: () => import('./data/eo.i18n.json'), }, "es-AR": { code: "es", - isoCode: "es-AR", + tag: "es-AR", name: "español de Argentina", load: () => import('./data/es-AR.i18n.json'), }, "es-CL": { code: "es", - isoCode: "es-CL", + tag: "es-CL", name: "español de Chile", load: () => import('./data/es-CL.i18n.json'), }, "es-LA": { code: "es", - isoCode: "es-LA", + tag: "es-LA", name: "español de América Latina", load: () => import('./data/es-LA.i18n.json'), }, "es-MX": { code: "es", - isoCode: "es-MX", + tag: "es-MX", name: "español de México", load: () => import('./data/es-MX.i18n.json'), }, "es-PE": { code: "es", - isoCode: "es-PE", + tag: "es-PE", name: "español de Perú", load: () => import('./data/es-PE.i18n.json'), }, "es-PY": { code: "es", - isoCode: "es-PY", + tag: "es-PY", name: "español de Paraguayo", load: () => import('./data/es-PY.i18n.json'), }, "es": { code: "es", - isoCode: "es", + tag: "es", name: "español", load: () => import('./data/es.i18n.json'), }, "et-EE": { code: "et", - isoCode: "et-EE", + tag: "et-EE", name: "eesti keel (Eesti)", load: () => import('./data/et-EE.i18n.json'), }, "eu": { code: "eu", - isoCode: "eu", + tag: "eu", name: "Euskara", load: () => import('./data/eu.i18n.json'), }, "fa-IR": { code: "fa", - isoCode: "fa-IR", + tag: "fa-IR", name: "فارسی/پارسی (ایران\u200e)", load: () => import('./data/fa-IR.i18n.json'), }, "fa": { code: "fa", - isoCode: "fa", + tag: "fa", name: "فارسی", load: () => import('./data/fa.i18n.json'), }, "fi": { code: "fi", - isoCode: "fi", + tag: "fi", name: "Suomi", load: () => import('./data/fi-FI.i18n.json'), }, "fr-BE": { code: "fr", - isoCode: "fr-BE", + tag: "fr-BE", name: "Français (Belgique)", load: () => import('./data/fr-BE.i18n.json'), }, "fr-CA": { code: "fr", - isoCode: "fr-CA", + tag: "fr-CA", name: "Français (Canada)", load: () => import('./data/fr-CA.i18n.json'), }, "fr-CH": { code: "fr", - isoCode: "fr-CH", + tag: "fr-CH", name: "Français (Schweiz)", load: () => import('./data/fr-CH.i18n.json'), }, "fr": { code: "fr", - isoCode: "fr", + tag: "fr", name: "Français", load: () => import('./data/fr.i18n.json'), }, "gl-ES": { code: "gl", - isoCode: "gl-ES", + tag: "gl-ES", name: "Galego (España)", load: () => import('./data/gl-ES.i18n.json'), }, "gl": { code: "gl", - isoCode: "gl", + tag: "gl", name: "Galego", load: () => import('./data/gl.i18n.json'), }, "gu-IN": { code: "gu", - isoCode: "gu-IN", + tag: "gu-IN", name: "ગુજરાતી", load: () => import('./data/gu-IN.i18n.json'), }, "he": { code: "he", - isoCode: "he", + tag: "he", name: "עברית", load: () => import('./data/he.i18n.json'), }, "hi-IN": { code: "hi", - isoCode: "hi-IN", + tag: "hi-IN", name: "हिंदी (भारत)", load: () => import('./data/hi-IN.i18n.json'), }, "hi": { code: "hi", - isoCode: "hi", + tag: "hi", name: "हिन्दी", load: () => import('./data/hi.i18n.json'), }, "hr": { code: "hr", - isoCode: "hr", + tag: "hr", name: "Hrvatski", load: () => import('./data/hr.i18n.json'), }, "hu": { code: "hu", - isoCode: "hu", + tag: "hu", name: "Magyar", load: () => import('./data/hu.i18n.json'), }, "hy": { code: "hy", - isoCode: "hy", + tag: "hy", name: "Հայերեն", load: () => import('./data/hy.i18n.json'), }, "id": { code: "id", - isoCode: "id", + tag: "id", name: "Bahasa Indonesia", load: () => import('./data/id.i18n.json'), }, "ig": { code: "ig", - isoCode: "ig", + tag: "ig", name: "Igbo", load: () => import('./data/ig.i18n.json'), }, "it": { code: "it", - isoCode: "it", + tag: "it", name: "Italiano", load: () => import('./data/it.i18n.json'), }, "ja": { code: "ja", - isoCode: "ja", + tag: "ja", name: "日本語", load: () => import('./data/ja.i18n.json'), }, "ka": { code: "ka", - isoCode: "ka", + tag: "ka", name: "ქართული", load: () => import('./data/ka.i18n.json'), }, "km": { code: "km", - isoCode: "km", + tag: "km", name: "ភាសាខ្មែរ", load: () => import('./data/km.i18n.json'), }, "ko": { code: "ko", - isoCode: "ko", + tag: "ko", name: "한국어", load: () => import('./data/ko.i18n.json'), }, "lt": { code: "lt", - isoCode: "lt", + tag: "lt", name: "Lietuvių kalba", load: () => import('./data/lt.i18n.json'), }, "lv": { code: "lv", - isoCode: "lv", + tag: "lv", name: "latviešu valoda", load: () => import('./data/lv.i18n.json'), }, "mk": { code: "mk", - isoCode: "mk", + tag: "mk", name: "македонски јазик", load: () => import('./data/mk.i18n.json'), }, "mn": { code: "mn", - isoCode: "mn", + tag: "mn", name: "Монгол", load: () => import('./data/mn.i18n.json'), }, "ms-MY": { code: "ms", - isoCode: "ms-MY", + tag: "ms-MY", name: "بهاس ملايو", load: () => import('./data/ms-MY.i18n.json'), }, "nb": { code: "nb", - isoCode: "nb", + tag: "nb", name: "Norsk bokmål", load: () => import('./data/nb.i18n.json'), }, "nl": { code: "nl", - isoCode: "nl", + tag: "nl", name: "Nederlands", load: () => import('./data/nl.i18n.json'), }, "oc": { code: "oc", - isoCode: "oc", + tag: "oc", name: "Occitan", load: () => import('./data/oc.i18n.json'), }, "pa": { code: "pa", - isoCode: "pa", + tag: "pa", name: "ਪੰਜਾਬੀ", load: () => import('./data/pa.i18n.json'), }, "pl": { code: "pl", - isoCode: "pl", + tag: "pl", name: "Polski", load: () => import('./data/pl.i18n.json'), }, "pt-BR": { code: "pt", - isoCode: "pt-BR", + tag: "pt-BR", name: "Português do Brasil", load: () => import('./data/pt-BR.i18n.json'), }, "pt": { code: "pt", - isoCode: "pt", + tag: "pt", name: "Português", load: () => import('./data/pt.i18n.json'), }, "ro": { code: "ro", - isoCode: "ro", + tag: "ro", name: "Română", load: () => import('./data/ro.i18n.json'), }, "ru-UA": { code: "ru", - isoCode: "ru-UA", + tag: "ru-UA", name: "Русский (Украина)", load: () => import('./data/ru-UA.i18n.json'), }, "ru": { code: "ru", - isoCode: "ru", + tag: "ru", name: "Русский", load: () => import('./data/ru.i18n.json'), }, "sk": { code: "sk", - isoCode: "sk", + tag: "sk", name: "Slovenčina", load: () => import('./data/sk.i18n.json'), }, "sl": { code: "sl", - isoCode: "sl", + tag: "sl", name: "slovenščina", load: () => import('./data/sl.i18n.json'), }, "sr": { code: "sr", - isoCode: "sr", + tag: "sr", name: "Српски језик", load: () => import('./data/sr.i18n.json'), }, "sv": { code: "sv", - isoCode: "sv", + tag: "sv", name: "Svenska", load: () => import('./data/sv.i18n.json'), }, "sw": { code: "sw", - isoCode: "sw", + tag: "sw", name: "Kiswahili", load: () => import('./data/sw.i18n.json'), }, "ta": { code: "ta", - isoCode: "ta", + tag: "ta", name: "தமிழ்", load: () => import('./data/ta.i18n.json'), }, "th": { code: "th", - isoCode: "th", + tag: "th", name: "ไทย", load: () => import('./data/th.i18n.json'), }, "tr": { code: "tr", - isoCode: "tr", + tag: "tr", name: "Türkçe", load: () => import('./data/tr.i18n.json'), }, "ua-UA": { code: "ua", - isoCode: "ua-UA", + tag: "ua-UA", name: "українська (Україна)", load: () => import('./data/ua-UA.i18n.json'), }, "ua": { code: "ua", - isoCode: "ua", + tag: "ua", name: "українська (Україна)", load: () => import('./data/ua.i18n.json'), }, "vi": { code: "vi", - isoCode: "vi", + tag: "vi", name: "Tiếng Việt", load: () => import('./data/vi.i18n.json'), }, "zh-CN": { code: "zh", - isoCode: "zh-CN", + tag: "zh-CN", name: "简体中文", load: () => import('./data/zh-CN.i18n.json'), }, "zh-HK": { code: "zh", - isoCode: "zh-HK", + tag: "zh-HK", name: "繁体中文(香港)", load: () => import('./data/zh-HK.i18n.json'), }, "zh-TW": { code: "zh", - isoCode: "zh-TW", + tag: "zh-TW", name: "繁体中文(台湾)", load: () => import('./data/zh-TW.i18n.json'), } diff --git a/imports/i18n/tap.js b/imports/i18n/tap.js index 4fa632a84..2916278de 100644 --- a/imports/i18n/tap.js +++ b/imports/i18n/tap.js @@ -17,7 +17,7 @@ export const TAPi18n = { fallbackLng: DEFAULT_LANGUAGE, cleanCode: true, debug: Meteor.isDevelopment, - supportedLngs: Object.values(languages).map(({ isoCode }) => isoCode), + supportedLngs: Object.values(languages).map(({ tag }) => tag), ns: DEFAULT_NAMESPACE, defaultNs: DEFAULT_NAMESPACE, postProcess: ["sprintf"], @@ -33,7 +33,7 @@ export const TAPi18n = { await TAPi18n.loadLanguage(DEFAULT_LANGUAGE); }, getSupportedLanguages() { - return Object.values(languages).map(({ name, code, isoCode }) => ({ name, code, isoCode })); + return Object.values(languages).map(({ name, code, tag }) => ({ name, code, tag })); }, getLanguage() { return this.current.get(); From 566527dfad9b11d730c84f7b62bac9c4d60518bd Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Thu, 21 Apr 2022 19:27:59 +0300 Subject: [PATCH 087/246] Fix broken useraccounts UI i18n --- imports/i18n/accounts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/i18n/accounts.js b/imports/i18n/accounts.js index 124331dd6..e17540f15 100644 --- a/imports/i18n/accounts.js +++ b/imports/i18n/accounts.js @@ -1,6 +1,6 @@ // Load all useraccounts translations at once import { Tracker } from 'meteor/tracker'; -import { T9n } from 'meteor-accounts-t9n'; +import { T9n } from 'meteor/useraccounts:core'; import { TAPi18n } from './tap'; T9n.setTracker({ Tracker }); From 8f43b74bbca78fa03162985fc7b2192782549c1f Mon Sep 17 00:00:00 2001 From: Denis Perov <denis.perov@gmail.com> Date: Thu, 21 Apr 2022 19:41:56 +0300 Subject: [PATCH 088/246] Fix language auto-detection --- client/lib/i18n.js | 11 ++++++++++- imports/i18n/i18n.test.js | 4 ++-- imports/i18n/tap.js | 5 +++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/client/lib/i18n.js b/client/lib/i18n.js index 5d809c17b..2e3dd10a4 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -16,6 +16,15 @@ Meteor.startup(() => { navigator.userLanguage, ].filter(Boolean); if (language) { - TAPi18n.setLanguage(language); + // Try with potentially complex language tag + if (TAPi18n.isLanguageSupported(language)) { + TAPi18n.setLanguage(language); + } else if (language.includes('-')) { + // Fallback to a general language + const [general] = language.split('-'); + if (TAPi18n.isLanguageSupported(general)) { + TAPi18n.setLanguage(general); + } + } } }); diff --git a/imports/i18n/i18n.test.js b/imports/i18n/i18n.test.js index 7805dbdc8..197a1ac19 100644 --- a/imports/i18n/i18n.test.js +++ b/imports/i18n/i18n.test.js @@ -78,8 +78,8 @@ describe('TAPi18n', () => { expect(TAPi18n.i18n.addResourceBundle.firstCall.args[2]).to.have.property('accept'); }); - it('does nothing if language is missing', async () => { - await expect(TAPi18n.loadLanguage('miss')).to.be.fulfilled; + it('throws error if language is missing', async () => { + await expect(TAPi18n.loadLanguage('miss')).to.be.rejectedWith('not supported'); expect(TAPi18n.i18n.addResourceBundle).to.not.be.called; }); diff --git a/imports/i18n/tap.js b/imports/i18n/tap.js index 2916278de..f531a23ae 100644 --- a/imports/i18n/tap.js +++ b/imports/i18n/tap.js @@ -32,6 +32,9 @@ export const TAPi18n = { // Load the current language data await TAPi18n.loadLanguage(DEFAULT_LANGUAGE); }, + isLanguageSupported(language) { + return Object.values(languages).some(({ tag }) => tag === language); + }, getSupportedLanguages() { return Object.values(languages).map(({ name, code, tag }) => ({ name, code, tag })); }, @@ -42,6 +45,8 @@ export const TAPi18n = { if (language in languages && 'load' in languages[language]) { const data = await languages[language].load(); this.i18n.addResourceBundle(language, DEFAULT_NAMESPACE, data); + } else { + throw new Error(`Language ${language} is not supported`); } }, async setLanguage(language) { From 8d395e6cb105a32875bb505867bb66233da22513 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 20:50:18 +0300 Subject: [PATCH 089/246] Updated translations. --- .tx/config | 2 +- imports/i18n/data/ar-EG.i18n.json | 17 +++++++++++-- imports/i18n/data/ar.i18n.json | 17 +++++++++++-- imports/i18n/data/bg.i18n.json | 17 +++++++++++-- imports/i18n/data/br.i18n.json | 17 +++++++++++-- imports/i18n/data/ca.i18n.json | 17 +++++++++++-- imports/i18n/data/cs-CZ.i18n.json | 17 +++++++++++-- imports/i18n/data/cs.i18n.json | 17 +++++++++++-- imports/i18n/data/da.i18n.json | 17 +++++++++++-- imports/i18n/data/de-AT.i18n.json | 17 +++++++++++-- imports/i18n/data/de-CH.i18n.json | 17 +++++++++++-- imports/i18n/data/de.i18n.json | 41 ++++++++++++++++++++----------- imports/i18n/data/el-GR.i18n.json | 17 +++++++++++-- imports/i18n/data/en-BR.i18n.json | 17 +++++++++++-- imports/i18n/data/en-DE.i18n.json | 17 +++++++++++-- imports/i18n/data/en-GB.i18n.json | 17 +++++++++++-- imports/i18n/data/en-IT.i18n.json | 17 +++++++++++-- imports/i18n/data/eo.i18n.json | 17 +++++++++++-- imports/i18n/data/es-AR.i18n.json | 17 +++++++++++-- imports/i18n/data/es-CL.i18n.json | 17 +++++++++++-- imports/i18n/data/es-LA.i18n.json | 17 +++++++++++-- imports/i18n/data/es-MX.i18n.json | 17 +++++++++++-- imports/i18n/data/es-PE.i18n.json | 17 +++++++++++-- imports/i18n/data/es-PY.i18n.json | 17 +++++++++++-- imports/i18n/data/es.i18n.json | 17 +++++++++++-- imports/i18n/data/et-EE.i18n.json | 17 +++++++++++-- imports/i18n/data/eu.i18n.json | 17 +++++++++++-- imports/i18n/data/fa-IR.i18n.json | 17 +++++++++++-- imports/i18n/data/fa.i18n.json | 17 +++++++++++-- imports/i18n/data/fi.i18n.json | 17 +++++++++++-- imports/i18n/data/fr-CH.i18n.json | 17 +++++++++++-- imports/i18n/data/fr.i18n.json | 17 +++++++++++-- imports/i18n/data/gl-ES.i18n.json | 17 +++++++++++-- imports/i18n/data/gl.i18n.json | 17 +++++++++++-- imports/i18n/data/gu-IN.i18n.json | 17 +++++++++++-- imports/i18n/data/he.i18n.json | 17 +++++++++++-- imports/i18n/data/hi-IN.i18n.json | 17 +++++++++++-- imports/i18n/data/hi.i18n.json | 17 +++++++++++-- imports/i18n/data/hr.i18n.json | 17 +++++++++++-- imports/i18n/data/hu.i18n.json | 17 +++++++++++-- imports/i18n/data/hy.i18n.json | 17 +++++++++++-- imports/i18n/data/id.i18n.json | 23 +++++++++++++---- imports/i18n/data/ig.i18n.json | 17 +++++++++++-- imports/i18n/data/it.i18n.json | 17 +++++++++++-- imports/i18n/data/ja.i18n.json | 17 +++++++++++-- imports/i18n/data/ka.i18n.json | 17 +++++++++++-- imports/i18n/data/km.i18n.json | 17 +++++++++++-- imports/i18n/data/ko.i18n.json | 39 +++++++++++++++++++---------- imports/i18n/data/lt.i18n.json | 17 +++++++++++-- imports/i18n/data/lv.i18n.json | 17 +++++++++++-- imports/i18n/data/mk.i18n.json | 17 +++++++++++-- imports/i18n/data/mn.i18n.json | 17 +++++++++++-- imports/i18n/data/ms-MY.i18n.json | 17 +++++++++++-- imports/i18n/data/nb.i18n.json | 17 +++++++++++-- imports/i18n/data/nl.i18n.json | 41 ++++++++++++++++++++----------- imports/i18n/data/oc.i18n.json | 17 +++++++++++-- imports/i18n/data/pa.i18n.json | 17 +++++++++++-- imports/i18n/data/pl.i18n.json | 17 +++++++++++-- imports/i18n/data/pt-BR.i18n.json | 17 +++++++++++-- imports/i18n/data/pt.i18n.json | 17 +++++++++++-- imports/i18n/data/ro.i18n.json | 17 +++++++++++-- imports/i18n/data/ru-UA.i18n.json | 17 +++++++++++-- imports/i18n/data/ru.i18n.json | 17 +++++++++++-- imports/i18n/data/sk.i18n.json | 17 +++++++++++-- imports/i18n/data/sl.i18n.json | 17 +++++++++++-- imports/i18n/data/sr.i18n.json | 17 +++++++++++-- imports/i18n/data/sv.i18n.json | 17 +++++++++++-- imports/i18n/data/sw.i18n.json | 17 +++++++++++-- imports/i18n/data/ta.i18n.json | 17 +++++++++++-- imports/i18n/data/th.i18n.json | 17 +++++++++++-- imports/i18n/data/tr.i18n.json | 17 +++++++++++-- imports/i18n/data/uk-UA.i18n.json | 17 +++++++++++-- imports/i18n/data/uk.i18n.json | 17 +++++++++++-- imports/i18n/data/vi.i18n.json | 17 +++++++++++-- imports/i18n/data/zh-CN.i18n.json | 41 ++++++++++++++++++++----------- imports/i18n/data/zh-HK.i18n.json | 17 +++++++++++-- imports/i18n/data/zh-TW.i18n.json | 17 +++++++++++-- imports/i18n/languages.js | 2 +- 78 files changed, 1192 insertions(+), 204 deletions(-) diff --git a/.tx/config b/.tx/config index 9e7208d0b..202a82f3a 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, gl_ES:gl-ES, gu_IN:gu-IN, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK +lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA [wekan.application] file_filter = imports/i18n/data/<lang>.i18n.json diff --git a/imports/i18n/data/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/ar-EG.i18n.json +++ b/imports/i18n/data/ar-EG.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index 3b2086b07..fd9844f7b 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "المنشئ", "filesReportTitle": "تقارير الملفات", - "orphanedFilesReportTitle": "تقارير الملفات المعزولة", "reports": "تقارير", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/bg.i18n.json b/imports/i18n/data/bg.i18n.json index 0a1eada53..a79e545df 100644 --- a/imports/i18n/data/bg.i18n.json +++ b/imports/i18n/data/bg.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Действие", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/br.i18n.json b/imports/i18n/data/br.i18n.json index 31c0cbcbe..c2cf58a6d 100644 --- a/imports/i18n/data/br.i18n.json +++ b/imports/i18n/data/br.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ca.i18n.json b/imports/i18n/data/ca.i18n.json index 588375799..589db2ff6 100644 --- a/imports/i18n/data/ca.i18n.json +++ b/imports/i18n/data/ca.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/cs-CZ.i18n.json b/imports/i18n/data/cs-CZ.i18n.json index f6b88b0f9..610942303 100644 --- a/imports/i18n/data/cs-CZ.i18n.json +++ b/imports/i18n/data/cs-CZ.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Stiskněte enter pro přidání více položek", "creator": "Tvůrce", "filesReportTitle": "Report souborů", - "orphanedFilesReportTitle": "Report osiřelých souborů", "reports": "Reporty", "rulesReportTitle": "Report pravidel", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Akce", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/cs.i18n.json b/imports/i18n/data/cs.i18n.json index adaabff1d..9396e539f 100644 --- a/imports/i18n/data/cs.i18n.json +++ b/imports/i18n/data/cs.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Stiskněte enter pro přidání více položek", "creator": "Tvůrce", "filesReportTitle": "Report souborů", - "orphanedFilesReportTitle": "Report osiřelých souborů", "reports": "Reporty", "rulesReportTitle": "Report pravidel", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Akce", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/da.i18n.json b/imports/i18n/data/da.i18n.json index 0b8f89b8a..6e55cbc2f 100644 --- a/imports/i18n/data/da.i18n.json +++ b/imports/i18n/data/da.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json index c9e4b0409..d54337a2e 100644 --- a/imports/i18n/data/de-AT.i18n.json +++ b/imports/i18n/data/de-AT.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Drücke die Eingabetaste, um weitere Einträge hinzuzufügen", "creator": "Ersteller", "filesReportTitle": "Dateien-Bericht", - "orphanedFilesReportTitle": "Verwaister Datei-Bericht", "reports": "Berichte", "rulesReportTitle": "Regeln-Bericht", "boardsReportTitle": "Board-Bericht", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Aktion", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json index 4fa681a2c..fd93752ac 100644 --- a/imports/i18n/data/de-CH.i18n.json +++ b/imports/i18n/data/de-CH.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Drücke die Eingabetaste, um weitere Einträge hinzuzufügen", "creator": "Ersteller", "filesReportTitle": "Dateien-Bericht", - "orphanedFilesReportTitle": "Verwaister Datei-Bericht", "reports": "Berichte", "rulesReportTitle": "Regeln-Bericht", "boardsReportTitle": "Board-Bericht", @@ -1163,5 +1162,19 @@ "copyChecklist": "Checkliste kopieren", "copyChecklistPopup-title": "Checkliste kopieren", "card-show-lists": "Listen anzeigen", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Aktion", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index f2c71d87a..059e1a056 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -135,12 +135,12 @@ "avatar-too-big": "Das Profilbild ist zu groß (520KB max)", "back": "Zurück", "board-change-color": "Farbe ändern", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", + "show-at-all-boards-page": "Zeige auf \"Alle Boards\" Seite", + "board-info-on-my-boards": "\"Alle Boards\" Einstellungen", + "boardInfoOnMyBoardsPopup-title": "\"Alle Boards\" Einstellungen", + "boardInfoOnMyBoards-title": "\"Alle Boards\" Einstellungen", + "show-card-counter-per-list": "Zeige Kartenanzahl pro Liste", + "show-board_members-avatar": "Zeige Profilbilder der Board-Mitglieder", "board-nb-stars": "%s Sterne", "board-not-found": "Board nicht gefunden", "board-private-info": "Dieses Board wird <strong>privat</strong> sein.", @@ -707,10 +707,10 @@ "queue": "Warteschlange", "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", - "minicard-settings": "Minicard Settings", + "minicard-settings": "Minikarte-Einstellungen", "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", - "boardMinicardSettingsPopup-title": "Minicard Settings", + "boardMinicardSettingsPopup-title": "Minikarte-Einstellungen", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", "deposit-subtasks-list": "Zielliste für hier abgelegte Teilaufgaben:", "show-parent-in-minicard": "Übergeordnetes Element auf Minikarte anzeigen:", @@ -892,7 +892,7 @@ "cardAssigneesPopup-title": "Zugewiesen", "addmore-detail": "Eine detailliertere Beschreibung hinzufügen", "show-on-card": "Zeige auf Karte", - "show-on-minicard": "Show on Minicard", + "show-on-minicard": "Zeige auf Minikarte", "new": "Neu", "editOrgPopup-title": "Organisation bearbeiten", "newOrgPopup-title": "Neue Organisation", @@ -938,10 +938,10 @@ "card": "Karte", "board": "Board", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "Meine Karten Ansicht", + "myCardsViewChangePopup-title": "Meine Karten Ansicht", "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "Tabelle", "myCardsSortChange-title": "Meine Karten Sortierung", "myCardsSortChangePopup-title": "Meine Karten Sortierung", "myCardsSortChange-choice-board": "nach Board", @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Drücke die Eingabetaste, um weitere Einträge hinzuzufügen", "creator": "Ersteller", "filesReportTitle": "Dateien-Bericht", - "orphanedFilesReportTitle": "Verwaister Datei-Bericht", "reports": "Berichte", "rulesReportTitle": "Regeln-Bericht", "boardsReportTitle": "Boardbericht", @@ -1163,5 +1162,19 @@ "copyChecklist": "Checkliste kopieren", "copyChecklistPopup-title": "Checkliste kopieren", "card-show-lists": "Listen anzeigen", - "subtaskActionsPopup-title": "Teilaufgabenaktionen" + "subtaskActionsPopup-title": "Teilaufgabenaktionen", + "attachmentActionsPopup-title": "Anhang-Aktionen", + "attachment-move-storage-fs": "Verschiebe den Anhang zum Dateisystem", + "attachment-move-storage-gridfs": "Verschiebe den Anhang zu GridFS", + "attachment-move": "Verschiebe den Anhang", + "move-all-attachments-to-fs": "Verschiebe alle Anhänge zum Dateisystem", + "move-all-attachments-to-gridfs": "Verschiebe alle Anhänge zu GridFS", + "move-all-attachments-of-board-to-fs": "Verschiebe alle Anhänge des Boards zum Dateisystem", + "move-all-attachments-of-board-to-gridfs": "Verschiebe alle Anhänge des Boards zu GridFS", + "path": "Pfad", + "version-name": "Version-Name", + "size": "Größe", + "storage": "Speicher", + "action": "Aktion", + "board-title": "Board-Titel" } \ No newline at end of file diff --git a/imports/i18n/data/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json index e1da08f91..1db29cbaf 100644 --- a/imports/i18n/data/el-GR.i18n.json +++ b/imports/i18n/data/el-GR.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Ενέργεια", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/en-BR.i18n.json b/imports/i18n/data/en-BR.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/en-BR.i18n.json +++ b/imports/i18n/data/en-BR.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json index e018e054e..69b88f264 100644 --- a/imports/i18n/data/en-DE.i18n.json +++ b/imports/i18n/data/en-DE.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json index e29befb8f..cd36a7111 100644 --- a/imports/i18n/data/en-GB.i18n.json +++ b/imports/i18n/data/en-GB.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/en-IT.i18n.json +++ b/imports/i18n/data/en-IT.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/eo.i18n.json b/imports/i18n/data/eo.i18n.json index 6d33b3fb6..3644ca02c 100644 --- a/imports/i18n/data/eo.i18n.json +++ b/imports/i18n/data/eo.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json index 1132568db..6269c3f82 100644 --- a/imports/i18n/data/es-AR.i18n.json +++ b/imports/i18n/data/es-AR.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json index 0b87ff2bb..ac3a41022 100644 --- a/imports/i18n/data/es-CL.i18n.json +++ b/imports/i18n/data/es-CL.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/es-LA.i18n.json +++ b/imports/i18n/data/es-LA.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json index 976d74556..0a9b15f24 100644 --- a/imports/i18n/data/es-MX.i18n.json +++ b/imports/i18n/data/es-MX.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json index 39f24ec8f..342fe6400 100644 --- a/imports/i18n/data/es-PE.i18n.json +++ b/imports/i18n/data/es-PE.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Acción", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/es-PY.i18n.json +++ b/imports/i18n/data/es-PY.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index 188ba1326..c958e24c4 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Pulsa intro para añadir más elementos", "creator": "Creador", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "acción", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json index b7cacba28..00aa843e7 100644 --- a/imports/i18n/data/et-EE.i18n.json +++ b/imports/i18n/data/et-EE.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Vajutage enter, et lisada rohkem objekte", "creator": "Looja", "filesReportTitle": "Failide aruanne", - "orphanedFilesReportTitle": "Orbude failide aruanne", "reports": "Aruanded", "rulesReportTitle": "Reeglite aruanne", "boardsReportTitle": "Juhatuse aruanne", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Tegevus", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/eu.i18n.json b/imports/i18n/data/eu.i18n.json index 3c795b80f..257c75485 100644 --- a/imports/i18n/data/eu.i18n.json +++ b/imports/i18n/data/eu.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json index 1e2a6d9e0..b482b08ad 100644 --- a/imports/i18n/data/fa-IR.i18n.json +++ b/imports/i18n/data/fa-IR.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/fa.i18n.json b/imports/i18n/data/fa.i18n.json index 5c9034212..0c7dfb083 100644 --- a/imports/i18n/data/fa.i18n.json +++ b/imports/i18n/data/fa.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "برای افزودن موارد بیشتر ، Enter را فشار دهید", "creator": "سازنده", "filesReportTitle": "گزارش پرونده‌ها", - "orphanedFilesReportTitle": "گزارش پرونده‌های یتیم", "reports": "گزارش‌ها", "rulesReportTitle": "گزارش قوانین", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "عملیات", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/fi.i18n.json b/imports/i18n/data/fi.i18n.json index b556bb2ff..12135e83b 100644 --- a/imports/i18n/data/fi.i18n.json +++ b/imports/i18n/data/fi.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Paina Enter lisätäksesi lisää kohtia", "creator": "Luoja", "filesReportTitle": "Tiedostot raportti", - "orphanedFilesReportTitle": "Orvot tiedostot raportti", "reports": "Raportit", "rulesReportTitle": "Säännöt raportti", "boardsReportTitle": "Taulut raportti", @@ -1163,5 +1162,19 @@ "copyChecklist": "Kopioi tarkistuslista", "copyChecklistPopup-title": "Kopioi tarkistuslista", "card-show-lists": "Näytä listat kortilla", - "subtaskActionsPopup-title": "Alitehtävä toimet" + "subtaskActionsPopup-title": "Alitehtävä toimet", + "attachmentActionsPopup-title": "Liite toimet", + "attachment-move-storage-fs": "Siirrä liite tiedostojärjestelmään", + "attachment-move-storage-gridfs": "Siirrä liite MongoDB GridFS:ään", + "attachment-move": "Siirrä liite", + "move-all-attachments-to-fs": "Siirrä kaikki liitteet tiedostojärjestelmään", + "move-all-attachments-to-gridfs": "Siirrä kaikki liitteet MongoDB GridFS:ään", + "move-all-attachments-of-board-to-fs": "Siirrä kaikki taulun liitteet tiedostojärjestelmään", + "move-all-attachments-of-board-to-gridfs": "Siirrä kaikki taulun liitteet MongoDB GridFS:ään", + "path": "Polku", + "version-name": "Version nimi", + "size": "Koko", + "storage": "Tallennustila", + "action": "Toimi", + "board-title": "Taulun otsikko" } \ No newline at end of file diff --git a/imports/i18n/data/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/fr-CH.i18n.json +++ b/imports/i18n/data/fr-CH.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json index dccddc3ce..595b81e7a 100644 --- a/imports/i18n/data/fr.i18n.json +++ b/imports/i18n/data/fr.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Appuyez sur Entrée pour ajouter plus d'éléments", "creator": "Créateur", "filesReportTitle": "Rapports sur les fichiers", - "orphanedFilesReportTitle": "Rapports sur les fichiers orphelins", "reports": "Rapports", "rulesReportTitle": "Rapports sur les règles", "boardsReportTitle": "Rapport sur les tableaux", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copier la checklist", "copyChecklistPopup-title": "Copier la checklist", "card-show-lists": "Afficher les listes sur la carte", - "subtaskActionsPopup-title": "Action de la sous-tâche" + "subtaskActionsPopup-title": "Action de la sous-tâche", + "attachmentActionsPopup-title": "Actions sur les pièces jointes", + "attachment-move-storage-fs": "Déplacer la pièce jointe vers le système de fichier", + "attachment-move-storage-gridfs": "Déplacer la pièce jointe vers GridFS", + "attachment-move": "Déplacer la pièce jointe", + "move-all-attachments-to-fs": "Déplacer toutes les pièces jointes vers le système de fichier", + "move-all-attachments-to-gridfs": "Déplacer toutes les pièces jointes vers GridFS", + "move-all-attachments-of-board-to-fs": "Déplacer toutes les pièces jointes du tableau vers le système de fichier", + "move-all-attachments-of-board-to-gridfs": "Déplacer toutes les pièces jointes du tableau vers GridFS", + "path": "Chemin", + "version-name": "Version-Nom", + "size": "Taille", + "storage": "Stockage", + "action": "Action", + "board-title": "Titre du tableau" } \ No newline at end of file diff --git a/imports/i18n/data/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json index 550a94540..cc55305ff 100644 --- a/imports/i18n/data/gl-ES.i18n.json +++ b/imports/i18n/data/gl-ES.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/gl.i18n.json b/imports/i18n/data/gl.i18n.json index 550a94540..cc55305ff 100644 --- a/imports/i18n/data/gl.i18n.json +++ b/imports/i18n/data/gl.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/gu-IN.i18n.json +++ b/imports/i18n/data/gu-IN.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index 9c72badc1..c312bee05 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "יש ללחוץ על enter כדי להוסיף עוד פריטים", "creator": "יוצר", "filesReportTitle": "דוח קבצים", - "orphanedFilesReportTitle": "דוח קבצים יתומים", "reports": "דוחות", "rulesReportTitle": "דוח כללים", "boardsReportTitle": "דוח לוחות", @@ -1163,5 +1162,19 @@ "copyChecklist": "העתקת רשימת מטלות", "copyChecklistPopup-title": "העתקת רשימת סימון", "card-show-lists": "הצגת רשימות על הכרטיס", - "subtaskActionsPopup-title": "פעולות תת־משימה" + "subtaskActionsPopup-title": "פעולות תת־משימה", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "פעולה", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json index eddd856a9..170457419 100644 --- a/imports/i18n/data/hi-IN.i18n.json +++ b/imports/i18n/data/hi-IN.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/hi.i18n.json b/imports/i18n/data/hi.i18n.json index eddd856a9..170457419 100644 --- a/imports/i18n/data/hi.i18n.json +++ b/imports/i18n/data/hi.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/hr.i18n.json b/imports/i18n/data/hr.i18n.json index 804785fc7..9338ee7ef 100644 --- a/imports/i18n/data/hr.i18n.json +++ b/imports/i18n/data/hr.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/hu.i18n.json b/imports/i18n/data/hu.i18n.json index 9fbb0bda7..1f17576db 100644 --- a/imports/i18n/data/hu.i18n.json +++ b/imports/i18n/data/hu.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Nyomj Enter-t több elem hozzáadásához", "creator": "Létrehozó", "filesReportTitle": "Fájl Riport", - "orphanedFilesReportTitle": "Elárvult Fájlok Riportja", "reports": "Riportok", "rulesReportTitle": "Szabályok Riportja", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Művelet", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/hy.i18n.json b/imports/i18n/data/hy.i18n.json index 6b0a2652a..7df47fe8e 100644 --- a/imports/i18n/data/hy.i18n.json +++ b/imports/i18n/data/hy.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/id.i18n.json b/imports/i18n/data/id.i18n.json index 74c3a3eb7..eab65b88d 100644 --- a/imports/i18n/data/id.i18n.json +++ b/imports/i18n/data/id.i18n.json @@ -19,9 +19,9 @@ "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "papan yang dibuat __board__", + "act-createSwimlane": "jalur yang dibuat __swimlane__ papan __board__", + "act-createCard": "kartu yang dibuat __card__ daftar __list__ jalur __swimlane__ papan __board__", "act-createCustomField": "created custom field __customField__ at board __board__", "act-deleteCustomField": "deleted custom field __customField__ at board __board__", "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ig.i18n.json b/imports/i18n/data/ig.i18n.json index a82ca5f2a..3b8d6d3da 100644 --- a/imports/i18n/data/ig.i18n.json +++ b/imports/i18n/data/ig.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json index 5fa6449aa..72b224f58 100644 --- a/imports/i18n/data/it.i18n.json +++ b/imports/i18n/data/it.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creatore", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Azione", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ja.i18n.json b/imports/i18n/data/ja.i18n.json index 5e01a1789..cc658880b 100644 --- a/imports/i18n/data/ja.i18n.json +++ b/imports/i18n/data/ja.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "作成者", "filesReportTitle": "ファイルレポート", - "orphanedFilesReportTitle": "孤立ファイルレポート", "reports": "レポート", "rulesReportTitle": "ルールレポート", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "操作", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ka.i18n.json b/imports/i18n/data/ka.i18n.json index d83a56c1d..5bdf6d13a 100644 --- a/imports/i18n/data/ka.i18n.json +++ b/imports/i18n/data/ka.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/km.i18n.json b/imports/i18n/data/km.i18n.json index b553b3d15..8a9f94792 100644 --- a/imports/i18n/data/km.i18n.json +++ b/imports/i18n/data/km.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json index 89a892802..506282ef8 100644 --- a/imports/i18n/data/ko.i18n.json +++ b/imports/i18n/data/ko.i18n.json @@ -210,8 +210,8 @@ "poker-oneHundred": "100", "poker-unsure": "?", "poker-finish": "완료", - "poker-result-votes": "Votes", - "poker-result-who": "Who", + "poker-result-votes": "투표", + "poker-result-who": "누구", "poker-replay": "Replay", "set-estimation": "Set Estimation", "deletePokerPopup-title": "Delete planning poker?", @@ -283,7 +283,7 @@ "deleteCommentPopup-title": "댓글을 삭제하시겠습니까?", "no-comments": "댓글 없음", "no-comments-desc": "댓글과 활동내역을 볼 수 없습니다.", - "worker": "Worker", + "worker": "노동자", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "내 컴퓨터", "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", @@ -400,9 +400,9 @@ "filter-dates-label": "날짜로 필터링", "filter-no-due-date": "No due date", "filter-overdue": "기한초과", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", + "filter-due-today": "오늘까지", + "filter-due-this-week": "이번 주까지", + "filter-due-tomorrow": "내일까지", "list-filter-label": "Filter List by Title", "filter-clear": "필터 초기화", "filter-labels-label": "Filter by label", @@ -419,7 +419,7 @@ "filter-on-desc": "보드에서 카드를 필터링합니다. 여기를 클릭하여 필터를 수정합니다.", "filter-to-selection": "선택 항목으로 필터링", "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", + "advanced-filter-label": "고급 필터", "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", "fullname": "실명", "header-logo-title": "보드 페이지로 돌아가기.", @@ -678,17 +678,17 @@ "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", + "accounts-allowUserNameChange": "유저 이름 변경 허용", "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", - "modifiedAt": "Modified at", + "modifiedAt": "에 변경됨", "verified": "Verified", "active": "Active", "card-received": "수신됨", - "card-received-on": "Received on", + "card-received-on": "에 받음", "card-end": "종료일", - "card-end-on": "Ends on", + "card-end-on": "에 끝남", "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "색 설정", @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "항목을 더 추가하려면 Enter 키를 누르십시오.", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "동작", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/lt.i18n.json b/imports/i18n/data/lt.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/lt.i18n.json +++ b/imports/i18n/data/lt.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/lv.i18n.json b/imports/i18n/data/lv.i18n.json index eb1876847..e5669d3ad 100644 --- a/imports/i18n/data/lv.i18n.json +++ b/imports/i18n/data/lv.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Darbība", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/mk.i18n.json b/imports/i18n/data/mk.i18n.json index cdf4fc28f..ee0e27dc5 100644 --- a/imports/i18n/data/mk.i18n.json +++ b/imports/i18n/data/mk.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/mn.i18n.json b/imports/i18n/data/mn.i18n.json index 22cffa559..80d813da3 100644 --- a/imports/i18n/data/mn.i18n.json +++ b/imports/i18n/data/mn.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/ms-MY.i18n.json +++ b/imports/i18n/data/ms-MY.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/nb.i18n.json b/imports/i18n/data/nb.i18n.json index ba48698ba..784149458 100644 --- a/imports/i18n/data/nb.i18n.json +++ b/imports/i18n/data/nb.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Trykk Enter for å legge til flere objekt", "creator": "Oppretter", "filesReportTitle": "Rapportering Filer", - "orphanedFilesReportTitle": "Rapportering Foreldreløse Filer", "reports": "Rapportering", "rulesReportTitle": "Rapportering Regler", "boardsReportTitle": "Rapport tavler", @@ -1163,5 +1162,19 @@ "copyChecklist": "Kopier sjekkliste", "copyChecklistPopup-title": "Kopier sjekkliste", "card-show-lists": "Vis liste over kort", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Aksjon", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/nl.i18n.json b/imports/i18n/data/nl.i18n.json index d2f988b71..9f3d6fd05 100644 --- a/imports/i18n/data/nl.i18n.json +++ b/imports/i18n/data/nl.i18n.json @@ -135,12 +135,12 @@ "avatar-too-big": "De avatar is te groot (520KB max)", "back": "Terug", "board-change-color": "Wijzig kleur", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", + "show-at-all-boards-page": "Toon op Alle borden pagina", + "board-info-on-my-boards": "Alle borden instellingen", + "boardInfoOnMyBoardsPopup-title": "Alle borden instellingen", + "boardInfoOnMyBoards-title": "Alle borden instellingen", + "show-card-counter-per-list": "Toon aantal kaarten per lijst", + "show-board_members-avatar": "Toon avatars van bord-leden", "board-nb-stars": "%s sterren", "board-not-found": "Bord is niet gevonden", "board-private-info": "Dit bord is nu <strong>privé</strong>.", @@ -707,10 +707,10 @@ "queue": "Rij", "subtask-settings": "Subtaak Instellingen", "card-settings": "Kaart Instellingen", - "minicard-settings": "Minicard Settings", + "minicard-settings": "Minikaart Instellingen", "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen", "boardCardSettingsPopup-title": "Kaart Instellingen", - "boardMinicardSettingsPopup-title": "Minicard Settings", + "boardMinicardSettingsPopup-title": "Minikaart Instellingen", "deposit-subtasks-board": "Plaats subtaken op dit bord:", "deposit-subtasks-list": "Plaats subtaken in deze lijst:", "show-parent-in-minicard": "Toon bron in minikaart:", @@ -892,7 +892,7 @@ "cardAssigneesPopup-title": "Toegewezen aan", "addmore-detail": "Voeg een meer gedetailleerde beschrijving toe", "show-on-card": "Toon op kaart", - "show-on-minicard": "Show on Minicard", + "show-on-minicard": "Toon op Minikaart", "new": "Nieuw", "editOrgPopup-title": "Wijzig organisatie", "newOrgPopup-title": "Nieuwe organisatie", @@ -938,10 +938,10 @@ "card": "Kaart", "board": "Bord", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "Mijn Kaarten Overzicht", + "myCardsViewChangePopup-title": "Mijn Kaarten Overzicht", "myCardsViewChange-choice-boards": "Borden", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "Tabel", "myCardsSortChange-title": "Mijn kaarten sortering", "myCardsSortChangePopup-title": "Mijn kaarten sortering", "myCardsSortChange-choice-board": "Naar bord", @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Druk op Enter om meer items toe te voegen", "creator": "Aangemaakt door", "filesReportTitle": "Bestanden Rapportage", - "orphanedFilesReportTitle": "Verweesde Bestanden Rapportage", "reports": "Rapportages", "rulesReportTitle": "Regels Rapportage", "boardsReportTitle": "Borden Rapportage", @@ -1163,5 +1162,19 @@ "copyChecklist": "Kopieer Checklist", "copyChecklistPopup-title": "Kopieer Checklist", "card-show-lists": "Kaart Toon Lijsten", - "subtaskActionsPopup-title": "Subtaak acties" + "subtaskActionsPopup-title": "Subtaak acties", + "attachmentActionsPopup-title": "Bijlage Acties", + "attachment-move-storage-fs": "Verplaats bijlage naar bestandssysteem", + "attachment-move-storage-gridfs": "Verplaats bijlage naar GridFS", + "attachment-move": "Verplaats Bijlage", + "move-all-attachments-to-fs": "Verplaats alle bijlagen naar bestandssysteem", + "move-all-attachments-to-gridfs": "Verplaats alle bijlagen naar GridFS", + "move-all-attachments-of-board-to-fs": "Verplaats alle bijlagen van bord naar bestandssysteem", + "move-all-attachments-of-board-to-gridfs": "Verplaats alle bijlagen van bord naar GridFS", + "path": "Pad", + "version-name": "Versie-Naam", + "size": "Grootte", + "storage": "Opslag", + "action": "Actie", + "board-title": "Bord Titel" } \ No newline at end of file diff --git a/imports/i18n/data/oc.i18n.json b/imports/i18n/data/oc.i18n.json index 615a2c9ad..2ea4b0b89 100644 --- a/imports/i18n/data/oc.i18n.json +++ b/imports/i18n/data/oc.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/pa.i18n.json b/imports/i18n/data/pa.i18n.json index 66ac68fb9..a25f0dc38 100644 --- a/imports/i18n/data/pa.i18n.json +++ b/imports/i18n/data/pa.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/pl.i18n.json b/imports/i18n/data/pl.i18n.json index fdc74a5e2..77dc487de 100644 --- a/imports/i18n/data/pl.i18n.json +++ b/imports/i18n/data/pl.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Wciśnij Enter, aby dodać więcej elementów", "creator": "Twórca", "filesReportTitle": "Wykaz plików", - "orphanedFilesReportTitle": "Wykaz osieroconych plików", "reports": "Wykazy", "rulesReportTitle": "Wykaz reguł", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Reakcja", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json index 4cc096bc1..afdf5516e 100644 --- a/imports/i18n/data/pt-BR.i18n.json +++ b/imports/i18n/data/pt-BR.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Pressione enter para adicionar mais itens", "creator": "Criador", "filesReportTitle": "Relatório de Arquivos", - "orphanedFilesReportTitle": "Relatório de Arquivos Órfãos", "reports": "Relatórios", "rulesReportTitle": "Relatório de regras", "boardsReportTitle": "Relatório de Quadros", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copiar Lista de verificação", "copyChecklistPopup-title": "Copiar Lista de verificação", "card-show-lists": "Cartão mostra listas", - "subtaskActionsPopup-title": "Ações da Subtarefa" + "subtaskActionsPopup-title": "Ações da Subtarefa", + "attachmentActionsPopup-title": "Ações do Anexo", + "attachment-move-storage-fs": "Mover anexo para sistema de arquivos", + "attachment-move-storage-gridfs": "Mover anexo para GridFS", + "attachment-move": "Mover Anexo", + "move-all-attachments-to-fs": "Mover todos os anexos para sistema de arquivos", + "move-all-attachments-to-gridfs": "Mover todos os anexos para GridFS", + "move-all-attachments-of-board-to-fs": "Mover todos os anexos do quadro para sistema de arquivos", + "move-all-attachments-of-board-to-gridfs": "Mover todos os anexos do quadro para GridFS", + "path": "Caminho", + "version-name": "Nome da Versão", + "size": "Tamanho", + "storage": "Armazenamento", + "action": "Ação", + "board-title": "Título do Quadro" } \ No newline at end of file diff --git a/imports/i18n/data/pt.i18n.json b/imports/i18n/data/pt.i18n.json index 4286b4ccd..6eb29925f 100644 --- a/imports/i18n/data/pt.i18n.json +++ b/imports/i18n/data/pt.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Pressione enter para adicionar mais itens", "creator": "Criador", "filesReportTitle": "Relatório de Ficheiros", - "orphanedFilesReportTitle": "Relatórios de Ficheiros Soltos", "reports": "Relatórios", "rulesReportTitle": "Relatório de Regras", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Ação", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ro.i18n.json b/imports/i18n/data/ro.i18n.json index a48a2130c..3c5b7ff9f 100644 --- a/imports/i18n/data/ro.i18n.json +++ b/imports/i18n/data/ro.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json index 95ebeb381..c5f327174 100644 --- a/imports/i18n/data/ru-UA.i18n.json +++ b/imports/i18n/data/ru-UA.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Нажмите «Ввод», чтобы добавить больше элементов.", "creator": "Автор", "filesReportTitle": "Отчёт по файлам", - "orphanedFilesReportTitle": "Отчёт по потерянным файлам", "reports": "Отчёты", "rulesReportTitle": "Отчёт по правилам", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Действие", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ru.i18n.json b/imports/i18n/data/ru.i18n.json index 220c7c5d0..b87ab3ec9 100644 --- a/imports/i18n/data/ru.i18n.json +++ b/imports/i18n/data/ru.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Нажмите «Ввод», чтобы добавить больше элементов.", "creator": "Автор", "filesReportTitle": "Отчёт по файлам", - "orphanedFilesReportTitle": "Отчёт по потерянным файлам", "reports": "Отчёты", "rulesReportTitle": "Отчёт по правилам", "boardsReportTitle": "Отчёт по Доскам", @@ -1163,5 +1162,19 @@ "copyChecklist": "Скопировать Чек-лист", "copyChecklistPopup-title": "Скопировать Чек-лист", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Действие", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/sk.i18n.json b/imports/i18n/data/sk.i18n.json index 9126ba600..1ef45e4bc 100644 --- a/imports/i18n/data/sk.i18n.json +++ b/imports/i18n/data/sk.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/sl.i18n.json b/imports/i18n/data/sl.i18n.json index 2ceca67b5..77e5f8598 100644 --- a/imports/i18n/data/sl.i18n.json +++ b/imports/i18n/data/sl.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/sr.i18n.json b/imports/i18n/data/sr.i18n.json index d4b1bdd60..014d59728 100644 --- a/imports/i18n/data/sr.i18n.json +++ b/imports/i18n/data/sr.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/sv.i18n.json b/imports/i18n/data/sv.i18n.json index fee3c85b1..e00aedf8b 100644 --- a/imports/i18n/data/sv.i18n.json +++ b/imports/i18n/data/sv.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Tryck enter för att lägga till fler", "creator": "Skapare", "filesReportTitle": "Filrapport", - "orphanedFilesReportTitle": "Föräldralös filrapport", "reports": "Rapporter", "rulesReportTitle": "Regelrapport", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Åtgärd", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/sw.i18n.json b/imports/i18n/data/sw.i18n.json index 9709c70e3..3f2fc0e4c 100644 --- a/imports/i18n/data/sw.i18n.json +++ b/imports/i18n/data/sw.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/ta.i18n.json b/imports/i18n/data/ta.i18n.json index aefbd7096..862ee1187 100644 --- a/imports/i18n/data/ta.i18n.json +++ b/imports/i18n/data/ta.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/th.i18n.json b/imports/i18n/data/th.i18n.json index dfd35bfae..cccc93fbb 100644 --- a/imports/i18n/data/th.i18n.json +++ b/imports/i18n/data/th.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/tr.i18n.json b/imports/i18n/data/tr.i18n.json index 1f900b97c..98ba7c939 100644 --- a/imports/i18n/data/tr.i18n.json +++ b/imports/i18n/data/tr.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Daha fazla öğe eklemek için enter'a basın", "creator": "Oluşturan", "filesReportTitle": "Dosya Raporu", - "orphanedFilesReportTitle": "Artık Dosyalar Raporu", "reports": "Raporlar", "rulesReportTitle": "Rapor Kuralları", "boardsReportTitle": "Pano Raporu", @@ -1163,5 +1162,19 @@ "copyChecklist": "Kontrol Listesini Kopyala", "copyChecklistPopup-title": "Kontrol Listesini Kopyala", "card-show-lists": "Kart Gösteri Listeleri", - "subtaskActionsPopup-title": "Alt Görev Eylemleri" + "subtaskActionsPopup-title": "Alt Görev Eylemleri", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Aksiyon", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/uk-UA.i18n.json b/imports/i18n/data/uk-UA.i18n.json index 757c156a1..bb3fc945e 100644 --- a/imports/i18n/data/uk-UA.i18n.json +++ b/imports/i18n/data/uk-UA.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/uk.i18n.json b/imports/i18n/data/uk.i18n.json index 1e0cf62a8..d474bc28e 100644 --- a/imports/i18n/data/uk.i18n.json +++ b/imports/i18n/data/uk.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/vi.i18n.json b/imports/i18n/data/vi.i18n.json index f7e345df5..9b52ccae9 100644 --- a/imports/i18n/data/vi.i18n.json +++ b/imports/i18n/data/vi.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Nhấn enter để thêm các mục khác", "creator": "Người tạo", "filesReportTitle": "Tệp báo cáo", - "orphanedFilesReportTitle": "Tệp báo cáo mồ côi", "reports": "Báo cáo", "rulesReportTitle": "Quy tắc Báo cáo", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Hoạt động", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/zh-CN.i18n.json b/imports/i18n/data/zh-CN.i18n.json index edd294c21..823f0d0ff 100644 --- a/imports/i18n/data/zh-CN.i18n.json +++ b/imports/i18n/data/zh-CN.i18n.json @@ -135,12 +135,12 @@ "avatar-too-big": "头像过大 (上限 520 KB)", "back": "返回", "board-change-color": "更改颜色", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", + "show-at-all-boards-page": "现在在所有面板页面", + "board-info-on-my-boards": "面板全局设置", + "boardInfoOnMyBoardsPopup-title": "面板全局设置", + "boardInfoOnMyBoards-title": "面板全局设置", "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", + "show-board_members-avatar": "显示面板成员头像", "board-nb-stars": "%s 星标", "board-not-found": "看板不存在", "board-private-info": "该看板将被设为 <strong>私有</strong>.", @@ -707,14 +707,14 @@ "queue": "队列", "subtask-settings": "子任务设置", "card-settings": "卡片设置", - "minicard-settings": "Minicard Settings", + "minicard-settings": "小卡片设置", "boardSubtaskSettingsPopup-title": "看板子任务设置", "boardCardSettingsPopup-title": "卡片设置", - "boardMinicardSettingsPopup-title": "Minicard Settings", + "boardMinicardSettingsPopup-title": "小卡片设置", "deposit-subtasks-board": "将子任务放入以下看板:", "deposit-subtasks-list": "将子任务放入以下列表:", "show-parent-in-minicard": "显示上一级卡片:", - "description-on-minicard": "Description on minicard", + "description-on-minicard": "小卡片描述", "prefix-with-full-path": "完整路径前缀", "prefix-with-parent": "上级前缀", "subtext-with-full-path": "子标题显示完整路径", @@ -892,7 +892,7 @@ "cardAssigneesPopup-title": "被指派人", "addmore-detail": "添加更详细的说明", "show-on-card": "显示卡片", - "show-on-minicard": "Show on Minicard", + "show-on-minicard": "展示小卡片", "new": "新", "editOrgPopup-title": "编辑组织", "newOrgPopup-title": "创建组织", @@ -938,10 +938,10 @@ "card": "卡片", "board": "看板", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "我的卡片展示", + "myCardsViewChangePopup-title": "我的卡片展示", "myCardsViewChange-choice-boards": "看板", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "表格", "myCardsSortChange-title": "我的卡片排序", "myCardsSortChangePopup-title": "我的卡片排序", "myCardsSortChange-choice-board": "根据看板", @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "按 enter 键添加更多项目", "creator": "创建者", "filesReportTitle": "文件报告", - "orphanedFilesReportTitle": "孤立文件报告", "reports": "报告", "rulesReportTitle": "规则报告", "boardsReportTitle": "面板报告", @@ -1163,5 +1162,19 @@ "copyChecklist": "复制待办清单", "copyChecklistPopup-title": "复制待办清单", "card-show-lists": "卡片显示列表", - "subtaskActionsPopup-title": "子任务操作" + "subtaskActionsPopup-title": "子任务操作", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "操作", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/zh-HK.i18n.json b/imports/i18n/data/zh-HK.i18n.json index 675d60a85..bfaf461ae 100644 --- a/imports/i18n/data/zh-HK.i18n.json +++ b/imports/i18n/data/zh-HK.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "Creator", "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "Reports", "rulesReportTitle": "Rules Report", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/data/zh-TW.i18n.json b/imports/i18n/data/zh-TW.i18n.json index 5a9e40c29..9963befad 100644 --- a/imports/i18n/data/zh-TW.i18n.json +++ b/imports/i18n/data/zh-TW.i18n.json @@ -1085,7 +1085,6 @@ "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "創建者", "filesReportTitle": "檔案報告", - "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "報告", "rulesReportTitle": "規則報告", "boardsReportTitle": "Boards Report", @@ -1163,5 +1162,19 @@ "copyChecklist": "Copy Checklist", "copyChecklistPopup-title": "Copy Checklist", "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions" + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "操作", + "board-title": "Board Title" } \ No newline at end of file diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 195a6ec14..41ad88ae4 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -171,7 +171,7 @@ export default { code: "fi", tag: "fi", name: "Suomi", - load: () => import('./data/fi-FI.i18n.json'), + load: () => import('./data/fi.i18n.json'), }, "fr-BE": { code: "fr", From 2193c867667fb3cc174c99e198d52919187ad960 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:26:35 +0300 Subject: [PATCH 090/246] Updated translations. --- imports/i18n/data/cy-GB.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/cy.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/en-YS.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/fy-NL.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/fy.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/he-IL.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/he.i18n.json | 26 +- imports/i18n/data/ko-KR.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/nl-NL.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/pl-PL.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/ug.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/uz-AR.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/uz-LA.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/uz-UZ.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/uz.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/ve-CC.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/ve-PP.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/ve.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/vi-VN.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/vl-SS.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/vo.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/wa-RR.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/wa.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/wo.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/xh.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/yi.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/yo.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/zu-ZA.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/data/zu.i18n.json | 1180 ++++++++++++++++++++ imports/i18n/languages.js | 30 + releases/translations/pull-translations.sh | 84 ++ 31 files changed, 33167 insertions(+), 13 deletions(-) create mode 100644 imports/i18n/data/cy-GB.i18n.json create mode 100644 imports/i18n/data/cy.i18n.json create mode 100644 imports/i18n/data/en-YS.i18n.json create mode 100644 imports/i18n/data/fy-NL.i18n.json create mode 100644 imports/i18n/data/fy.i18n.json create mode 100644 imports/i18n/data/he-IL.i18n.json create mode 100644 imports/i18n/data/ko-KR.i18n.json create mode 100644 imports/i18n/data/nl-NL.i18n.json create mode 100644 imports/i18n/data/pl-PL.i18n.json create mode 100644 imports/i18n/data/ug.i18n.json create mode 100644 imports/i18n/data/uz-AR.i18n.json create mode 100644 imports/i18n/data/uz-LA.i18n.json create mode 100644 imports/i18n/data/uz-UZ.i18n.json create mode 100644 imports/i18n/data/uz.i18n.json create mode 100644 imports/i18n/data/ve-CC.i18n.json create mode 100644 imports/i18n/data/ve-PP.i18n.json create mode 100644 imports/i18n/data/ve.i18n.json create mode 100644 imports/i18n/data/vi-VN.i18n.json create mode 100644 imports/i18n/data/vl-SS.i18n.json create mode 100644 imports/i18n/data/vo.i18n.json create mode 100644 imports/i18n/data/wa-RR.i18n.json create mode 100644 imports/i18n/data/wa.i18n.json create mode 100644 imports/i18n/data/wo.i18n.json create mode 100644 imports/i18n/data/xh.i18n.json create mode 100644 imports/i18n/data/yi.i18n.json create mode 100644 imports/i18n/data/yo.i18n.json create mode 100644 imports/i18n/data/zu-ZA.i18n.json create mode 100644 imports/i18n/data/zu.i18n.json diff --git a/imports/i18n/data/cy-GB.i18n.json b/imports/i18n/data/cy-GB.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/cy-GB.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/cy.i18n.json b/imports/i18n/data/cy.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/cy.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/en-YS.i18n.json b/imports/i18n/data/en-YS.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/en-YS.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/fy-NL.i18n.json b/imports/i18n/data/fy-NL.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/fy-NL.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/fy.i18n.json b/imports/i18n/data/fy.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/fy.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/he-IL.i18n.json b/imports/i18n/data/he-IL.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/he-IL.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index c312bee05..8930e536d 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -1163,18 +1163,18 @@ "copyChecklistPopup-title": "העתקת רשימת סימון", "card-show-lists": "הצגת רשימות על הכרטיס", "subtaskActionsPopup-title": "פעולות תת־משימה", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", + "attachmentActionsPopup-title": "פעולות על קבצים מצורפים", + "attachment-move-storage-fs": "העברת קבצים מצורפים למערכת הקבצים", + "attachment-move-storage-gridfs": "העברת הקובץ המצורף ל־GridFS", + "attachment-move": "העברת קובץ מצורף", + "move-all-attachments-to-fs": "העברת כל הקבצים המצורפים למערכת הקבצים", + "move-all-attachments-to-gridfs": "העברת כל הקבצים המצורפים ל־GridFS", + "move-all-attachments-of-board-to-fs": "העברת כל הקבצים המצורפים ללוח למערכת הקבצים", + "move-all-attachments-of-board-to-gridfs": "העברת כל הקבצים המצורפים ללוח ל־GridFS", + "path": "נתיב", + "version-name": "גרסה-שם", + "size": "גודל", + "storage": "אחסון", "action": "פעולה", - "board-title": "Board Title" + "board-title": "כותרת לוח" } \ No newline at end of file diff --git a/imports/i18n/data/ko-KR.i18n.json b/imports/i18n/data/ko-KR.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/ko-KR.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/nl-NL.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/pl-PL.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/ug.i18n.json b/imports/i18n/data/ug.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/ug.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/uz-AR.i18n.json b/imports/i18n/data/uz-AR.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/uz-AR.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/uz-LA.i18n.json b/imports/i18n/data/uz-LA.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/uz-LA.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/uz-UZ.i18n.json b/imports/i18n/data/uz-UZ.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/uz-UZ.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/uz.i18n.json b/imports/i18n/data/uz.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/uz.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/ve-CC.i18n.json b/imports/i18n/data/ve-CC.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/ve-CC.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/ve-PP.i18n.json b/imports/i18n/data/ve-PP.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/ve-PP.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/ve.i18n.json b/imports/i18n/data/ve.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/ve.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/vi-VN.i18n.json b/imports/i18n/data/vi-VN.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/vi-VN.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/vl-SS.i18n.json b/imports/i18n/data/vl-SS.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/vl-SS.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/vo.i18n.json b/imports/i18n/data/vo.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/vo.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/wa-RR.i18n.json b/imports/i18n/data/wa-RR.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/wa-RR.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/wa.i18n.json b/imports/i18n/data/wa.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/wa.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/wo.i18n.json b/imports/i18n/data/wo.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/wo.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/xh.i18n.json b/imports/i18n/data/xh.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/xh.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/yi.i18n.json b/imports/i18n/data/yi.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/yi.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/yo.i18n.json b/imports/i18n/data/yo.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/yo.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/zu-ZA.i18n.json b/imports/i18n/data/zu-ZA.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/zu-ZA.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/data/zu.i18n.json b/imports/i18n/data/zu.i18n.json new file mode 100644 index 000000000..a25f0dc38 --- /dev/null +++ b/imports/i18n/data/zu.i18n.json @@ -0,0 +1,1180 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title" +} \ No newline at end of file diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 41ad88ae4..80f4fddf4 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -35,6 +35,12 @@ export default { name: "čeština", load: () => import('./data/cs.i18n.json'), }, + "cs-CZ": { + code: "cs", + tag: "cs-CZ", + name: "čeština (Česká republika)", + load: () => import('./data/cs-CZ.i18n.json'), + }, "da": { code: "da", tag: "da", @@ -71,6 +77,12 @@ export default { name: "el", load: () => import('./data/el.i18n.json'), }, + "en-BR": { + code: "en", + tag: "en-BR", + name: "English (Brazil)", + load: () => import('./data/en-BR.i18n.json'), + }, "en-DE": { code: "en", tag: "en-DE", @@ -215,6 +227,12 @@ export default { name: "ગુજરાતી", load: () => import('./data/gu-IN.i18n.json'), }, + "he-IL": { + code: "he", + tag: "he-IL", + name: "עברית (ישראל)", + load: () => import('./data/he-IL.i18n.json'), + }, "he": { code: "he", tag: "he", @@ -287,6 +305,12 @@ export default { name: "ភាសាខ្មែរ", load: () => import('./data/km.i18n.json'), }, + "ko-KR": { + code: "ko", + tag: "ko-KR", + name: "한국어(한국)", + load: () => import('./data/ko-KR.i18n.json'), + }, "ko": { code: "ko", tag: "ko", @@ -329,6 +353,12 @@ export default { name: "Norsk bokmål", load: () => import('./data/nb.i18n.json'), }, + "nl-NL": { + code: "nl", + tag: "nl-NL", + name: "Nederlands (Nederland)", + load: () => import('./data/nl-NL.i18n.json'), + }, "nl": { code: "nl", tag: "nl", diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 066e2de41..119b40e62 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -48,6 +48,9 @@ tx pull -f -l da echo "Dutch:" tx pull -f -l nl +echo "Dutch (Netherlands):" +tx pull -f -l nl_NL + echo "Esperanto:" tx pull -f -l eo @@ -105,6 +108,9 @@ tx pull -f -l gu_IN echo "Hebrew:" tx pull -f -l he +echo "Hebrew (Israel):" +tx pull -f -l he_IL + echo "Hungarian:" tx pull -f -l hu_HU @@ -144,6 +150,9 @@ tx pull -f -l km echo "Korean:" tx pull -f -l ko +echo "Korean (Korea):" +tx pull -f -l ko_KR + echo "Latvian (Latvia):" tx pull -f -l lv_LV @@ -175,6 +184,9 @@ tx pull -f -l pa echo "Polish:" tx pull -f -l pl +echo "Polish (Poland):" +tx pull -f -l pl_PL + echo "Portuguese:" tx pull -f -l pt @@ -241,5 +253,77 @@ tx pull -f -l uk echo "Ukrainian (Ukraine):" tx pull -f -l uk_UA +echo "Uyghur (ug):" +tx pull -f -l ug + +echo "Uzbek (uz):" +tx pull -f -l uz + +echo "Uzbek (Arabic) (uz@Arab):" +tx pull -f -l uz@Arab + +echo "Uzbek (Latin) (uz@Latn):" +tx pull -f -l uz@Latn + +echo "Uzbek (Uzbekistan) (uz_UZ):" +tx pull -f -l uz_UZ + +echo "Venda (ve):" +tx pull -f -l ve + +echo "Venetian (vec):" +tx pull -f -l vec + +echo "Vepsian (vep):" +tx pull -f -l vep + echo "Vietnamese:" tx pull -f -l vi + +echo "Vietnamese (Viet Nam) (vi_VN):" +tx pull -f -l vi_VN + +echo "Vlaams (vls):" +tx pull -f -l vls + +echo "Volapük (vo):" +tx pull -f -l vo + +echo "Walloon (wa):" +tx pull -f -l wa + +echo "Welsh (cy):" +tx pull -f -l cy + +echo "Welsh (United Kingdom) (cy_GB):" +tx pull -f -l cy_GB + +echo "Western Frisian (fy):" +tx pull -f -l fy + +echo "Western Frisian (Netherlands) (fy_NL):" +tx pull -f -l fy_NL + +echo "Wolof (wo):" +tx pull -f -l wo + +echo "Wáray-Wáray (war):" +tx pull -f -l war + +echo "Xhosa (xh):" +tx pull -f -l xh + +echo "Yeshivish English (en@ysv):" +tx pull -f -l en@ysv + +echo "Yiddish (yi):" +tx pull -f -l yi + +echo "Yoruba (yo):" +tx pull -f -l yo + +echo "Zulu (zu):" +tx pull -f -l zu + +echo "Zulu (South Africa) (zu_ZA):" +tx pull -f -l zu_ZA From 43d6900ecbb304393ea4ff63415a430d8185b571 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:30:31 +0300 Subject: [PATCH 091/246] Updated translations. --- imports/i18n/data/nl-NL.i18n.json | 2158 ++++++++++++++--------------- 1 file changed, 1079 insertions(+), 1079 deletions(-) diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json index a25f0dc38..9f3d6fd05 100644 --- a/imports/i18n/data/nl-NL.i18n.json +++ b/imports/i18n/data/nl-NL.i18n.json @@ -1,203 +1,203 @@ { - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "accept": "Accepteren", + "act-activity-notify": "Activiteit notificatie", + "act-addAttachment": "heeft bijlage __attachment__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-deleteAttachment": "heeft bijlage __attachment__ verwijderd op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-addSubtask": "heeft subtaak __subtask__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-addLabel": "heeft label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-addedLabel": "heeft label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-removeLabel": "heeft label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-removedLabel": "heeft label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-addChecklist": "heeft checklist __checklist__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-addChecklistItem": "heeft checklist item __checklistItem__ toegevoegd aan checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-removeChecklist": "heeft checklist __checklist__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-removeChecklistItem": "heeft checklist item __checklistItem__ verwijderd van checklist __checkList__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-checkedItem": "heeft __checklistItem__ aangevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-uncheckedItem": "heeft __checklistItem__ uitgevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-completeChecklist": "heeft checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-uncompleteChecklist": "heeft checklist __checklist__ onafgewerkt op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-addComment": "heeft aantekening toegevoegd aan kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-editComment": "heeft aantekening gewijzigd op kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-deleteComment": "heeft aantekening verwijderd van kaart __card__: __comment__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-createBoard": "bord __board__ aangemaakt", + "act-createSwimlane": "swimlane __swimlane__ aangemaakt op bord __board__", + "act-createCard": "heeft kaart __card__ aangemaakt in lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-createCustomField": "heeft maatwerkveld __customField__ aangemaakt op bord __board__", + "act-deleteCustomField": "heeft maatwerkveld __customField__ verwijderd van bord __board__", + "act-setCustomField": "heeft maatwerkveld gewijzigd __customField__: __customFieldValue__ op kaart __card__ in lijst __list__ uit swimlane __swimlane__ op bord __board__", + "act-createList": "lijst __list__ toegevoegd aan bord __board__", + "act-addBoardMember": "heeft lid __member__ toegevoegd aan bord __board__", + "act-archivedBoard": "Bord __board__ verplaatst naar Archief", + "act-archivedCard": "heeft kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief", + "act-archivedList": "Lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief", + "act-archivedSwimlane": "Swimlane __swimlane__ op bord __board__ verplaatst naar Archief", + "act-importBoard": "bord __board__ geïmporteerd", + "act-importCard": "heeft kaart __card__ geïmporteerd in lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-importList": "lijst __list__ geïmporteerd in swimlane __swimlane__ op bord __board__", + "act-joinMember": "heeft lid __member__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-moveCard": "heeft kaart __card__ verplaatst op bord __board__ van lijst __oldList__ uit swimlane __oldSwimlane__ naar lijst __list__ in swimlane __swimlane__", + "act-moveCardToOtherBoard": "heeft kaart __card__ verplaatst van lijst __oldList__ uit swimlane __oldSwimlane__ op bord __oldBoard__ naar lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-removeBoardMember": "heeft lid __member__ verwijderd van bord __board__", + "act-restoredCard": "heeft kaart __card__ teruggehaald naar lijst __list__ in swimlane __swimlane__ op bord __board__", + "act-unjoinMember": "heeft lid __member__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__", "act-withBoardTitle": "__board__", "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-customfield-created": "created custom field %s", - "activity-excluded": "excluded %s from %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "joined %s", - "activity-moved": "moved %s from %s to %s", - "activity-on": "on %s", - "activity-removed": "removed %s from %s", - "activity-sent": "sent %s to %s", - "activity-unjoined": "unjoined %s", - "activity-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add Cover", - "add-label": "Add Label", - "add-list": "Add List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "admin": "Admin", - "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", - "admin-announcement": "Announcement", - "admin-announcement-active": "Active System-Wide Announcement", - "admin-announcement-title": "Announcement from Administrator", - "all-boards": "All boards", - "and-n-other-card": "And __count__ other card", - "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", + "actions": "Acties", + "activities": "Activiteiten", + "activity": "Activiteit", + "activity-added": "%s toegevoegd aan %s", + "activity-archived": "%s verplaatst naar Archief", + "activity-attached": "%s bijgevoegd aan %s", + "activity-created": "%s aangemaakt", + "activity-customfield-created": "maatwerkveld aangemaakt %s", + "activity-excluded": "%s uitgesloten van %s", + "activity-imported": "%s geïmporteerd in %s van %s", + "activity-imported-board": "%s geïmporteerd van %s", + "activity-joined": "%s toegetreden", + "activity-moved": "%s verplaatst van %s naar %s", + "activity-on": "bij %s", + "activity-removed": "%s verwijderd van %s", + "activity-sent": "%s gestuurd naar %s", + "activity-unjoined": "uit %s gegaan", + "activity-subtask-added": "subtaak toegevoegd aan %s", + "activity-checked-item": "%s aangevinkt in checklist %s van %s", + "activity-unchecked-item": "%s uitgevinkt in checklist %s van %s", + "activity-checklist-added": "checklist toegevoegd aan %s", + "activity-checklist-removed": "checklist verwijderd van %s", + "activity-checklist-completed": "checklist %s afgewerkt van %s", + "activity-checklist-uncompleted": "checklist %s onafgewerkt van %s", + "activity-checklist-item-added": "checklist item toegevoegd aan '%s' in '%s'", + "activity-checklist-item-removed": "checklist item verwijderd van '%s' in %s", + "add": "Toevoegen", + "activity-checked-item-card": "%s aangevinkt in checklist %s", + "activity-unchecked-item-card": "%s uitgevinkt in checklist %s", + "activity-checklist-completed-card": "heeft checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__", + "activity-checklist-uncompleted-card": "checklist %s onafgewerkt", + "activity-editComment": "aantekening gewijzigd %s", + "activity-deleteComment": "aantekening verwijderd %s", + "activity-receivedDate": "ontvangst datum gewijzigd naar %s van %s", + "activity-startDate": "start datum gewijzigd naar %s van %s", + "activity-dueDate": "vervaldatum gewijzigd naar %s van %s", + "activity-endDate": "einddatum gewijzigd naar %s van %s ", + "add-attachment": "Bijlage Toevoegen", + "add-board": "Bord Toevoegen", + "add-template": "Template Toevoegen", + "add-card": "Kaart Toevoegen", + "add-card-to-top-of-list": "Kaart Boven Aan de Lijst Toevoegen", + "add-card-to-bottom-of-list": "Kaart Onder Aan de Lijst Toevoegen", + "add-swimlane": "Swimlane Toevoegen", + "add-subtask": "Subtaak Toevoegen", + "add-checklist": "Checklist toevoegen", + "add-checklist-item": "Item aan checklist toevoegen", + "convertChecklistItemToCardPopup-title": "Converteer naar Kaart", + "add-cover": "Cover Toevoegen", + "add-label": "Label Toevoegen", + "add-list": "Lijst Toevoegen", + "add-members": "Leden Toevoegen", + "added": "Toegevoegd", + "addMemberPopup-title": "Leden", + "memberPopup-title": "Leden Instellingen", + "admin": "Administrator", + "admin-desc": "Kan kaarten bekijken en wijzigen, leden verwijderen, en instellingen voor het bord aanpassen.", + "admin-announcement": "Melding", + "admin-announcement-active": "Systeem melding", + "admin-announcement-title": "Melding van de beheerder", + "all-boards": "Alle borden", + "and-n-other-card": "En __count__ andere kaarten", + "and-n-other-card_plural": "En __count__ andere kaarten", + "apply": "Aanmelden", + "app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check dan of de Wekan server niet is gestopt. ", + "app-try-reconnect": "Probeer opnieuw te verbinden.", + "archive": "Verplaats naar Archief", + "archive-all": "Verplaats Alles naar Archief", + "archive-board": "Verplaats Bord naar Archief", + "archive-card": "Verplaats Kaart naar Archief", + "archive-list": "Verplaats Lijst naar Archief", + "archive-swimlane": "Verplaats Swimlane naar Archief", + "archive-selection": "Verplaats selectie naar Archief", + "archiveBoardPopup-title": "Bord naar Archief verplaatsen?", + "archived-items": "Archief", + "archived-boards": "Borden in Archief", + "restore-board": "Herstel Bord", + "no-archived-boards": "Geen Borden in Archief.", + "archives": "Archief", "template": "Template", "templates": "Templates", "template-container": "Template Container", - "add-template-container": "Add Template Container", - "assign-member": "Assign member", - "attached": "attached", - "attachment": "Attachment", - "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", - "attachmentDeletePopup-title": "Delete Attachment?", - "attachments": "Attachments", - "auto-watch": "Automatically watch boards when they are created", - "avatar-too-big": "The avatar is too large (520KB max)", - "back": "Back", - "board-change-color": "Change color", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "board-nb-stars": "%s stars", - "board-not-found": "Board not found", - "board-private-info": "This board will be <strong>private</strong>.", - "board-public-info": "This board will be <strong>public</strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "board-view-cal": "Calendar", + "add-template-container": "Template Container Toevoegen", + "assign-member": "Lid toevoegen", + "attached": "bijgevoegd", + "attachment": "Bijlage", + "attachment-delete-pop": "Een bijlage verwijderen is permanent. Er is geen herstelmogelijkheid.", + "attachmentDeletePopup-title": "Bijlage verwijderen?", + "attachments": "Bijlagen", + "auto-watch": "Automatisch borden bekijken wanneer deze aangemaakt worden", + "avatar-too-big": "De avatar is te groot (520KB max)", + "back": "Terug", + "board-change-color": "Wijzig kleur", + "show-at-all-boards-page": "Toon op Alle borden pagina", + "board-info-on-my-boards": "Alle borden instellingen", + "boardInfoOnMyBoardsPopup-title": "Alle borden instellingen", + "boardInfoOnMyBoards-title": "Alle borden instellingen", + "show-card-counter-per-list": "Toon aantal kaarten per lijst", + "show-board_members-avatar": "Toon avatars van bord-leden", + "board-nb-stars": "%s sterren", + "board-not-found": "Bord is niet gevonden", + "board-private-info": "Dit bord is nu <strong>privé</strong>.", + "board-public-info": "Dit bord is nu <strong>openbaar</strong>.", + "board-drag-drop-reorder-or-click-open": "Sleep en verplaats om iconen te herordenen. Klik bord-icoon om het bord te openen,", + "boardChangeColorPopup-title": "Wijzig achtergrond van bord", + "boardChangeTitlePopup-title": "Hernoem bord", + "boardChangeVisibilityPopup-title": "Wijzig zichtbaarheid", + "boardChangeWatchPopup-title": "Wijzig naar 'Watch'", + "boardMenuPopup-title": "Bord Instellingen", + "boardChangeViewPopup-title": "Bord overzicht", + "boards": "Borden", + "board-view": "Bord overzicht", + "board-view-cal": "Kalender", "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", + "board-view-collapse": "Klap in", "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like “Bucket List” for example", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "card-comments-title": "This card has %s comment.", - "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", - "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", - "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "card-due": "Due", - "card-due-on": "Due on", - "card-spent": "Spent Time", - "card-edit-attachments": "Edit attachments", - "card-edit-custom-fields": "Edit custom fields", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", - "card-labels-title": "Change the labels for the card.", - "card-members-title": "Add or remove members of the board from the card.", - "card-start": "Start", - "card-start-on": "Starts on", - "cardAttachmentsPopup-title": "Attach From", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "board-view-lists": "Lijsten", + "bucket-example": "Zoals bijvoorbeeld een \"Bucket List\"", + "cancel": "Annuleren", + "card-archived": "Deze kaart is verplaatst naar Archief.", + "board-archived": "Dit bord is verplaatst naar Archief.", + "card-comments-title": "Deze kaart heeft %s aantekening(en).", + "card-delete-notice": "Verwijdering is permanent. Je raakt alles acties die gekoppeld zijn aan deze kaart kwijt.", + "card-delete-pop": "Alle acties worden verwijderd van de activiteiten feed, en er zal geen mogelijkheid zijn om de kaart opnieuw te openen. Er is geen herstelmogelijkheid.", + "card-delete-suggest-archive": "Je kunt een kaart naar Archief verplaatsen om die van het bord te verwijderen waarbij de activiteiten behouden blijven.", + "card-archive-pop": "Kaart is na archivering niet meer zichtbaar op deze lijst.", + "card-archive-suggest-cancel": "Je kunt de kaart later terughalen vanuit het Archief.", + "card-due": "Verval", + "card-due-on": "Vervalt op ", + "card-spent": "Gespendeerde tijd", + "card-edit-attachments": "Wijzig bijlagen", + "card-edit-custom-fields": "Wijzig maatwerkvelden", + "card-edit-labels": "Wijzig labels", + "card-edit-members": "Wijzig leden", + "card-labels-title": "Wijzig de labels van de kaart.", + "card-members-title": "Leden van het bord aan de kaart toevoegen of verwijderen.", + "card-start": "Begin", + "card-start-on": "Begint op", + "cardAttachmentsPopup-title": "Voeg bestand toe vanuit", + "cardCustomField-datePopup-title": "Wijzigingsdatum", + "cardCustomFieldsPopup-title": "Wijzig maatwerkvelden", + "cardStartVotingPopup-title": "Start een stemming", + "positiveVoteMembersPopup-title": "Voorstanders", + "negativeVoteMembersPopup-title": "Tegenstanders", + "card-edit-voting": "Wijzig stemming", + "editVoteEndDatePopup-title": "Wijzig einddatum stemming", + "allowNonBoardMembers": "Sta alle ingelogde gebruikers toe", + "vote-question": "Vraag", + "vote-public": "Toon wie wat gestemd heeft", + "vote-for-it": "Voor", + "vote-against": "tegen", + "deleteVotePopup-title": "Stemming verwijderen?", + "vote-delete-pop": "Verwijdering is permanent. Je raakt alle acties die gekoppeld zijn aan deze stemming kwijt.", + "cardStartPlanningPokerPopup-title": "Start Planning Poker sessie", + "card-edit-planning-poker": "Wijzig Planning Poker", + "editPokerEndDatePopup-title": "Wijzig Planning Poker ischatting einddatum", "poker-question": "Planning Poker", "poker-one": "1", "poker-two": "2", @@ -209,929 +209,929 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", + "poker-finish": "Uitslag", + "poker-result-votes": "Inschattingen", + "poker-result-who": "Wie", + "poker-replay": "Nieuwe ronde", + "set-estimation": "Overeengekomen Inschatting", + "deletePokerPopup-title": "Planning poker verwijderen?", + "poker-delete-pop": "Verwijdering is permanent. Je verlies alle acties die gekoppeld zijn aan deze poker sessie.", + "cardDeletePopup-title": "Kaart verwijderen?", + "cardArchivePopup-title": "Kaart archiveren?", + "cardDetailsActionsPopup-title": "Kaart acties", "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "change": "Change", - "change-avatar": "Change Avatar", - "change-password": "Change Password", - "change-permissions": "Change permissions", - "change-settings": "Change Settings", - "changeAvatarPopup-title": "Change Avatar", - "changeLanguagePopup-title": "Change Language", - "changePasswordPopup-title": "Change Password", - "changePermissionsPopup-title": "Change Permissions", - "changeSettingsPopup-title": "Change Settings", - "subtasks": "Subtasks", + "cardMembersPopup-title": "Leden", + "cardMorePopup-title": "Meer", + "cardTemplatePopup-title": "Template aanmaken", + "cards": "Kaarten", + "cards-count": "Kaarten", + "cards-count-one": "Kaart", + "casSignIn": "Log in met CAS", + "cardType-card": "Kaart", + "cardType-linkedCard": "Gekoppelde Kaart", + "cardType-linkedBoard": "Gekoppeld Bord", + "change": "Wijzig", + "change-avatar": "Wijzig avatar", + "change-password": "Wijzig wachtwoord", + "change-permissions": "Wijzig permissies", + "change-settings": "Wijzig instellingen", + "changeAvatarPopup-title": "Wijzig avatar", + "changeLanguagePopup-title": "Wijzig taal", + "changePasswordPopup-title": "Wijzig wachtwoord", + "changePermissionsPopup-title": "Wijzig permissies", + "changeSettingsPopup-title": "Wijzig instellingen", + "subtasks": "Subtaken", "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", - "close": "Close", - "close-board": "Close Board", - "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", + "click-to-star": "Klik om het bord als favoriet in te stellen", + "click-to-unstar": "Klik om het bord uit favorieten weg te halen", + "clipboard": "Vanuit clipboard of sleep het bestand hierheen", + "close": "Sluiten", + "close-board": "Sluit bord", + "close-board-pop": "Je kunt het bord terughalen door de \"Archief\" knop te klikken in de menubalk \"Mijn Borden\".", + "close-card": "Sluit Kaart", + "color-black": "zwart", + "color-blue": "blauw", + "color-crimson": "karmijn", + "color-darkgreen": "donkergroen", + "color-gold": "goud", + "color-gray": "grijs", + "color-green": "groen", "color-indigo": "indigo", - "color-lime": "lime", + "color-lime": "felgroen", "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", + "color-mistyrose": "zachtroze", + "color-navy": "marineblauw", + "color-orange": "oranje", + "color-paleturquoise": "vaalturkoois", + "color-peachpuff": "perzikroze", + "color-pink": "roze", + "color-plum": "pruim", + "color-purple": "paars", + "color-red": "rood", + "color-saddlebrown": "zadelbruin", + "color-silver": "zilver", + "color-sky": "lucht", + "color-slateblue": "leiblauw", + "color-white": "wit", + "color-yellow": "geel", + "unset-color": "Ongedefinieerd", + "comment": "Aantekening", + "comment-placeholder": "Schrijf aantekening", + "comment-only": "Alleen aantekeningen maken", + "comment-only-desc": "Kan alleen op kaarten aantekenen.", + "comment-delete": "Weet je zeker dat je de aantekening wilt verwijderen?", + "deleteCommentPopup-title": "Verwijder aantekening?", + "no-comments": "Geen aantekeningen", + "no-comments-desc": "Zie geen aantekeningen of activiteiten.", + "worker": "Medewerker", + "worker-desc": "Kan alleen kaarten verplaatsen, zichzelf aan kaarten koppelen en aantekeningen maken.", "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", - "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", - "create": "Create", - "createBoardPopup-title": "Create Board", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "confirm-subtask-delete-popup": "Weet je zeker dat je de subtaak wilt verwijderen?", + "confirm-checklist-delete-popup": "Weet je zeker dat je de checklist wilt verwijderen?", + "subtaskDeletePopup-title": "Subtaak Verwijderen?", + "checklistDeletePopup-title": "Checklist Verwijderen?", + "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord", + "copy-text-to-clipboard": "Kopieer tekst naar klembord", + "linkCardPopup-title": "Koppel Kaart", + "searchElementPopup-title": "Zoek", + "copyCardPopup-title": "Kopieer kaart", + "copyChecklistToManyCardsPopup-title": "Checklist sjabloon kopiëren naar meerdere kaarten", + "copyChecklistToManyCardsPopup-instructions": "Doel kaart titels en omschrijvingen in dit JSON formaat", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel eerste kaart\", \"description\":\"Omschrijving eerste kaart\"}, {\"title\":\"Titel tweede kaart\",\"description\":\"Omschrijving tweede kaart\"},{\"title\":\"Titel laatste kaart\",\"description\":\"Omschrijving laatste kaart\"} ]", + "create": "Aanmaken", + "createBoardPopup-title": "Bord aanmaken", + "chooseBoardSourcePopup-title": "Importeer bord", + "createLabelPopup-title": "Label aanmaken", + "createCustomField": "Veld aanmaken", + "createCustomFieldPopup-title": "Veld aanmaken", + "current": "Huidige", + "custom-field-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal dit maatwerkveld van alle kaarten verwijderen en de bijbehorende historie wissen.", "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "deleteLabelPopup-title": "Delete Label?", - "description": "Description", - "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", - "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", + "custom-field-currency": "Valuta", + "custom-field-currency-option": "Valuta Teken", + "custom-field-date": "Datum", + "custom-field-dropdown": "Dropdown Lijst", + "custom-field-dropdown-none": "(geen)", + "custom-field-dropdown-options": "Lijst Opties", + "custom-field-dropdown-options-placeholder": "Toets Enter om meer opties toe te voegen ", + "custom-field-dropdown-unknown": "(onbekend)", + "custom-field-number": "Aantal", + "custom-field-text": "Tekst", + "custom-fields": "Maatwerkvelden", + "date": "Datum", + "decline": "Weigeren", + "default-avatar": "Standaard avatar", + "delete": "Verwijderen", + "deleteCustomFieldPopup-title": "Maatwerkveld verwijderen?", + "deleteLabelPopup-title": "Label verwijderen?", + "description": "Beschrijving", + "disambiguateMultiLabelPopup-title": "Disambigueer Label Actie", + "disambiguateMultiMemberPopup-title": "Disambigueer Lid Actie", + "discard": "Negeer", + "done": "Klaar", "download": "Download", - "edit": "Edit", - "edit-avatar": "Change Avatar", - "edit-profile": "Edit Profile", - "edit-wip-limit": "Edit WIP Limit", - "soft-wip-limit": "Soft WIP Limit", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-fail-text": "Error trying to send email", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "enable-wip-limit": "Enable WIP Limit", - "error-board-doesNotExist": "This board does not exist", - "error-board-notAdmin": "You need to be admin of this board to do that", - "error-board-notAMember": "You need to be a member of this board to do that", - "error-json-malformed": "Your text is not valid JSON", - "error-json-schema": "Your JSON data does not include the proper information in the correct format", - "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", - "error-list-doesNotExist": "This list does not exist", - "error-user-doesNotExist": "This user does not exist", - "error-user-notAllowSelf": "You can not invite yourself", - "error-user-notCreated": "This user is not created", - "error-username-taken": "This username is already taken", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", + "edit": "Wijzig", + "edit-avatar": "Wijzig avatar", + "edit-profile": "Wijzig profiel", + "edit-wip-limit": "Wijzig WIP limiet", + "soft-wip-limit": "Zachte WIP limiet", + "editCardStartDatePopup-title": "Wijzig start datum", + "editCardDueDatePopup-title": "Wijzig vervaldatum", + "editCustomFieldPopup-title": "Wijzig Veld", + "addReactionPopup-title": "Reactie toevoegen", + "editCardSpentTimePopup-title": "Wijzig gespendeerde tijd", + "editLabelPopup-title": "Wijzig label", + "editNotificationPopup-title": "Wijzig notificatie", + "editProfilePopup-title": "Wijzig profiel", + "email": "E-mail", + "email-enrollAccount-subject": "Er is een account voor je aangemaakt op __siteName__", + "email-enrollAccount-text": "Hallo __user__,\n\nOm gebruik te maken van de online dienst, kan je op de volgende link klikken.\n\n__url__\n\nBedankt.", + "email-fail": "E-mail verzenden is mislukt", + "email-fail-text": "Fout tijdens het verzenden van de email", + "email-invalid": "Ongeldig e-mailadres", + "email-invite": "Nodig uit via e-mail", + "email-invite-subject": "__inviter__ heeft je een uitnodiging gestuurd", + "email-invite-text": "Beste __user__,\n\n__inviter__ heeft je uitgenodigd om voor een samenwerking deel te nemen aan het bord \"__board__\".\n\nKlik op de link hieronder:\n\n__url__\n\nBedankt.", + "email-resetPassword-subject": "Reset je wachtwoord op __siteName__", + "email-resetPassword-text": "Hallo __user__,\n\nKlik op de link hier beneden om je wachtwoord te resetten.\n\n__url__\n\nBedankt.", + "email-sent": "E-mail is verzonden", + "email-verifyEmail-subject": "Verifieer je e-mailadres op __siteName__", + "email-verifyEmail-text": "Hallo __user__,\n\nOm je e-mail te verifiëren vragen we je om op de link hieronder te klikken.\n\n__url__\n\nBedankt.", + "enable-wip-limit": "Activeer WIP limiet", + "error-board-doesNotExist": "Dit bord bestaat niet.", + "error-board-notAdmin": "Je moet een administrator zijn van dit bord om dat te doen.", + "error-board-notAMember": "Je moet een lid zijn van dit bord om dat te doen.", + "error-json-malformed": "JSON format klopt niet", + "error-json-schema": "De JSON data bevat niet de juiste informatie in de juiste format", + "error-csv-schema": "Je CSV(Comma Separated Values)/TSV (Tab Separated Values) bevat niet de juiste informatie in het juiste fomaat.", + "error-list-doesNotExist": "Deze lijst bestaat niet", + "error-user-doesNotExist": "Deze gebruiker bestaat niet", + "error-user-notAllowSelf": "Je kan jezelf niet uitnodigen", + "error-user-notCreated": "Deze gebruiker is niet aangemaakt", + "error-username-taken": "Deze gebruikersnaam is al in gebruik", + "error-orgname-taken": "Deze organisatienaam is al in gebruik", + "error-teamname-taken": "Deze teamnaam is al in gebruik", + "error-email-taken": "Dit e-mailadres is al in gebruik", + "export-board": "Exporteer bord", + "export-board-json": "Exporteer bord naar JSON", + "export-board-csv": "Exporteer bord naar CSV", + "export-board-tsv": "Exporteer bord naar TSV", + "export-board-excel": "Exporteer bord naar Excel", + "user-can-not-export-excel": "Gebruiker kan niet exporteren naar Excel", + "export-board-html": "Exporteer bord naar HTML", + "export-card": "Exporteer kaart", + "export-card-pdf": "Exporteer kaart naar PDF", + "user-can-not-export-card-to-pdf": "Gebruiker kan kaart niet naar PDF exporteren", + "exportBoardPopup-title": "Exporteer bord", + "exportCardPopup-title": "Exporteer kaart", + "sort": "Sorteer", + "sorted": "Gesorteerd", + "remove-sort": "Verwijder sortering", + "sort-desc": "Klik om lijst te sorteren", + "list-sort-by": "Sorteer lijst op", + "list-label-modifiedAt": "Laatste toegangstijd", + "list-label-title": "Naam van de lijst", + "list-label-sort": "Je handmatige volgorde", "list-label-short-modifiedAt": "(L)", "list-label-short-title": "(N)", "list-label-short-sort": "(M)", "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "filter-on": "Filter is on", - "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", - "filter-to-selection": "Filter to selection", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "hide-system-messages": "Hide system messages", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", + "filter-cards": "Filter kaarten of lijsten", + "filter-dates-label": "Filter op datum", + "filter-no-due-date": "Geen vervaldatum", + "filter-overdue": "verlopen", + "filter-due-today": "Vervalt vandaag", + "filter-due-this-week": "Vervalt deze week", + "filter-due-tomorrow": "Vervalt morgen", + "list-filter-label": "Filter lijst op titel", + "filter-clear": "Wis filter", + "filter-labels-label": "Filter op label", + "filter-no-label": "Geen label", + "filter-member-label": "Filter op lid", + "filter-no-member": "Geen lid", + "filter-assignee-label": "Filter op toegewezen persoon", + "filter-no-assignee": "Niemand toegewezen", + "filter-custom-fields-label": "Filter op Maatwerkveld", + "filter-no-custom-fields": "Geen maatwerkvelden", + "filter-show-archive": "Toon gearchiveerde lijsten", + "filter-hide-empty": "Verberg lege lijsten", + "filter-on": "Filter is actief", + "filter-on-desc": "Je bent nu kaarten aan het filteren op dit bord. Klik hier om het filter te wijzigen.", + "filter-to-selection": "Filter zoals selectie", + "other-filters-label": "Andere Filters", + "advanced-filter-label": "Geavanceerd Filter", + "advanced-filter-description": "Met het Geavanceerd Filter kun je een tekst schrijven die de volgende operatoren mag bevatten: == != <= >= && || ( ) Een Spatie wordt als scheiding gebruikt tussen de verschillende operatoren. Je kunt filteren op alle Maatwerkvelden door hun namen en waarden in te tikken. Bijvoorbeeld: Veld1 == Waarde1. Let op: Als velden of waarden spaties bevatten dan moet je die tussen enkele aanhalingstekens zetten. Bijvoorbeeld: 'Veld 1' == 'Waarde 1'. Om controle karakters (' \\/) over te slaan gebruik je \\. Bijvoorbeeld: Veld1 == I\\'m. Je kunt ook meerdere condities combineren. Bijvoorbeeld: F1 == V1 || F1 == V2. Normalerwijze worden alle operatoren van links naar rechts verwerkt. Dit kun je veranderen door ronde haken te gebruiken. Bijvoorbeeld: F1 == V1 && ( F2 == V2 || F2 == V3 ). Je kunt ook met regex in tekstvelden zoeken. Bijvoorbeeld: F1 == /Tes.*/i", + "fullname": "Volledige naam", + "header-logo-title": "Ga terug naar jouw borden pagina.", + "hide-system-messages": "Verberg systeemberichten", + "headerBarCreateBoardPopup-title": "Bord aanmaken", + "home": "Voorpagina", + "import": "Importeer", + "impersonate-user": "Doe als gebruiker", "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", - "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV data here", - "import-map-members": "Map members", - "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select member", - "info": "Version", - "initials": "Initials", - "invalid-date": "Invalid date", - "invalid-time": "Invalid time", - "invalid-user": "Invalid user", - "joined": "joined", - "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", - "label-create": "Create Label", - "label-default": "%s label (default)", - "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "import-board": "Importeer bord", + "import-board-c": "Importeer bord", + "import-board-title-trello": "Importeer bord vanuit Trello", + "import-board-title-wekan": "Importeer bord vanuit eerdere export", + "import-board-title-csv": "Importeer bord van CSV/TSV", + "from-trello": "Vanuit Trello", + "from-wekan": "Vanuit eerdere export", + "from-csv": "Van CSV/TSV", + "import-board-instruction-trello": "Op jouw Trello bord, ga naar 'Menu', dan naar 'Meer', 'Print en Exporteer', 'Exporteer JSON', en kopieer de tekst.", + "import-board-instruction-csv": "Plak hier je Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "Ga op je bord naar 'Menu' en klik dan 'Export board' en kopieer de tekst in het gedownloade bestand.", + "import-board-instruction-about-errors": "Als je tijdens de import van het bord foutmeldingen krijgt is de import soms toch gelukt en vind je het bord terug op de 'Alle borden' scherm.", + "import-json-placeholder": "Plak geldige JSON data hier", + "import-csv-placeholder": "Plak hier je geldige CSV/TSV data", + "import-map-members": "Breng leden in kaart", + "import-members-map": "Je geïmporteerde bord heeft een aantal leden. Koppel de leden die je wilt importeren aan je gebruikers.", + "import-members-map-note": "Let op: Niet gekoppelde leden worden toegewezen aan de huidige gebruiker.", + "import-show-user-mapping": "Breng leden overzicht tevoorschijn", + "import-user-select": "Kies een bestaande gebruiker die je als dit lid wilt koppelen", + "importMapMembersAddPopup-title": "Kies lid", + "info": "Versie", + "initials": "Initialen", + "invalid-date": "Ongeldige datum", + "invalid-time": "Ongeldige tijd", + "invalid-user": "Ongeldige gebruiker", + "joined": "doet nu mee met", + "just-invited": "Je bent zojuist uitgenodigd om mee toen doen aan dit bord", + "keyboard-shortcuts": "Toetsenbord snelkoppelingen", + "label-create": "Label aanmaken", + "label-default": "%s label (standaard)", + "label-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal het label van alle kaarten verwijderen met de bijbehorende historie.", "labels": "Labels", - "language": "Language", - "last-admin-desc": "You can’t change roles because there must be at least one admin.", - "leave-board": "Leave Board", - "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", - "leaveBoardPopup-title": "Leave Board ?", - "link-card": "Link to this card", - "list-archive-cards": "Move all cards in this list to Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "listMorePopup-title": "More", - "link-list": "Link to this list", - "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", - "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", - "lists": "Lists", + "language": "Taal", + "last-admin-desc": "Je kunt de permissies niet wijzigen omdat er minimaal een administrator moet zijn.", + "leave-board": "Verlaat bord", + "leave-board-pop": "Weet je zeker dat je __boardTitle__ wilt verlaten? Je wordt verwijderd van alle kaarten binnen dit bord", + "leaveBoardPopup-title": "Bord verlaten?", + "link-card": "Link naar deze kaart", + "list-archive-cards": "Verplaats alle kaarten in deze lijst naar Archief", + "list-archive-cards-pop": "Dit zal alle kaarten uit deze lijst op dit bord verwijderen. Om de kaarten in het Archief te tonen en terug te halen, klik \"Menu\" > \"Archief\".", + "list-move-cards": "Verplaats alle kaarten in deze lijst", + "list-select-cards": "Selecteer alle kaarten in deze lijst", + "set-color-list": "Wijzig kleur in", + "listActionPopup-title": "Lijst acties", + "settingsUserPopup-title": "Gebruiker Instellingen", + "settingsTeamPopup-title": "Team Instellingen", + "settingsOrgPopup-title": "Organisatie Instellingen", + "swimlaneActionPopup-title": "Swimlane acties", + "swimlaneAddPopup-title": "Swimlane hieronder toevoegen", + "listImportCardPopup-title": "Importeer een Trello kaart", + "listImportCardsTsvPopup-title": "Importeer Excel CSV/TSV", + "listMorePopup-title": "Meer", + "link-list": "Link naar deze lijst", + "list-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed, en je zult deze niet meer kunnen herstellen. Er is geen herstelmogelijkheid.", + "list-delete-suggest-archive": "Je kunt een lijst naar Archief verplaatsen om die van het bord te verwijderen waarbij de activiteiten behouden blijven.", + "lists": "Lijsten", "swimlanes": "Swimlanes", - "log-out": "Log Out", - "log-in": "Log In", - "loginPopup-title": "Log In", - "memberMenuPopup-title": "Member Settings", - "members": "Members", + "log-out": "Uitloggen", + "log-in": "Inloggen", + "loginPopup-title": "Inloggen", + "memberMenuPopup-title": "Leden Instellingen", + "members": "Leden", "menu": "Menu", - "move-selection": "Move selection", - "moveCardPopup-title": "Move Card", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for selection", - "multi-selection-on": "Multi-Selection is on", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", - "my-boards": "My Boards", - "name": "Name", - "no-archived-cards": "No cards in Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", - "optional": "optional", - "or": "or", - "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", - "page-not-found": "Page not found.", - "password": "Password", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", - "private": "Private", - "private-desc": "This board is private. Only people added to the board can view and edit it.", - "profile": "Profile", - "public": "Public", - "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", - "quick-access-description": "Star a board to add a shortcut in this bar.", - "remove-cover": "Remove Cover", - "remove-from-board": "Remove from Board", - "remove-label": "Remove Label", - "listDeletePopup-title": "Delete List ?", - "remove-member": "Remove Member", - "remove-member-from-card": "Remove from Card", - "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", - "removeMemberPopup-title": "Remove Member?", - "rename": "Rename", - "rename-board": "Rename Board", - "restore": "Restore", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autocomplete emoji", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", - "show-cards-minimum-count": "Show cards count if list contains more than", - "sidebar-open": "Open Sidebar", - "sidebar-close": "Close Sidebar", - "signupPopup-title": "Create an Account", - "star-board-title": "Click to star this board. It will show up at top of your boards list.", - "starred-boards": "Starred Boards", - "starred-boards-description": "Starred boards show up at the top of your boards list.", - "subscribe": "Subscribe", + "move-selection": "Verplaats selectie", + "moveCardPopup-title": "Verplaats kaart", + "moveCardToBottom-title": "Verplaats naar beneden", + "moveCardToTop-title": "Verplaats naar boven", + "moveSelectionPopup-title": "Verplaats selectie", + "multi-selection": "Multi-selectie", + "multi-selection-label": "Stel label voor selectie in", + "multi-selection-member": "Stel lid voor selectie in", + "multi-selection-on": "Multi-selectie staat aan", + "muted": "Stil", + "muted-info": "Je zal nooit meer geïnformeerd worden bij wijzigingen op in dit bord.", + "my-boards": "Mijn Borden", + "name": "Naam", + "no-archived-cards": "Geen kaarten in Archief.", + "no-archived-lists": "Geen lijsten in Archief..", + "no-archived-swimlanes": "Geen swimlanes in Archief.", + "no-results": "Geen resultaten", + "normal": "Normaal", + "normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.", + "not-accepted-yet": "Uitnodiging nog niet geaccepteerd", + "notify-participate": "Ontvang updates van elke kaart die je hebt aangemaakt of lid van bent", + "notify-watch": "Ontvang updates van elke bord, lijst of kaart die je bekijkt.", + "optional": "optioneel", + "or": "of", + "page-maybe-private": "Deze pagina is privé. Je kan het bekijken door <a href='%s'>in te loggen</a>.", + "page-not-found": "Pagina niet gevonden.", + "password": "Wachtwoord", + "paste-or-dragdrop": "Om te plakken, of slepen & neer te laten (alleen afbeeldingen)", + "participating": "Deelnemen", + "preview": "Voorbeeld", + "previewAttachedImagePopup-title": "Voorbeeld", + "previewClipboardImagePopup-title": "Voorbeeld", + "private": "Privé", + "private-desc": "Dit bord is privé. Alleen gebruikers die toegevoegd zijn aan het bord kunnen het bekijken en wijzigen.", + "profile": "Profiel", + "public": "Openbaar", + "public-desc": "Dit bord is openbaar. Het is zichtbaar voor iedereen met de link en zal tevoorschijn komen op zoekmachines zoals Google. Alleen gebruikers die toegevoegd zijn aan het bord kunnen het wijzigen.", + "quick-access-description": "Maak een bord favoriet om een snelkoppeling toe te voegen aan deze balk.", + "remove-cover": "Verwijder Cover", + "remove-from-board": "Verwijder van bord", + "remove-label": "Verwijder label", + "listDeletePopup-title": "Lijst verwijderen?", + "remove-member": "Verwijder lid", + "remove-member-from-card": "Verwijder van kaart", + "remove-member-pop": "Verwijder __name__ (__username__) van __boardTitle__? Het lid zal verwijderd worden van alle kaarten op dit bord, en zal een notificatie ontvangen.", + "removeMemberPopup-title": "Lid verwijderen?", + "rename": "Hernoem", + "rename-board": "Hernoem bord", + "restore": "Herstel", + "save": "Opslaan", + "search": "Zoek", + "rules": "Regels", + "search-cards": "Zoek in kaart/lijst, titels, beschrijvingen en maatwerkvelden op dit bord", + "search-example": "Schijf je zoektekst en toets Enter", + "select-color": "Selecteer kleur", + "select-board": "Selecteer Bord", + "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst", + "setWipLimitPopup-title": "Zet een WIP limiet", + "shortcut-assign-self": "Voeg jezelf toe aan huidige kaart", + "shortcut-autocomplete-emoji": "Emojis automatisch aanvullen", + "shortcut-autocomplete-members": "Leden automatisch aanvullen", + "shortcut-clear-filters": "Wis alle filters", + "shortcut-close-dialog": "Sluit dialoog", + "shortcut-filter-my-cards": "Filter mijn kaarten", + "shortcut-show-shortcuts": "Haal lijst met snelkoppelingen tevoorschijn", + "shortcut-toggle-filterbar": "Schakel Filter Zijbalk in/uit", + "shortcut-toggle-searchbar": "Schakel Zoek Zijbalk in/uit", + "shortcut-toggle-sidebar": "Schakel Bord Zijbalk in/uit", + "show-cards-minimum-count": "Laat het aantal kaarten zien wanneer de lijst meer kaarten heeft dan", + "sidebar-open": "Open Zijbalk", + "sidebar-close": "Sluit Zijbalk", + "signupPopup-title": "Maak een account aan", + "star-board-title": "Klik om dit bord favoriet te maken, waarna het bovenaan getoond wordt in je bordenlijst.", + "starred-boards": "Favoriete Borden", + "starred-boards-description": "Favoriete borden worden bovenaan getoond op je bordenlijst.", + "subscribe": "Abonneer", "team": "Team", - "this-board": "this board", - "this-card": "this card", - "spent-time-hours": "Spent time (hours)", - "overtime-hours": "Overtime (hours)", - "overtime": "Overtime", - "has-overtime-cards": "Has overtime cards", - "has-spenttime-cards": "Has spent time cards", - "time": "Time", - "title": "Title", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "this-board": "dit bord", + "this-card": "deze kaart", + "spent-time-hours": "Gespendeerde tijd (in uren)", + "overtime-hours": "Overwerk (in uren)", + "overtime": "Overwerk", + "has-overtime-cards": "Heeft kaarten met overwerk", + "has-spenttime-cards": "Heeft tijd besteed aan kaarten", + "time": "Tijd", + "title": "Titel", + "toggle-labels": "Schakel labels 1-9 in/uit voor kaart. Multi-selectie voegt labels 1-9 toe.", + "remove-labels-multiselect": "Multi-selectie verwijderd labels 1-9", + "tracking": "Volgen", + "tracking-info": "Je wordt op de hoogte gesteld als er wijzigingen zijn aan de kaarten waar je lid of maker van bent.", "type": "Type", - "unassign-member": "Unassign member", - "unsaved-description": "You have an unsaved description.", - "unwatch": "Unwatch", + "unassign-member": "Lid verwijderen", + "unsaved-description": "Je hebt een niet opgeslagen beschrijving.", + "unwatch": "Niet bekijken", "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", - "welcome-swimlane": "Milestone 1", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "what-to-do": "What do you want to do?", - "wipLimitErrorPopup-title": "Invalid WIP Limit", - "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", - "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", - "admin-panel": "Admin Panel", - "settings": "Settings", - "people": "People", - "registration": "Registration", - "disable-self-registration": "Disable Self-Registration", - "disable-forgot-password": "Disable Forgot Password", - "invite": "Invite", - "invite-people": "Invite People", - "to-boards": "To board(s)", - "email-addresses": "Email Addresses", - "smtp-host-description": "The address of the SMTP server that handles your emails.", - "smtp-port-description": "The port your SMTP server uses for outgoing emails.", - "smtp-tls-description": "Enable TLS support for SMTP server", + "upload-avatar": "Upload een avatar", + "uploaded-avatar": "Avatar is geüpload", + "custom-top-left-corner-logo-image-url": "URL Voor Maatwerk Logo Afbeelding In Linker Bovenhoek ", + "custom-top-left-corner-logo-link-url": "URL Voor Maatwerk Logo Link In Linker Bovenhoek", + "custom-top-left-corner-logo-height": "Hoogte Van Maatwerk Logo In Linker Bovenhoek. Default: 27", + "custom-login-logo-image-url": "URL Voor Maatwerk Login Logo Afbeelding", + "custom-login-logo-link-url": "URL Voor Maatwerk Login Logo Link", + "text-below-custom-login-logo": "Tekst onder Maatwerk Login Logo", + "automatic-linked-url-schemes": "Maatwerk URL-schema's die automatisch klikbaar zouden moeten zijn. Een URL per regel.", + "username": "Gebruikersnaam", + "import-usernames": "Importeer Gebruikersnamen", + "view-it": "Bekijk het", + "warn-list-archived": "Let op: deze kaart zit in gearchiveerde lijst", + "watch": "Bekijk", + "watching": "Bekijken", + "watching-info": "Je zal op de hoogte worden gesteld als er een wijziging plaatsvind op dit bord.", + "welcome-board": "Welkom Bord", + "welcome-swimlane": "Mijlpaal 1", + "welcome-list1": "Basis", + "welcome-list2": "Geadvanceerd", + "card-templates-swimlane": "Kaart Templates", + "list-templates-swimlane": "Lijst Templates", + "board-templates-swimlane": "Bord Templates", + "what-to-do": "Wat wil je doen?", + "wipLimitErrorPopup-title": "Ongeldige WIP limiet", + "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet ", + "wipLimitErrorPopup-dialog-pt2": "Verwijder een aantal taken uit deze lijst, of zet de WIP limiet hoger", + "admin-panel": "Administrator paneel", + "settings": "Instellingen", + "people": "Gebruikers", + "registration": "Registratie", + "disable-self-registration": "Schakel zelf-registratie uit", + "disable-forgot-password": "Uitschakelen Wachtwoord Vergeten", + "invite": "Uitnodigen", + "invite-people": "Nodig mensen uit", + "to-boards": "Voor bord(en)", + "email-addresses": "E-mailadressen", + "smtp-host-description": "Het adres van de SMTP server die e-mails zal versturen.", + "smtp-port-description": "De poort van de SMTP server wordt gebruikt voor uitgaande e-mails.", + "smtp-tls-description": "Gebruik TLS ondersteuning voor SMTP server.", "smtp-host": "SMTP Host", - "smtp-port": "SMTP Port", - "smtp-username": "Username", - "smtp-password": "Password", - "smtp-tls": "TLS support", - "send-from": "From", - "send-smtp-test": "Send a test email to yourself", - "invitation-code": "Invitation Code", - "email-invite-register-subject": "__inviter__ sent you an invitation", - "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "smtp-port": "SMTP Poort", + "smtp-username": "Gebruikersnaam", + "smtp-password": "Wachtwoord", + "smtp-tls": "TLS ondersteuning", + "send-from": "Van", + "send-smtp-test": "Verzend een test email naar jezelf", + "invitation-code": "Uitnodigings code", + "email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd", + "email-invite-register-text": "Beste __user__,\n\n__inviter__ nodigt je uit voor een Kanban-bord om samen te werken.\n\nHet bord vind je via onderstaande link:\n__url__\n\nJe uitnodigingscode is: __icode__\n\nBedankt en tot ziens.", "email-smtp-test-subject": "SMTP Test Email", - "email-smtp-test-text": "You have successfully sent an email", - "error-invitation-code-not-exist": "Invitation code doesn't exist", - "error-notAuthorized": "You are not authorized to view this page.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", + "email-smtp-test-text": "Je hebt met succes een email verzonden", + "error-invitation-code-not-exist": "Uitnodigings code bestaat niet", + "error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.", + "webhook-title": "Webhook Naam", + "webhook-token": "Token (Optioneel voor Authenticatie)", + "outgoing-webhooks": "Uitgaande Webhooks", + "bidirectional-webhooks": "Twee-Weg Webhooks", + "outgoingWebhooksPopup-title": "Uitgaande Webhooks", + "boardCardTitlePopup-title": "Kaarttitel Filter", + "disable-webhook": "Schakel deze Webhook uit", + "global-webhook": "Globale Webhooks", + "new-outgoing-webhook": "Nieuwe uitgaande webhook", + "no-name": "(Onbekend)", + "Node_version": "Node versie", + "Meteor_version": "Meteor versie", + "MongoDB_version": "MongoDB versie", "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "MongoDB_Oplog_enabled": "MongoDB Oplog ingeschakeld", "OS_Arch": "OS Arch", "OS_Cpus": "OS CPU Count", - "OS_Freemem": "OS Free Memory", - "OS_Loadavg": "OS Load Average", + "OS_Freemem": "OS Vrij Geheugen", + "OS_Loadavg": "OS Gemiddelde Belasting", "OS_Platform": "OS Platform", - "OS_Release": "OS Release", - "OS_Totalmem": "OS Total Memory", + "OS_Release": "OS Versie", + "OS_Totalmem": "OS Totaal Geheugen", "OS_Type": "OS Type", "OS_Uptime": "OS Uptime", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", + "days": "dagen", + "hours": "uren", + "minutes": "minuten", + "seconds": "seconden", + "show-field-on-card": "Toon dit veld op kaart", + "automatically-field-on-card": "Veld toe aan nieuwe kaarten toevoegen", + "always-field-on-card": "Veld toe aan alle kaarten toevoegen", + "showLabel-field-on-card": "Toon veldnaam op minikaart", + "showSum-field-on-list": "Toon totaal van velden bovenaan lijst", + "yes": "Ja", + "no": "Nee", "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode": "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified at", - "verified": "Verified", - "active": "Active", - "card-received": "Received", - "card-received-on": "Received on", - "card-end": "End", - "card-end-on": "Ends on", - "editCardReceivedDatePopup-title": "Change received date", - "editCardEndDatePopup-title": "Change end date", - "setCardColorPopup-title": "Set color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", - "description-on-minicard": "Description on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", + "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe", + "accounts-allowUserNameChange": "Sta Gebruikersnaam wijzigingen toe", + "tableVisibilityMode-allowPrivateOnly": "Zichtbaarheid borden: Sta alleen privé borden toe", + "tableVisibilityMode": "Zichtbaarheid borden", + "createdAt": "Aangemaakt op", + "modifiedAt": "Gewijzigd op", + "verified": "Geverifieerd", + "active": "Actief", + "card-received": "Ontvangen", + "card-received-on": "Ontvangen op", + "card-end": "Einde", + "card-end-on": "Eindigt op", + "editCardReceivedDatePopup-title": "Wijzig ontvangstdatum", + "editCardEndDatePopup-title": "Wijzig einddatum", + "setCardColorPopup-title": "Stel kleur in", + "setCardActionsColorPopup-title": "Kies een kleur", + "setSwimlaneColorPopup-title": "Kies een kleur", + "setListColorPopup-title": "Kies een kleur", + "assigned-by": "Toegewezen door", + "requested-by": "Aangevraagd door", + "card-sorting-by-number": "Kaarten sorteren op nummer", + "board-delete-notice": "Verwijdering kan niet ongedaan gemaakt worden. Je raakt alle met dit bord gerelateerde lijsten, kaarten en acties kwijt.", + "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid. ", + "boardDeletePopup-title": "Bord verwijderen?", + "delete-board": "Verwijder bord", + "default-subtasks-board": "Subtaken voor __board__ bord", + "default": "Standaard", + "queue": "Rij", + "subtask-settings": "Subtaak Instellingen", + "card-settings": "Kaart Instellingen", + "minicard-settings": "Minikaart Instellingen", + "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen", + "boardCardSettingsPopup-title": "Kaart Instellingen", + "boardMinicardSettingsPopup-title": "Minikaart Instellingen", + "deposit-subtasks-board": "Plaats subtaken op dit bord:", + "deposit-subtasks-list": "Plaats subtaken in deze lijst:", + "show-parent-in-minicard": "Toon bron in minikaart:", + "description-on-minicard": "Beschrijving op minikaart", + "prefix-with-full-path": "Prefix met volledig pad", + "prefix-with-parent": "Prefix met bron", + "subtext-with-full-path": "Subtekst met volledig pad", + "subtext-with-parent": "Subtekst met bron", + "change-card-parent": "Wijzig bron van kaart", + "parent-card": "Bronkaart", + "source-board": "Bronbord", + "no-parent": "Toon bron niet", + "activity-added-label": "label toegevoegd '%s' aan %s", + "activity-removed-label": "label verwijderd '%s' van %s", + "activity-delete-attach": "een bijlage verwijderd van %s", + "activity-added-label-card": "label toegevoegd '%s'", + "activity-removed-label-card": "label verwijderd '%s'", + "activity-delete-attach-card": "een bijlage verwijderd", + "activity-set-customfield": "wijzig maatwerkveld '%s' naar '%s' in %s", + "activity-unset-customfield": "wijzig maatwerkveld '%s' in %s", + "r-rule": "Regel", + "r-add-trigger": "Signaal toevoegen", + "r-add-action": "Actie toevoegen", + "r-board-rules": "Bord regels", + "r-add-rule": "Regel toevoegen", + "r-view-rule": "Toon regel", + "r-delete-rule": "Verwijder regel", + "r-new-rule-name": "Nieuwe regelnaam", + "r-no-rules": "Geen regels", + "r-trigger": "Signaal", + "r-action": "Actie", + "r-when-a-card": "Als een kaart", "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "list": "List", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", + "r-is-moved": "is verplaatst", + "r-added-to": "Toegevoegd aan", + "r-removed-from": "Verwijderd van", + "r-the-board": "het bord", + "r-list": "lijst", + "list": "Lijst", + "set-filter": "Definieer Filter", + "r-moved-to": "verplaatst naar", + "r-moved-from": "verplaatst van", + "r-archived": "Verplaatst naar Archief", + "r-unarchived": "Teruggehaald uit Archief", + "r-a-card": "een kaart", + "r-when-a-label-is": "Als een label is", + "r-when-the-label": "Als het label", + "r-list-name": "lijstnaam", + "r-when-a-member": "Als een lid is", + "r-when-the-member": "Als het lid", + "r-name": "naam", + "r-when-a-attach": "Als een bijlage", + "r-when-a-checklist": "Als een checklist is", + "r-when-the-checklist": "Als de checklist", + "r-completed": "Afgewerkt", + "r-made-incomplete": "Onafgewerkt gemaakt", + "r-when-a-item": "Als een checklist item is", + "r-when-the-item": "Als het checklist item", + "r-checked": "Aangevinkt", + "r-unchecked": "Uitgevinkt", + "r-move-card-to": "Verplaats kaart naar", + "r-top-of": "Bovenste van", + "r-bottom-of": "Onderste van", + "r-its-list": "zijn lijst", + "r-archive": "Verplaats naar Archief", + "r-unarchive": "Terughalen uit Archief", + "r-card": "kaart", + "r-add": "Toevoegen", + "r-remove": "Verwijder", "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", + "r-member": "lid", + "r-remove-all": "Verwijder alle leden van de kaart", + "r-set-color": "Wijzig kleur naar", "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", + "r-check-all": "Vink alles aan", + "r-uncheck-all": "Vink alles uit", + "r-items-check": "items van checklist", + "r-check": "Vink aan", + "r-uncheck": "Vink uit", "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", + "r-of-checklist": "van checklist", + "r-send-email": "Verzend een email", + "r-to": "naar", + "r-of": "van", + "r-subject": "onderwerp", + "r-rule-details": "Regel details", + "r-d-move-to-top-gen": "Verplaats kaart helemaal naar boven op de lijst", + "r-d-move-to-top-spec": "Verplaats kaart naar bovenaan op lijst", + "r-d-move-to-bottom-gen": "Verplaats kaart naar onderaan op de lijst", + "r-d-move-to-bottom-spec": "Verplaats kaart naar onderaan op lijst", + "r-d-send-email": "Verzend email", + "r-d-send-email-to": "naar", + "r-d-send-email-subject": "onderwerp", + "r-d-send-email-message": "bericht", + "r-d-archive": "Verplaats kaart naar Archief", + "r-d-unarchive": "Haal kaart terug uit Archief", + "r-d-add-label": "Label toevoegen", + "r-d-remove-label": "Verwijder label", + "r-create-card": "Maak nieuwe kaart aan", + "r-in-list": "van lijst", "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value.", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", + "r-d-add-member": "Lid toevoegen", + "r-d-remove-member": "Verwijder lid", + "r-d-remove-all-member": "Verwijder alle leden", + "r-d-check-all": "Vink alle items van een lijst aan", + "r-d-uncheck-all": "Vink alle items van een lijst uit", + "r-d-check-one": "Vink item aan", + "r-d-uncheck-one": "Vink item uit", + "r-d-check-of-list": "van checklist", + "r-d-add-checklist": "Checklist toevoegen", + "r-d-remove-checklist": "Verwijder checklist", + "r-by": "door", + "r-add-checklist": "Checklist toevoegen", + "r-with-items": "met items", + "r-items-list": "item1, item2, item3", + "r-add-swimlane": "Swimlane toevoegen", + "r-swimlane-name": "Swimlane-naam", + "r-board-note": "Let op: laat een veld leeg om er niet op te selecteren", + "r-checklist-note": "Let op: checklist items moeten geschreven worden als kommagescheiden waarden.", + "r-when-a-card-is-moved": "Als een kaart is verplaatst naar een andere lijst", + "r-set": "Wijzig", + "r-update": "Bijwerken", + "r-datefield": "datumveld", + "r-df-start-at": "begin", + "r-df-due-at": "verval", + "r-df-end-at": "einde", + "r-df-received-at": "ontvangen", + "r-to-current-datetime": "naar huidige datum/tijd", + "r-remove-value-from": "Verwijder waarde van", "ldap": "LDAP", "oauth2": "OAuth2", "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "add-custom-html-after-body-start": "Add Custom HTML after <body> start", - "add-custom-html-before-body-end": "Add Custom HTML before </body> end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "org-number": "The number of organizations is:", - "team-number": "The number of teams is:", - "people-number": "The number of people is:", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", - "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", + "authentication-method": "Authenticatiemethode", + "authentication-type": "Authenticatietype", + "custom-product-name": "Eigen Productnaam", + "layout": "Lay-out", + "hide-logo": "Verberg Logo", + "add-custom-html-after-body-start": "Voeg eigen HTML toe na <body> start", + "add-custom-html-before-body-end": "Voeg eigen HTML toe voor </body> einde", + "error-undefined": "Er is iets misgegaan", + "error-ldap-login": "Er is een fout opgetreden tijdens het inloggen", + "display-authentication-method": "Toon Authenticatiemethode", + "oidc-button-text": "Pas de OIDC-button tekst aan.", + "default-authentication-method": "Standaard Authenticatiemethode", + "duplicate-board": "Dupliceer Bord", + "org-number": "Het aantal organisaties is:", + "team-number": "Het aantal teams is:", + "people-number": "Het aantal gebruikers is:", + "swimlaneDeletePopup-title": "Swimlane verwijderen?", + "swimlane-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed en je kunt de swimlane niet terughalen. Er is geen herstelmogelijkheid.", + "restore-all": "Haal alles terug", + "delete-all": "Verwijder alles", + "loading": "Laden, even geduld.", + "previous_as": "laatste keer was", + "act-a-dueAt": "heeft vervaldatum gewijzigd naar \nOp: __timeValue__\nKaart: __card__\noude vervaldatum was __timeOldValue__", + "act-a-endAt": "heeft einddatum gewijzigd naar __timeValue__ van (__timeOldValue__)", + "act-a-startAt": "heeft begindatum gewijzigd naar __timeValue__ van (__timeOldValue__)", + "act-a-receivedAt": "heeft ontvangstdatum gewijzigd naar __timeValue__ van (__timeOldValue__)", + "a-dueAt": "vervaldatum gewijzigd naar", + "a-endAt": "einddatum gewijzigd naar", + "a-startAt": "begindatum gewijzigd naar", + "a-receivedAt": "ontvangstdatum gewijzigd naar", + "almostdue": "huidige vervaldatum %s nadert", + "pastdue": "huidige vervaldatum %s is verlopen", + "duenow": "huidige vervaldatum %s is vandaag", + "act-newDue": "__list__/__card__ heeft eerste vervaldatum herinnering [__board__]", + "act-withDue": "__list__/__card__ vervaldatum herinneringen [__board__]", + "act-almostdue": "wil je herinneren aan het naderen van de huidige vervaldatum (__timeValue__) van __card__ ", + "act-pastdue": "wil je herinneren aan het verlopen van de huidige vervaldatum (__timeValue__) van __card__ ", + "act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__ ", + "act-atUserComment": "Je werd genoemd in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.", + "delete-team-confirm-popup": "Weet je zeker dat je dit team wilt verwijderen? Er is geen herstelmogelijkheid.", + "delete-org-confirm-popup": "Weet je zeker dat je deze organisatie wilt verwijderen? Er is geen herstelmogelijkheid.", + "accounts-allowUserDelete": "Sta gebruikers toe om hun eigen account te verwijderen", + "hide-minicard-label-text": "Verberg minikaart labeltekst", + "show-desktop-drag-handles": "Toon sleep gereedschap op werkblad", + "assignee": "Toegewezen aan", + "cardAssigneesPopup-title": "Toegewezen aan", + "addmore-detail": "Voeg een meer gedetailleerde beschrijving toe", + "show-on-card": "Toon op kaart", + "show-on-minicard": "Toon op Minikaart", + "new": "Nieuw", + "editOrgPopup-title": "Wijzig organisatie", + "newOrgPopup-title": "Nieuwe organisatie", + "editTeamPopup-title": "Wijzig Team", + "newTeamPopup-title": "Nieuw Team", + "editUserPopup-title": "Wijzig gebruiker", + "newUserPopup-title": "Nieuwe gebruiker", + "notifications": "Meldingen", + "view-all": "Bekijk alles", + "filter-by-unread": "Filter op Ongelezen", + "mark-all-as-read": "Markeer alles als gelezen", + "remove-all-read": "verwijder alle gelezen", + "allow-rename": "Sta Hernoemen toe", + "allowRenamePopup-title": "Sta Hernoemen toe", + "start-day-of-week": "Stel eerste dag van de week in op", + "monday": "Maandag", + "tuesday": "Dinsdag", + "wednesday": "Woensdag", + "thursday": "Donderdag", + "friday": "Vrijdag", + "saturday": "Zaterdag", + "sunday": "Zondag", "status": "Status", "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "task": "Task", - "create-task": "Create Task", + "owner": "Eigenaar", + "last-modified-at": "Laatste wijziging op", + "last-activity": "Laatste activiteit", + "voting": "Stemmen", + "archived": "Gearchiveerd", + "delete-linked-card-before-this-card": "Je kunt deze kaart niet verwijderen voordat de gekoppelde kaart is verwijderd ", + "delete-linked-cards-before-this-list": "Je kunt deze lijst niet verwijderen voordat de gekoppelde kaarten verwijderd zijn die verwijzen naar kaarten in deze lijst", + "hide-checked-items": "Verberg aangevinkte items", + "task": "Taak", + "create-task": "Taak aanmaken", "ok": "OK", - "organizations": "Organizations", + "organizations": "Organisaties", "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", + "displayName": "Schermnaam", + "shortName": "Korte naam", "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "board": "Board", + "person": "Persoon", + "my-cards": "Mijn kaarten", + "card": "Kaart", + "board": "Bord", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", + "myCardsViewChange-title": "Mijn Kaarten Overzicht", + "myCardsViewChangePopup-title": "Mijn Kaarten Overzicht", + "myCardsViewChange-choice-boards": "Borden", + "myCardsViewChange-choice-table": "Tabel", + "myCardsSortChange-title": "Mijn kaarten sortering", + "myCardsSortChangePopup-title": "Mijn kaarten sortering", + "myCardsSortChange-choice-board": "Naar bord", + "myCardsSortChange-choice-dueat": "Naar vervaldatum", + "dueCards-title": "Achterstallige kaarten", + "dueCardsViewChange-title": "Achterstallige kaart view", + "dueCardsViewChangePopup-title": "Achterstallige kaart view", + "dueCardsViewChange-choice-me": "Mij", + "dueCardsViewChange-choice-all": "Alle gebruikers", + "dueCardsViewChange-choice-all-description": "Toon incomplete kaarten met een *achterstallige* datum van borden waarvoor de gebruiker toegang heeft.", + "broken-cards": "Defecte kaarten", + "board-title-not-found": "Bord '%s' niet gevonden.", + "swimlane-title-not-found": "Swimlane '%s' niet gevonden.", + "list-title-not-found": "Lijst '%s' niet gevonden", + "label-not-found": "Label '%s' is niet gevonden.", + "label-color-not-found": "Labelkleur %s niet gevonden.", + "user-username-not-found": "Gebruiker '%s' niet gevonden.", + "comment-not-found": "Kaart met tekst '%s' in aantekeningen niet gevonden.", + "org-name-not-found": "Organisatie '%s' niet gevonden.", + "team-name-not-found": "Team '%s' niet gevonden.", + "globalSearch-title": "Zoek op alle borden", + "no-cards-found": "Geen Kaarten Gevonden", + "one-card-found": "Een kaart gevonden", + "n-cards-found": "%s Kaarten Gevonden", + "n-n-of-n-cards-found": "__start__-__end__ van __total__ Kaarten Gevonden", + "operator-board": "bord", "operator-board-abbrev": "b", "operator-swimlane": "swimlane", "operator-swimlane-abbrev": "s", - "operator-list": "list", + "operator-list": "lijst", "operator-list-abbrev": "l", "operator-label": "label", "operator-label-abbrev": "#", - "operator-user": "user", + "operator-user": "Gebruiker", "operator-user-abbrev": "@", - "operator-member": "member", + "operator-member": "lid", "operator-member-abbrev": "m", - "operator-assignee": "assignee", + "operator-assignee": "toegewezen aan", "operator-assignee-abbrev": "a", - "operator-creator": "creator", + "operator-creator": "aangemaakt door", "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", + "operator-due": "verval", + "operator-created": "aangemaakt", + "operator-modified": "gewijzigd", + "operator-sort": "sorteer", + "operator-comment": "aantekening", + "operator-has": "heeft", + "operator-limit": "limiet", "operator-debug": "debug", "operator-org": "org", "operator-team": "team", - "predicate-archived": "archived", + "predicate-archived": "gearchiveerd", "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", + "predicate-ended": "beëindigd", + "predicate-all": "alles", + "predicate-overdue": "verlopen", "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", + "predicate-month": "maand", + "predicate-quarter": "kwartaal", + "predicate-year": "jaar", + "predicate-due": "verval", + "predicate-modified": "gewijzigd", + "predicate-created": "aangemaakt", + "predicate-attachment": "bijlage", + "predicate-description": "beschrijving", "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", + "predicate-start": "begin", + "predicate-end": "einde", + "predicate-assignee": "toegewezen aan", + "predicate-member": "lid", + "predicate-public": "openbaar", + "predicate-private": "privé", "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", + "predicate-projection": "weergave", + "operator-unknown-error": "%s is geen expressie", + "operator-number-expected": "expressie __operator__ verwachtte een getal maar kreeg '__value__'", + "operator-sort-invalid": "sortering op '%s' is ongeldig", + "operator-status-invalid": "'%s' is geen geldige status", + "operator-has-invalid": "%s is geen geldige aanwezigheidscontrole", + "operator-limit-invalid": "%s is geen geldig limiet. Een limiet moet een positief getal zijn.", + "operator-debug-invalid": "%s is geen geldig debug predikaat", + "next-page": "Volgende Pagina", + "previous-page": "Vorige Pagina", + "heading-notes": "Notities", + "globalSearch-instructions-heading": "Zoek Instructies", + "globalSearch-instructions-description": "Zoekacties kunnen expressies bevatten om het resultaat te verfijnen. Expressies worden gespecificeerd door de expressie-naam en de waarde, gescheiden door een dubbele punt. Voorbeeld, de expressie specificatie 'list:Blocked' moet het zoekresultaat limiteren tot alleen die kaarten uit een lijst met de naam *Blocked*. Als de waarde een speciaal karakter of spaties bevat dan moet deze tussen dubbele aanhalingstekens geschreven worden (bv. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Beschikbare expressies:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` -kaarten in borden die overeenkomen met *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` -kaarten in lijst die overeenkomen met *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` -kaarten in swimlanes die overeenkomen met *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` -kaarten met commentaar die bevat *<text>*", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - kaarten die een label hebben met *<color>* of *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - afkorting voor `__operator_label__:<color>` of `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - kaarten waar *<username>* is a *lid* or *actiehouder*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - afkorting voor `gebruiker:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - kaarten waar *<username>* een *lid* is", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - kaarten waar *<username>* een *actiehouder* is", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - kaarten die door *<username>* aangemaakt zijn", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - kaarten behorend bij een bord van organisatie *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - kaarten behorend bij een bord van team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - kaarten die achterstallig zijn *<n>* dagen vanaf nu. `__operator_due__:__predicate_overdue__ lists alle kaarten nu hun geplande datum.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - kaarten die zijn aangemaakt *<n>* dagen of minder geleden", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - kaarten die zijn bijgewerkt *<n>* dagen of minder geleden", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - waar *<status>* is één van de volgende:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - gearchiveerde kaarten", + "globalSearch-instructions-status-all": "`__predicate_all__` - alle gearchiveerde en niet gearchiveerde kaarten", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - kaarten met een einddatum", + "globalSearch-instructions-status-public": "`__predicate_public__` - kaarten alleen in publieke borden", + "globalSearch-instructions-status-private": "`__predicate_private__` - kaarten alleen in privé borden", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - waar *<field>* is één van `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` of `__predicate_member__`. Het plaatsen van `-` voor *<field>* zoekt naar het ontbreken van een waarde in dat veld (b.v. `has:-due` zoekt naar kaarten zonder een einddatum).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - waar *<sort-name>* is één van `__predicate_due__`, `__predicate_created__` of `__predicate_modified__`. Voor aflopende sortering, plaats een `-` voor de sorteernaam.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - waar *<n>* is een positief getal dat het aantal kaarten per pagina aanduidt.", + "globalSearch-instructions-notes-1": "Meerdere expressies mogen worden gespecificeerd.", + "globalSearch-instructions-notes-2": "Vergelijkbare expressies worden met de logische *OR* samengevoegd. Kaarten die aan een van de expressies voldoen worden als resultaat teruggegeven.\n`__operator_list__:Available __operator_list__:Blocked` geeft de kaarten die voorkomen in elke lijst met de naam *Blocked* of *Available*.", + "globalSearch-instructions-notes-3": "Uitsluitende expressies worden met de logische *AND* samengevoerd. Kaarten die aan alle expressies voldoen worden als resultaat teruggegeven. `__operator_list__:Available __operator_label__:rood` geeft alleen de kaarten in de lijst *Available* met een *rood* label.", + "globalSearch-instructions-notes-3-2": "Dagen kunnen worden aangegeven als een positief of negatief getal of gebruikmakende van `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` of `__predicate_year__` voor de huidige periode.", + "globalSearch-instructions-notes-4": "Zoeken in tekst is hoofdlettergevoelig.", + "globalSearch-instructions-notes-5": "Standaard worden gearchiveerde kaarten niet doorzocht.", + "link-to-search": "Link naar deze zoekactie", "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", + "number": "Aantal", + "label-colors": "Labelkleuren", + "label-names": "Labelnamen", + "archived-at": "gearchiveerd op", + "sort-cards": "Sorteer Kaarten", + "cardsSortPopup-title": "Sorteer Kaarten", + "due-date": "vervaldatum", + "server-error": "Server fout", + "server-error-troubleshooting": "Stuur aub de foutmelding van de server in.\nVoor een Snap installatie: 'sudo snap logs wekan.wekan'\nVoor een Docker installatie: 'sudo docker logs wekan-app'", + "title-alphabetically": "Titel (Alfabetisch)", + "created-at-newest-first": "Aangemaakt op (Nieuwste Eerst)", + "created-at-oldest-first": "Aangemaakt op (Oudste Eerst)", "links-heading": "Links", - "hide-system-messages-of-all-users": "Hide system messages of all users", - "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", + "hide-system-messages-of-all-users": "Verberg systeemberichten voor alle gebruikers", + "now-system-messages-of-all-users-are-hidden": "Systeemberichten zijn nu verborgen voor alle gebruikers", + "move-swimlane": "Verplaats Swimlane", + "moveSwimlanePopup-title": "Verplaats Swimlane", "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", + "custom-field-stringtemplate-format": "Format (gebruik %{waarde} als tijdelijke aanduiding)", + "custom-field-stringtemplate-separator": "Scheidingsteken (gebruik of   voor een spatie)", + "custom-field-stringtemplate-item-placeholder": "Druk op Enter om meer items toe te voegen", + "creator": "Aangemaakt door", + "filesReportTitle": "Bestanden Rapportage", + "reports": "Rapportages", + "rulesReportTitle": "Regels Rapportage", + "boardsReportTitle": "Borden Rapportage", + "cardsReportTitle": "Kaarten Rapportage", + "copy-swimlane": "Kopieer Swimlane", + "copySwimlanePopup-title": "Kopieer Swimlane", + "display-card-creator": "Toon Aanmaker Kaart", + "wait-spinner": "Wacht Spinner", + "Bounce": "Stuiterende Wacht Spinner", + "Cube": "Kubus Wacht Spinner", + "Cube-Grid": "Raster-Kubus Wacht Spinner", + "Dot": "Stip Wacht Spinner", + "Double-Bounce": "Dubbel Stuiterende Wacht Spinner", + "Rotateplane": "Roterend Vlak Wacht Spinner", + "Scaleout": "Vergrotende Wacht Spinner", + "Wave": "Golvende Wacht Spinner", + "maximize-card": "Maximaliseer Kaart", + "minimize-card": "Minimaliseer Kaart", + "delete-org-warning-message": "Kan deze organisatie niet verwijderen want er is nog minimaal 1 gebruiker lid van.", + "delete-team-warning-message": "Kan dit team niet verwijderen want er is nog minimaal 1 gebruiker lid van.", + "subject": "Onderwerp", "details": "Details", "carbon-copy": "Carbon Copy (Cc:)", "ticket": "Ticket", "tickets": "Tickets", - "ticket-number": "Ticket Number", + "ticket-number": "Ticketnummer", "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "pending": "In behandeling", + "closed": "Gesloten", + "resolved": "Opgelost", + "cancelled": "Geannuleerd", + "history": "Historie", + "request": "Verzoek", + "requests": "Verzoeken", + "help-request": "Hulpverzoek", + "editCardSortOrderPopup-title": "Wijzig Sortering", + "cardDetailsPopup-title": "Kaart Details", + "add-teams": "Teams toevoegen", + "add-teams-label": "Toegevoegde teams worden hieronder getoond:", + "remove-team-from-table": "Weet je zeker dat je dit team van het bord wilt verwijderen?", + "confirm-btn": "Bevestig", + "remove-btn": "Verwijder", + "filter-card-title-label": "Filter kaart op titel", + "invite-people-success": "Uitnodiging om te registreren succesvol verzonden", + "invite-people-error": "Fout tijdens het verzenden van de uitnodiging om te registreren", + "can-invite-if-same-mailDomainName": "Email domeinnaam", + "to-create-teams-contact-admin": "Zoek contact met de beheerder om teams aan te maken.", "Node_heap_total_heap_size": "Node heap: total heap size", "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", "Node_heap_total_physical_size": "Node heap: total physical size", @@ -1147,34 +1147,34 @@ "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", "Node_memory_usage_heap_used": "Node memory usage: actual memory used", "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title" + "add-organizations": "Organisaties toevoegen", + "add-organizations-label": "Toegevoegde organisaties worden hieronder getoond:", + "remove-organization-from-board": "Weet je zeker dat je deze organisatie van het bord wilt verwijderen?", + "to-create-organizations-contact-admin": "Zoek contact met de beheerder om organisaties aan te maken.", + "custom-legal-notice-link-url": "URL voor maatwerk juridische disclaimer tekst pagina", + "acceptance_of_our_legalNotice": "Als u doorgaat accepteert u onze ", + "legalNotice": "juridische disclaimer tekst", + "copied": "Gekopieerd!", + "checklistActionsPopup-title": "Checklist acties", + "moveChecklist": "Verplaats Checklist", + "moveChecklistPopup-title": "Verplaats Checklist", + "newlineBecomesNewChecklistItem": "Nieuwe regel wordt nieuw checklist item", + "copyChecklist": "Kopieer Checklist", + "copyChecklistPopup-title": "Kopieer Checklist", + "card-show-lists": "Kaart Toon Lijsten", + "subtaskActionsPopup-title": "Subtaak acties", + "attachmentActionsPopup-title": "Bijlage Acties", + "attachment-move-storage-fs": "Verplaats bijlage naar bestandssysteem", + "attachment-move-storage-gridfs": "Verplaats bijlage naar GridFS", + "attachment-move": "Verplaats Bijlage", + "move-all-attachments-to-fs": "Verplaats alle bijlagen naar bestandssysteem", + "move-all-attachments-to-gridfs": "Verplaats alle bijlagen naar GridFS", + "move-all-attachments-of-board-to-fs": "Verplaats alle bijlagen van bord naar bestandssysteem", + "move-all-attachments-of-board-to-gridfs": "Verplaats alle bijlagen van bord naar GridFS", + "path": "Pad", + "version-name": "Versie-Naam", + "size": "Grootte", + "storage": "Opslag", + "action": "Actie", + "board-title": "Bord Titel" } \ No newline at end of file From 5a3778fd5a83c282da09133c2933608643cdbe0c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:33:51 +0300 Subject: [PATCH 092/246] Updated translations. --- imports/i18n/data/pl-PL.i18n.json | 2140 ++++++++++++++--------------- 1 file changed, 1070 insertions(+), 1070 deletions(-) diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json index a25f0dc38..77dc487de 100644 --- a/imports/i18n/data/pl-PL.i18n.json +++ b/imports/i18n/data/pl-PL.i18n.json @@ -1,203 +1,203 @@ { - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "accept": "Akceptuj", + "act-activity-notify": "Powiadomienia o aktywności", + "act-addAttachment": "dodał załącznik __attachment__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-deleteAttachment": "usunął załącznik __attachment__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addSubtask": "dodał podzadanie __subtask__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addLabel": "dodał etykietę __label__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addedLabel": "dodał etykietę __label__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-removeLabel": "usunął etykietę __label__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-removedLabel": "usunął etykietę __label__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addChecklist": "dodał czeklistę __checklist__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addChecklistItem": "dodał element __checklistItem__ do czeklisty __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-removeChecklist": "usunął czeklistę __checklist__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-removeChecklistItem": "usunął element __checklistItem__ z czeklisty __checkList__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-checkedItem": "zaznaczył(a) __checklistItem__ na czekliście __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-uncheckedItem": "odznaczył(a) __checklistItem__ na czekliście __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-completeChecklist": "wykonał(a) wszystkie elementy z czeklisty __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-uncompleteChecklist": "wycofał(a) ukończenie wykonania czeklisty __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-addComment": "dodał komentarz na karcie __card__: __comment__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-editComment": "edytował(a) komentarz na karcie __card__: __comment__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-deleteComment": "usunął komentarz na karcie __card__: __comment__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-createBoard": "utworzył(a) tablicę __board__", + "act-createSwimlane": "utworzył(a) ścieżkę __swimlane__ na tablicy __board__", + "act-createCard": "utworzył(a) kartę __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-createCustomField": "utworzył(a) niestandardowe pole __customField__ na tablicy __board__", + "act-deleteCustomField": "usunął niestandardowe pole __customField__ na tablicy __board__", + "act-setCustomField": "zmienił(a) niestandardowe pole __customField__: __customFieldValue__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-createList": "dodał listę __list__ do tablicy __board__", + "act-addBoardMember": "dodał użytkownika __member__ do tablicy __board__", + "act-archivedBoard": "Tablica __board__ została przeniesiona do Archiwum", + "act-archivedCard": "przeniósł kartę __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__ do Archiwum", + "act-archivedList": "przeniósł listę __list__ na ścieżce __swimlane__ na tablicy __board__ do Archiwum", + "act-archivedSwimlane": "przeniósł ścieżkę __swimlane__ na tablicy __board__ do Archiwum", + "act-importBoard": "zaimportował(a) tablicę __board__", + "act-importCard": "zaimportował(a) kartę __card__ do listy __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-importList": "zaimportował(a) listę __list__ do ścieżki __swimlane__ na tablicy __board__", + "act-joinMember": "dodał użytkownika __member__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-moveCard": "przeniósł kartę __card__ na tablicy __board__ z listy __oldList__ na ścieżce __oldSwimlane__ na listę __list__ na ścieżce __swimlane__", + "act-moveCardToOtherBoard": "przeniósł kartę __card__ z listy __oldList__ na ścieżce __oldSwimlane__ na tablicy __oldBoard__ do listy __listy__ na ścieżce __swimlane__ na tablicy __board__", + "act-removeBoardMember": "usunął użytkownika __member__ z tablicy __board__", + "act-restoredCard": "przywrócił(a) kartę __card__ na listę __list__ na ścieżce __swimlane__ na tablicy __board__", + "act-unjoinMember": "usunął użytkownika __member__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", "act-withBoardTitle": "__board__", "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-customfield-created": "created custom field %s", - "activity-excluded": "excluded %s from %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "joined %s", - "activity-moved": "moved %s from %s to %s", - "activity-on": "on %s", - "activity-removed": "removed %s from %s", - "activity-sent": "sent %s to %s", - "activity-unjoined": "unjoined %s", - "activity-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add Cover", - "add-label": "Add Label", - "add-list": "Add List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "admin": "Admin", - "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", - "admin-announcement": "Announcement", - "admin-announcement-active": "Active System-Wide Announcement", - "admin-announcement-title": "Announcement from Administrator", - "all-boards": "All boards", - "and-n-other-card": "And __count__ other card", - "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "assign-member": "Assign member", - "attached": "attached", - "attachment": "Attachment", - "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", - "attachmentDeletePopup-title": "Delete Attachment?", - "attachments": "Attachments", - "auto-watch": "Automatically watch boards when they are created", - "avatar-too-big": "The avatar is too large (520KB max)", - "back": "Back", - "board-change-color": "Change color", + "actions": "Reakcje", + "activities": "Ostatnia aktywność", + "activity": "Aktywność", + "activity-added": "dodał %s do %s", + "activity-archived": "%s została przeniesiona do Archiwum", + "activity-attached": "dodał załącznik %s do %s", + "activity-created": "utworzył(a) %s", + "activity-customfield-created": "utworzył(a) niestandardowe pole %s", + "activity-excluded": "odłączył %s od %s", + "activity-imported": "zaimportowano %s to %s z %s", + "activity-imported-board": "zaimportowano %s z %s", + "activity-joined": "dodał się do %s", + "activity-moved": "przeniósł %s z %s do %s", + "activity-on": "w %s", + "activity-removed": "usunięto %s z %s", + "activity-sent": "wysłano %s z %s", + "activity-unjoined": "odłączył się od %s", + "activity-subtask-added": "dodano podzadanie do %s", + "activity-checked-item": "zaznaczył %s w czekliście %s w %s", + "activity-unchecked-item": "odznaczył %s w czekliście %s w %s", + "activity-checklist-added": "dodał czeklistę do %s", + "activity-checklist-removed": "usunął czeklistę z %s", + "activity-checklist-completed": "ukończył czeklistę %s z %s", + "activity-checklist-uncompleted": "cofnął ukończenie czeklisty %s z %s", + "activity-checklist-item-added": "dodał element do czeklisty '%s' w %s", + "activity-checklist-item-removed": "usunął element '%s' z %s", + "add": "Dodaj", + "activity-checked-item-card": "zaznaczył %s w czekliście %s", + "activity-unchecked-item-card": "odznaczył %s w czekliście %s", + "activity-checklist-completed-card": "wykonał(a) wszystkie elementy z czeklisty __checklist__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", + "activity-checklist-uncompleted-card": "wycofano ukończenie czeklisty %s", + "activity-editComment": "edytował(a) komentarz %s", + "activity-deleteComment": "usunął komentarz %s", + "activity-receivedDate": "zmienił datę otrzymania na %s z %s", + "activity-startDate": "zmienił datę rozpoczęcia na %s z %s", + "activity-dueDate": "zmienił datę wykonania na %s z %s", + "activity-endDate": "zmienił datę zakończenia na %s z %s", + "add-attachment": "Dodaj załącznik", + "add-board": "Dodaj tablicę", + "add-template": "Dodaj szablon", + "add-card": "Dodaj kartę", + "add-card-to-top-of-list": "Dodaj kartę na początku listy", + "add-card-to-bottom-of-list": "Dodaj kartę na końcu listy", + "add-swimlane": "Dodaj ścieżkę", + "add-subtask": "Dodaj podzadanie", + "add-checklist": "Dodaj czeklistę", + "add-checklist-item": "Dodaj element do czeklisty", + "convertChecklistItemToCardPopup-title": "Konwertuj na kartę", + "add-cover": "Dodaj okładkę", + "add-label": "Dodaj etykietę", + "add-list": "Dodaj listę", + "add-members": "Dodaj użytkowników", + "added": "Dodane", + "addMemberPopup-title": "Użytkownicy", + "memberPopup-title": "Ustawienia użytkowników", + "admin": "Administrator", + "admin-desc": "Może widzieć i edytować karty, usuwać użytkowników oraz zmieniać ustawienia tablicy.", + "admin-announcement": "Ogłoszenie", + "admin-announcement-active": "Włącz ogłoszenie systemowe", + "admin-announcement-title": "Ogłoszenie od administratora", + "all-boards": "Wszystkie tablice", + "and-n-other-card": "I __count__ inna karta", + "and-n-other-card_plural": "I __count__ inne karty", + "apply": "Zastosuj", + "app-is-offline": "Trwa ładowanie, proszę czekać. Odświeżenie strony może spowodować utratę danych. Jeśli strona się nie przeładowuje, upewnij się, że serwer działa poprawnie.", + "app-try-reconnect": "Spróbuj połączyć się ponownie.", + "archive": "Przenieś do Archiwum", + "archive-all": "Przenieś wszystko do Archiwum", + "archive-board": "Przenieś tablicę do Archiwum", + "archive-card": "Przenieś kartę do Archiwum", + "archive-list": "Przenieś listę do Archiwum", + "archive-swimlane": "Przenieś ścieżkę do Archiwum", + "archive-selection": "Przenieś zaznaczone do Archiwum", + "archiveBoardPopup-title": "Przenieść tablicę do Archiwum?", + "archived-items": "Archiwum", + "archived-boards": "Tablice w Archiwum", + "restore-board": "Przywróć tablicę", + "no-archived-boards": "Brak tablic w Archiwum.", + "archives": "Archiwum", + "template": "Szablon", + "templates": "Szablony", + "template-container": "Kontener Szablonów", + "add-template-container": "Dodaj Kontener Szablonów", + "assign-member": "Dodaj użytkownika", + "attached": "dodał załącznik", + "attachment": "Załącznik", + "attachment-delete-pop": "Usunięcie załącznika jest nieodwracalne.", + "attachmentDeletePopup-title": "Usunąć załącznik?", + "attachments": "Załączniki", + "auto-watch": "Automatycznie obserwuj tablice gdy zostaną stworzone", + "avatar-too-big": "Awatar jest za duży (maksymalnie 520KB)", + "back": "Wstecz", + "board-change-color": "Zmień kolor", "show-at-all-boards-page": "Show at All Boards page", "board-info-on-my-boards": "All Boards Settings", "boardInfoOnMyBoardsPopup-title": "All Boards Settings", "boardInfoOnMyBoards-title": "All Boards Settings", "show-card-counter-per-list": "Show card count per list", "show-board_members-avatar": "Show Board members avatars", - "board-nb-stars": "%s stars", - "board-not-found": "Board not found", - "board-private-info": "This board will be <strong>private</strong>.", - "board-public-info": "This board will be <strong>public</strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", - "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like “Bucket List” for example", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "card-comments-title": "This card has %s comment.", - "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", - "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", - "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "card-due": "Due", - "card-due-on": "Due on", - "card-spent": "Spent Time", - "card-edit-attachments": "Edit attachments", - "card-edit-custom-fields": "Edit custom fields", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", - "card-labels-title": "Change the labels for the card.", - "card-members-title": "Add or remove members of the board from the card.", - "card-start": "Start", - "card-start-on": "Starts on", - "cardAttachmentsPopup-title": "Attach From", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "board-nb-stars": "%s odznaczeń", + "board-not-found": "Nie znaleziono tablicy", + "board-private-info": "Ta tablica będzie <strong>prywatna</strong>.", + "board-public-info": "Ta tablica będzie <strong>publiczna<strong>.", + "board-drag-drop-reorder-or-click-open": "Użyj techniki przeciągnij i upuść, aby zmienić kolejność ikon tablic. Kliknij ikonę tablicy, by ją otworzyć.", + "boardChangeColorPopup-title": "Zmień tło tablicy", + "boardChangeTitlePopup-title": "Zmień nazwę tablicy", + "boardChangeVisibilityPopup-title": "Zmień widoczność tablicy", + "boardChangeWatchPopup-title": "Zmień sposób wysyłania powiadomień", + "boardMenuPopup-title": "Ustawienia tablicy", + "boardChangeViewPopup-title": "Widok tablicy", + "boards": "Tablice", + "board-view": "Widok tablicy", + "board-view-cal": "Kalendarz", + "board-view-swimlanes": "Ścieżki", + "board-view-collapse": "Zwiń", + "board-view-gantt": "Wykres Gantta", + "board-view-lists": "Listy", + "bucket-example": "Tak jak na przykład \"lista kubełkowa\"", + "cancel": "Anuluj", + "card-archived": "Ta karta została przeniesiona do Archiwum.", + "board-archived": "Ta tablica została przeniesiona do Archiwum.", + "card-comments-title": "Ta karta ma %s komentarzy.", + "card-delete-notice": "Usunięcie jest nieodwracalne. Stracisz wszystkie zdarzenia powiązane z tą kartą.", + "card-delete-pop": "Wszystkie zdarzenia zostaną usunięte z historii aktywności i nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.", + "card-delete-suggest-archive": "Możesz przenieść kartę do Archiwum, a następnie usunąć ją z tablicy i zachować ją w Aktywności.", + "card-archive-pop": "Karta nie będzie widoczna na tej liście po zarchiwizowaniu.", + "card-archive-suggest-cancel": "Możesz później przywrócić kartę z Archiwum.", + "card-due": "Data wykonania", + "card-due-on": "Data wykonania", + "card-spent": "Czas pracy", + "card-edit-attachments": "Edytuj załączniki", + "card-edit-custom-fields": "Edytuj niestandardowe pola", + "card-edit-labels": "Edytuj etykiety", + "card-edit-members": "Edytuj użytkowników", + "card-labels-title": "Zmień etykiety karty", + "card-members-title": "Dodaj lub usuń użytkowników tablicy z karty.", + "card-start": "Rozpoczęcie", + "card-start-on": "Zaczyna się o", + "cardAttachmentsPopup-title": "Dodaj załącznik z", + "cardCustomField-datePopup-title": "Zmień datę", + "cardCustomFieldsPopup-title": "Edytuj niestandardowe pola", + "cardStartVotingPopup-title": "Zacznij głosowanie", + "positiveVoteMembersPopup-title": "Zwolennicy", + "negativeVoteMembersPopup-title": "Przeciwnicy", + "card-edit-voting": "Edytuj głosowanie", + "editVoteEndDatePopup-title": "Zmień głos oraz datę", + "allowNonBoardMembers": "Pozwól wszystkim zalogowanym użytkownikom", + "vote-question": "Pytanie do głosowania", + "vote-public": "Pokaż, kto głosował na wybrane opcje", + "vote-for-it": "za", + "vote-against": "przeciwko", + "deleteVotePopup-title": "Usunąć głos?", + "vote-delete-pop": "Usunięcie jest nieodwracalne. Stracisz wszystkie zdarzenia związane z tym głosowaniem.", + "cardStartPlanningPokerPopup-title": "Uruchom Planning Pokera", + "card-edit-planning-poker": "Edytuj Planning Pokera", + "editPokerEndDatePopup-title": "Zmień datę końcową głosowania w Planning Pokerze", "poker-question": "Planning Poker", "poker-one": "1", "poker-two": "2", @@ -209,929 +209,929 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "change": "Change", - "change-avatar": "Change Avatar", - "change-password": "Change Password", - "change-permissions": "Change permissions", - "change-settings": "Change Settings", - "changeAvatarPopup-title": "Change Avatar", - "changeLanguagePopup-title": "Change Language", - "changePasswordPopup-title": "Change Password", - "changePermissionsPopup-title": "Change Permissions", - "changeSettingsPopup-title": "Change Settings", - "subtasks": "Subtasks", - "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", - "close": "Close", - "close-board": "Close Board", - "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", - "color-indigo": "indigo", - "color-lime": "lime", - "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", - "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "poker-finish": "Koniec", + "poker-result-votes": "Głosy", + "poker-result-who": "Kto", + "poker-replay": "Uruchom ponownie", + "set-estimation": "Ustaw Estymację", + "deletePokerPopup-title": "Usunąć planning pokera?", + "poker-delete-pop": "Usunięcie jest permanentne. Utracisz wszystkie akcje powiązane z tym planning pokerem.", + "cardDeletePopup-title": "Usunąć kartę?", + "cardArchivePopup-title": "Zarchiwizować Kartę?", + "cardDetailsActionsPopup-title": "Działania na karcie", + "cardLabelsPopup-title": "Etykiety", + "cardMembersPopup-title": "Użytkownicy", + "cardMorePopup-title": "Więcej", + "cardTemplatePopup-title": "Utwórz szablon", + "cards": "Karty", + "cards-count": "kart", + "cards-count-one": "karty", + "casSignIn": "Zaloguj się poprzez CAS", + "cardType-card": "karty", + "cardType-linkedCard": "Podpięta karta", + "cardType-linkedBoard": "Podpięta tablica", + "change": "Zmień", + "change-avatar": "Zmień avatar", + "change-password": "Zmień hasło", + "change-permissions": "Zmień uprawnienia", + "change-settings": "Zmień ustawienia", + "changeAvatarPopup-title": "Zmień avatar", + "changeLanguagePopup-title": "Zmień język", + "changePasswordPopup-title": "Zmień hasło", + "changePermissionsPopup-title": "Zmień uprawnienia", + "changeSettingsPopup-title": "Zmień ustawienia", + "subtasks": "Podzadania", + "checklists": "Czeklisty", + "click-to-star": "Kliknij by odznaczyć tę tablicę.", + "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.", + "clipboard": "Schowka lub poprzez przeciągnij & upuść", + "close": "Zamknij", + "close-board": "Zamknij tablicę", + "close-board-pop": "Będziesz w stanie przywrócić tablicę poprzez kliknięcie przycisku \"Archiwizuj\" w nagłówku strony domowej.", + "close-card": "Zamknij Kartę", + "color-black": "czarna", + "color-blue": "niebieska", + "color-crimson": "karmazynowa", + "color-darkgreen": "ciemnozielona", + "color-gold": "złota", + "color-gray": "szara", + "color-green": "zielona", + "color-indigo": "indygo", + "color-lime": "limonkowa", + "color-magenta": "fuksjowa", + "color-mistyrose": "jasnoróżowa", + "color-navy": "granatowa", + "color-orange": "pomarańczowa", + "color-paleturquoise": "turkusowy", + "color-peachpuff": "brzoskwiniowa", + "color-pink": "różowa", + "color-plum": "śliwkowa", + "color-purple": "fioletowa", + "color-red": "czerwona", + "color-saddlebrown": "jasnobrązowa", + "color-silver": "srebrna", + "color-sky": "błękitna", + "color-slateblue": "szaroniebieska", + "color-white": "biała", + "color-yellow": "żółta", + "unset-color": "Nieustawiony", + "comment": "Komentarz", + "comment-placeholder": "Dodaj komentarz", + "comment-only": "Tylko komentowanie", + "comment-only-desc": "Może tylko komentować w kartach.", + "comment-delete": "Czy na pewno chcesz usunąć komentarz?", + "deleteCommentPopup-title": "Usunąć komentarz?", + "no-comments": "Bez komentarzy", + "no-comments-desc": "Nie widzi komentarzy i aktywności.", + "worker": "Pracownik", + "worker-desc": "Możesz tylko przenieść karty, przypisać je do siebie i na nich komentować.", + "computer": "Komputera", + "confirm-subtask-delete-popup": "Czy jesteś pewien, że chcesz usunąć to podzadanie?", "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-card-link-to-clipboard": "Skopiuj łącze karty do schowka", "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", - "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", - "create": "Create", - "createBoardPopup-title": "Create Board", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", - "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "deleteLabelPopup-title": "Delete Label?", - "description": "Description", - "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", - "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", - "download": "Download", - "edit": "Edit", - "edit-avatar": "Change Avatar", - "edit-profile": "Edit Profile", - "edit-wip-limit": "Edit WIP Limit", - "soft-wip-limit": "Soft WIP Limit", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", + "linkCardPopup-title": "Podepnij kartę", + "searchElementPopup-title": "Wyszukaj", + "copyCardPopup-title": "Skopiuj kartę", + "copyChecklistToManyCardsPopup-title": "Kopiuj szablon czeklisty do wielu kart", + "copyChecklistToManyCardsPopup-instructions": "Docelowe tytuły i opisy kart są w formacie JSON", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Tytuł pierwszej karty\", \"description\":\"Opis pierwszej karty\"}, {\"title\":\"Tytuł drugiej karty\",\"description\":\"Opis drugiej karty\"},{\"title\":\"Tytuł ostatniej karty\",\"description\":\"Opis ostatniej karty\"} ]", + "create": "Utwórz", + "createBoardPopup-title": "Utwórz tablicę", + "chooseBoardSourcePopup-title": "Import tablicy", + "createLabelPopup-title": "Utwórz etykietę", + "createCustomField": "Utwórz pole", + "createCustomFieldPopup-title": "Utwórz pole", + "current": "obecnie otwarta", + "custom-field-delete-pop": "Nie ma możliwości cofnięcia tej operacji. Usuniesz to niestandardowe pole ze wszystkich kart oraz całą jego historię.", + "custom-field-checkbox": "Pole wyboru", + "custom-field-currency": "Waluta", + "custom-field-currency-option": "Kod waluty", + "custom-field-date": "Data", + "custom-field-dropdown": "Lista rozwijana", + "custom-field-dropdown-none": "(puste)", + "custom-field-dropdown-options": "Opcje listy", + "custom-field-dropdown-options-placeholder": "Naciśnij przycisk Enter by zobaczyć więcej opcji", + "custom-field-dropdown-unknown": "(nieznany)", + "custom-field-number": "Numer", + "custom-field-text": "Tekst", + "custom-fields": "Niestandardowe pola", + "date": "Data", + "decline": "Odrzuć", + "default-avatar": "Domyślny avatar", + "delete": "Usuń", + "deleteCustomFieldPopup-title": "Usunąć niestandardowe pole?", + "deleteLabelPopup-title": "Usunąć etykietę?", + "description": "Opis", + "disambiguateMultiLabelPopup-title": "Doprecyzuj działanie dotyczące etykiety", + "disambiguateMultiMemberPopup-title": "Doprecyzuj działanie dotyczące użytkownika", + "discard": "Odrzuć", + "done": "Zakończone", + "download": "Pobierz", + "edit": "Edytuj", + "edit-avatar": "Zmień avatar", + "edit-profile": "Edytuj profil", + "edit-wip-limit": "Zmień limit kart na liście", + "soft-wip-limit": "Pozwól na nadmiarowe karty na liście", + "editCardStartDatePopup-title": "Zmień datę rozpoczęcia", + "editCardDueDatePopup-title": "Zmień datę wykonania", + "editCustomFieldPopup-title": "Edytuj pole", + "addReactionPopup-title": "Dodaj reakcję", + "editCardSpentTimePopup-title": "Zmień ilość przepracowanego czasu", + "editLabelPopup-title": "Zmień etykietę", + "editNotificationPopup-title": "Zmień tryb powiadamiania", + "editProfilePopup-title": "Edytuj profil", "email": "Email", - "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-fail-text": "Error trying to send email", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "enable-wip-limit": "Enable WIP Limit", - "error-board-doesNotExist": "This board does not exist", - "error-board-notAdmin": "You need to be admin of this board to do that", - "error-board-notAMember": "You need to be a member of this board to do that", - "error-json-malformed": "Your text is not valid JSON", - "error-json-schema": "Your JSON data does not include the proper information in the correct format", - "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", - "error-list-doesNotExist": "This list does not exist", - "error-user-doesNotExist": "This user does not exist", - "error-user-notAllowSelf": "You can not invite yourself", - "error-user-notCreated": "This user is not created", - "error-username-taken": "This username is already taken", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", - "list-label-short-modifiedAt": "(L)", + "email-enrollAccount-subject": "Konto zostało utworzone na __siteName__", + "email-enrollAccount-text": "Witaj __user__,\nAby zacząć korzystać z serwisu, kliknij w link poniżej.\n__url__\nDzięki.", + "email-fail": "Wysyłanie emaila nie powiodło się.", + "email-fail-text": "Bład w trakcie wysyłania wiadomości email", + "email-invalid": "Nieprawidłowy email", + "email-invite": "Zaproś przez email", + "email-invite-subject": "__inviter__ wysłał Ci zaproszenie", + "email-invite-text": "Drogi __user__,\n__inviter__ zaprosił Cię do współpracy w tablicy \"__board__\".\nZobacz więcej:\n__url__\nDzięki.", + "email-resetPassword-subject": "Zresetuj swoje hasło na __siteName__", + "email-resetPassword-text": "Witaj __user__,\nAby zresetować hasło, kliknij w link poniżej.\n__url__\nDzięki.", + "email-sent": "Email wysłany", + "email-verifyEmail-subject": "Zweryfikuj swój adres email na __siteName__", + "email-verifyEmail-text": "Witaj __user__,\nAby zweryfikować adres email, kliknij w link poniżej.\n__url__\nDzięki.", + "enable-wip-limit": "Włącz limit kart na liście", + "error-board-doesNotExist": "Ta tablica nie istnieje", + "error-board-notAdmin": "Musisz być administratorem tej tablicy żeby to zrobić", + "error-board-notAMember": "Musisz być użytkownikiem tej tablicy, żeby wykonać tę czynność", + "error-json-malformed": "Twoja fraza nie jest w formacie JSON", + "error-json-schema": "Twoje dane JSON nie zawierają prawidłowych informacji w poprawnym formacie", + "error-csv-schema": "Twój plik CSV(plik oddzielony przecinkami)/TSV (plik oddzielony tabulatorami) nie zawiera danych w poprawnym formacie", + "error-list-doesNotExist": "Ta lista nie isnieje", + "error-user-doesNotExist": "Ten użytkownik nie istnieje", + "error-user-notAllowSelf": "Nie możesz zaprosić samego siebie", + "error-user-notCreated": "Ten użytkownik nie został stworzony", + "error-username-taken": "Ta nazwa jest już zajęta", + "error-orgname-taken": "Ta nazwa organizacji jest już zajęta", + "error-teamname-taken": "Ta nazwa zespołu jest już zajęta", + "error-email-taken": "Adres email jest już zarezerwowany", + "export-board": "Eksportuj tablicę", + "export-board-json": "Eksportuj tablicę do JSON", + "export-board-csv": "Eksportuj tablicę do CSV", + "export-board-tsv": "Eksportuj tablicę do TSV", + "export-board-excel": "Eksportuj tablicę w formacie Excel", + "user-can-not-export-excel": "Użytkownik nie może wyeksportować tablicy w formacie Excel", + "export-board-html": "Eksportuj tablicę do HTML", + "export-card": "Eksportuj kartę", + "export-card-pdf": "Eksportuj kartę do PDF", + "user-can-not-export-card-to-pdf": "Użytkownik nie może wyeksportować karty do PDF", + "exportBoardPopup-title": "Eksportuj tablicę", + "exportCardPopup-title": "Eksportuj kartę", + "sort": "Sortuj", + "sorted": "Posortowano", + "remove-sort": "Usuń sortowanie", + "sort-desc": "Kliknij by sortować listę", + "list-sort-by": "Sortuj listę przez:", + "list-label-modifiedAt": "Ostatni dostęp", + "list-label-title": "Nazwa listy", + "list-label-sort": "Twoja kolejność ustawiona ręcznie", + "list-label-short-modifiedAt": "(O)", "list-label-short-title": "(N)", - "list-label-short-sort": "(M)", - "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "filter-on": "Filter is on", - "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", - "filter-to-selection": "Filter to selection", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "hide-system-messages": "Hide system messages", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", - "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", - "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV data here", - "import-map-members": "Map members", - "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select member", - "info": "Version", - "initials": "Initials", - "invalid-date": "Invalid date", - "invalid-time": "Invalid time", - "invalid-user": "Invalid user", - "joined": "joined", - "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", - "label-create": "Create Label", - "label-default": "%s label (default)", - "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", - "labels": "Labels", - "language": "Language", - "last-admin-desc": "You can’t change roles because there must be at least one admin.", - "leave-board": "Leave Board", - "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", - "leaveBoardPopup-title": "Leave Board ?", - "link-card": "Link to this card", - "list-archive-cards": "Move all cards in this list to Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "listMorePopup-title": "More", - "link-list": "Link to this list", - "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", - "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", - "lists": "Lists", - "swimlanes": "Swimlanes", - "log-out": "Log Out", - "log-in": "Log In", - "loginPopup-title": "Log In", - "memberMenuPopup-title": "Member Settings", - "members": "Members", + "list-label-short-sort": "(K)", + "filter": "Filtr", + "filter-cards": "Filtruj karty i listy", + "filter-dates-label": "Filtruj według daty", + "filter-no-due-date": "Brak terminu", + "filter-overdue": "Termin minął", + "filter-due-today": "Termin przypada dzisiaj", + "filter-due-this-week": "Termin przypada w tym tygodniu", + "filter-due-tomorrow": "Termin przypada jutro", + "list-filter-label": "Filtruj listy względem tytułu", + "filter-clear": "Usuń filter", + "filter-labels-label": "Filtruj wg etykiety", + "filter-no-label": "Brak etykiety", + "filter-member-label": "Filtruj wg użytkownika", + "filter-no-member": "Brak użytkowników", + "filter-assignee-label": "Filtruj wg osoby przypisanej", + "filter-no-assignee": "Nieprzypisane ", + "filter-custom-fields-label": "Filtruj wg niestandardowych pól", + "filter-no-custom-fields": "Brak niestandardowych pól", + "filter-show-archive": "Pokaż zarchiwizowane listy", + "filter-hide-empty": "Ukryj puste listy", + "filter-on": "Filtr jest włączony", + "filter-on-desc": "Filtrujesz karty na tej tablicy. Kliknij tutaj by edytować filtr.", + "filter-to-selection": "Odfiltruj zaznaczenie", + "other-filters-label": "Inne filtry", + "advanced-filter-label": "Zaawansowane filtry", + "advanced-filter-description": "Zaawansowane filtry pozwalają na wykorzystanie ciągu znaków wraz z następującymi operatorami: == != <= >= && || (). Spacja jest używana jako separator pomiędzy operatorami. Możesz przefiltrowywać wszystkie niestandardowe pola wpisując ich nazwy lub wartości, na przykład: Pole1 == Wartość1.\nUwaga: Jeśli pola lub wartości zawierają spację, musisz je zawrzeć w pojedynczym cudzysłowie, na przykład: 'Pole 1' == 'Wartość 1'. Dla pojedynczych znaków, które powinny być pominięte, należy użyć \\, na przykład Pole1 == I\\'m. Możesz także wykorzystywać mieszane warunki, na przykład P1 == W1 || P1 == W2. Standardowo wszystkie operatory są interpretowane od lewej do prawej. Możesz także zmienić kolejność interpretacji wykorzystując nawiasy, na przykład P1 == W1 && (P2 == W2 || P2 == W3). Możesz także wyszukiwać tekstowo wykorzystując wyrażenia regularne, na przykład: P1 == /Tes.*/i", + "fullname": "Pełna nazwa", + "header-logo-title": "Wróć do swojej strony z tablicami.", + "hide-system-messages": "Ukryj wiadomości systemowe", + "headerBarCreateBoardPopup-title": "Utwórz tablicę", + "home": "Strona główna", + "import": "Importuj", + "impersonate-user": "Wciel się w tego użytkownika", + "link": "Podłącz", + "import-board": "importuj tablice", + "import-board-c": "Import tablicy", + "import-board-title-trello": "Importuj tablicę z Trello", + "import-board-title-wekan": "Importuj tablicę z poprzedniego eksportu", + "import-board-title-csv": "Importuj tablicę z CSV/TSV", + "from-trello": "Z Trello", + "from-wekan": "Z poprzedniego eksportu", + "from-csv": "Z CSV/TSV", + "import-board-instruction-trello": "W twojej tablicy na Trello przejdź do 'Menu', następnie 'Więcej', 'Drukuj i eksportuj', 'Eksportuj jako JSON' i skopiuj wynik", + "import-board-instruction-csv": "Wklej swoje dane w postaci wartości oddzielanych przecinkiem (CSV) lub tabulatorem (TSV)", + "import-board-instruction-wekan": "Na Twojej tablicy przejdź do 'Menu', a następnie wybierz 'Eksportuj tablicę' i skopiuj tekst w pobranym pliku.", + "import-board-instruction-about-errors": "Czasami mimo komunikatu o błędzie importowanie tablicy przebiega poprawnie i jest ona widoczna na liście tablic (Wszystkie tablice).", + "import-json-placeholder": "Wklej Twoje dane JSON tutaj", + "import-csv-placeholder": "Wklej swoje dane z pliku CSV/TSV tutaj", + "import-map-members": "Przypisz użytkowników", + "import-members-map": "Zaimportowana tablica ma kilku użytkowników. Wybierz spośród nich osoby, które chcesz zaimportować jako użytkowników Twojej tablicy", + "import-members-map-note": "Uwaga: Karty przypisane do niezidentyfikowanych użytkowników zostaną przypisane do bieżącego użytkownika.", + "import-show-user-mapping": "Przejrzyj przypisanych użytkowników", + "import-user-select": "Wybierz istniejącego użytkownika, którego chcesz dodać", + "importMapMembersAddPopup-title": "Wybierz użytkownika", + "info": "Wersja", + "initials": "Inicjały", + "invalid-date": "Błędna data", + "invalid-time": "Błędny czas", + "invalid-user": "Niepoprawna nazwa użytkownika", + "joined": "dołączył", + "just-invited": "Zostałeś zaproszony do tej tablicy", + "keyboard-shortcuts": "Skróty klawiaturowe", + "label-create": "Utwórz etykietę", + "label-default": "'%s' etykieta (domyślna)", + "label-delete-pop": "Nie da się tego wycofać. To usunie tę etykietę ze wszystkich kart i usunie ich historię.", + "labels": "Etykiety", + "language": "Język", + "last-admin-desc": "Nie możesz zmienić roli użytkownika, ponieważ musi istnieć co najmniej jeden administrator.", + "leave-board": "Opuść tablicę", + "leave-board-pop": "Czy jesteś pewien, że chcesz opuścić tablicę __boardTitle__? Zostaniesz usunięty ze wszystkich kart tej tablicy.", + "leaveBoardPopup-title": "Opuścić tablicę?", + "link-card": "Link do tej karty", + "list-archive-cards": "Przenieś wszystkie karty z tej listy do Archiwum", + "list-archive-cards-pop": "To usunie wszystkie karty z tej listy z tej tablicy. Aby przejrzeć karty w Archiwum i przywrócić na tablicę, kliknij \"Menu\" > \"Archiwizuj\".", + "list-move-cards": "Przenieś wszystkie karty z tej listy", + "list-select-cards": "Zaznacz wszystkie karty z tej listy", + "set-color-list": "Ustaw kolor", + "listActionPopup-title": "Działania na liście", + "settingsUserPopup-title": "Ustawienia konta użytkownika", + "settingsTeamPopup-title": "Ustawienia Zespołu", + "settingsOrgPopup-title": "Ustawienia Organizacji", + "swimlaneActionPopup-title": "Działania na ścieżce", + "swimlaneAddPopup-title": "Dodaj ścieżkę poniżej", + "listImportCardPopup-title": "Zaimportuj kartę z Trello", + "listImportCardsTsvPopup-title": "Importuj CSV/TSV z Excela", + "listMorePopup-title": "Więcej", + "link-list": "Podepnij do tej listy", + "list-delete-pop": "Wszystkie zdarzenia zostaną usunięte z historii aktywności i nie będziesz w stanie przywrócić tej listy. Nie ma możliwości cofnięcia tej operacji.", + "list-delete-suggest-archive": "Możesz przenieść listę do Archiwum, a następnie usunąć ją z tablicy i zachować ją w Aktywności.", + "lists": "Listy", + "swimlanes": "Ścieżki", + "log-out": "Wyloguj", + "log-in": "Zaloguj", + "loginPopup-title": "Zaloguj", + "memberMenuPopup-title": "Ustawienia użytkowników", + "members": "Użytkownicy", "menu": "Menu", - "move-selection": "Move selection", - "moveCardPopup-title": "Move Card", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for selection", - "multi-selection-on": "Multi-Selection is on", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", - "my-boards": "My Boards", - "name": "Name", - "no-archived-cards": "No cards in Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", - "optional": "optional", - "or": "or", - "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", - "page-not-found": "Page not found.", - "password": "Password", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", - "private": "Private", - "private-desc": "This board is private. Only people added to the board can view and edit it.", - "profile": "Profile", - "public": "Public", - "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", - "quick-access-description": "Star a board to add a shortcut in this bar.", - "remove-cover": "Remove Cover", - "remove-from-board": "Remove from Board", - "remove-label": "Remove Label", - "listDeletePopup-title": "Delete List ?", - "remove-member": "Remove Member", - "remove-member-from-card": "Remove from Card", - "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", - "removeMemberPopup-title": "Remove Member?", - "rename": "Rename", - "rename-board": "Rename Board", - "restore": "Restore", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autocomplete emoji", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", - "show-cards-minimum-count": "Show cards count if list contains more than", - "sidebar-open": "Open Sidebar", - "sidebar-close": "Close Sidebar", - "signupPopup-title": "Create an Account", - "star-board-title": "Click to star this board. It will show up at top of your boards list.", - "starred-boards": "Starred Boards", - "starred-boards-description": "Starred boards show up at the top of your boards list.", - "subscribe": "Subscribe", - "team": "Team", - "this-board": "this board", - "this-card": "this card", - "spent-time-hours": "Spent time (hours)", - "overtime-hours": "Overtime (hours)", - "overtime": "Overtime", - "has-overtime-cards": "Has overtime cards", - "has-spenttime-cards": "Has spent time cards", - "time": "Time", - "title": "Title", + "move-selection": "Przenieś zaznaczone", + "moveCardPopup-title": "Przenieś kartę", + "moveCardToBottom-title": "Przenieś na koniec", + "moveCardToTop-title": "Przenieś na początek", + "moveSelectionPopup-title": "Przenieś zaznaczone", + "multi-selection": "Wielokrotne zaznaczenie", + "multi-selection-label": "Dodaj etykietę do zaznaczenia", + "multi-selection-member": "Dodaj użytkownika do zaznaczenia", + "multi-selection-on": "Wielokrotne zaznaczenie jest włączone", + "muted": "Wycisz", + "muted-info": "Nie dostaniesz powiadomienia o zmianach w tej tablicy.", + "my-boards": "Moje tablice", + "name": "Nazwa", + "no-archived-cards": "Brak kart w Archiwum.", + "no-archived-lists": "Brak list w Archiwum.", + "no-archived-swimlanes": "Brak ścieżek w Archiwum", + "no-results": "Brak wyników", + "normal": "Użytkownik standardowy", + "normal-desc": "Może widzieć i edytować karty. Nie może zmieniać ustawiań.", + "not-accepted-yet": "Zaproszenie jeszcze niezaakceptowane", + "notify-participate": "Otrzymuj informacje o aktywności w kartach, które stworzyłeś(aś) lub których jesteś użytkownikiem", + "notify-watch": "Otrzymuj powiadomienia z tablic, list i kart, które obserwujesz", + "optional": "opcjonalny", + "or": "lub", + "page-maybe-private": "Ta strona może być prywatna. Możliwe, że możesz ją zobaczyć po <a href='%s'>zalogowaniu</a>.", + "page-not-found": "Strona nie znaleziona.", + "password": "Hasło", + "paste-or-dragdrop": "wklej lub przeciągnij & upuść (tylko grafika)", + "participating": "Uczestniczysz", + "preview": "Podgląd", + "previewAttachedImagePopup-title": "Podgląd", + "previewClipboardImagePopup-title": "Podgląd", + "private": "Prywatna", + "private-desc": "Ta tablica jest prywatna. Tylko osoby dodane do tej tablicy mogą ją zobaczyć i edytować.", + "profile": "Profil", + "public": "Publiczna", + "public-desc": "Ta tablica jest publiczna. Jest widoczna dla wszystkich, którzy mają do niej odnośnik i będzie wynikiem silników wyszukiwania takich jak Google. Tylko użytkownicy dodani do tablicy mogą ją edytować.", + "quick-access-description": "Odznacz tablicę aby dodać skrót na tym pasku.", + "remove-cover": "Usuń okładkę", + "remove-from-board": "Usuń z tablicy", + "remove-label": "Usuń etykietę", + "listDeletePopup-title": "Usunąć listę?", + "remove-member": "Usuń użytkownika", + "remove-member-from-card": "Usuń z karty", + "remove-member-pop": "Usunąć __name__ (__username__) z __boardTitle__? Użytkownik zostanie usunięty ze wszystkich kart na tej tablicy. Zostanie o tym powiadomiony.", + "removeMemberPopup-title": "Usunąć użytkownika?", + "rename": "Zmień nazwę", + "rename-board": "Zmień nazwę tablicy", + "restore": "Przywróć", + "save": "Zapisz", + "search": "Wyszukaj", + "rules": "Reguły", + "search-cards": "Szukaj w tytułach kart/list oraz opisach i niestandardowych polach na tej tablicy", + "search-example": "Wpisz tekst do wyszukania i wciśnij Enter", + "select-color": "Wybierz kolor", + "select-board": "Wybierz tablicę", + "set-wip-limit-value": "Ustaw maksymalny limit kart na tej liście", + "setWipLimitPopup-title": "Ustaw limit kart na liście", + "shortcut-assign-self": "Przypisz siebie do obecnej karty", + "shortcut-autocomplete-emoji": "Autouzupełnianie emoji", + "shortcut-autocomplete-members": "Autouzupełnianie użytkowników", + "shortcut-clear-filters": "Usuń wszystkie filtry", + "shortcut-close-dialog": "Zamknij okno", + "shortcut-filter-my-cards": "Filtruj moje karty", + "shortcut-show-shortcuts": "Przypnij do listy skrótów", + "shortcut-toggle-filterbar": "Przełącz boczny pasek filtru", + "shortcut-toggle-searchbar": "Pokaż/Ukryj panel wyszukiwania", + "shortcut-toggle-sidebar": "Przełącz boczny pasek tablicy", + "show-cards-minimum-count": "Pokaż licznik kart, jeśli lista zawiera więcej niż", + "sidebar-open": "Otwórz pasek boczny", + "sidebar-close": "Zamknij pasek boczny", + "signupPopup-title": "Utwórz konto", + "star-board-title": "Kliknij by oznaczyć tę tablicę gwiazdką. Pojawi się wtedy na liście tablic na górze.", + "starred-boards": "Odznaczone tablice", + "starred-boards-description": "Tablice oznaczone gwiazdką pojawią się na liście na górze.", + "subscribe": "Zapisz się", + "team": "Zespół", + "this-board": "ta tablica", + "this-card": "ta karta", + "spent-time-hours": "Czas pracy (h)", + "overtime-hours": "Nadgodziny (h)", + "overtime": "Nadgodziny", + "has-overtime-cards": "Ma karty z wykazanymi nadgodzinami", + "has-spenttime-cards": "Ma karty z wykazanym czasem pracy", + "time": "Czas", + "title": "Tytuł", "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "type": "Type", - "unassign-member": "Unassign member", - "unsaved-description": "You have an unsaved description.", - "unwatch": "Unwatch", - "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", - "welcome-swimlane": "Milestone 1", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "what-to-do": "What do you want to do?", - "wipLimitErrorPopup-title": "Invalid WIP Limit", - "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", - "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", - "admin-panel": "Admin Panel", - "settings": "Settings", - "people": "People", - "registration": "Registration", - "disable-self-registration": "Disable Self-Registration", + "tracking": "Śledź", + "tracking-info": "Będziesz powiadamiany(a) o wszelkich zmianach w kartach, które stworzyłeś(aś) lub jesteś ich użytkownikiem.", + "type": "Typ", + "unassign-member": "Odłącz użytkownika", + "unsaved-description": "Masz niezapisany opis.", + "unwatch": "Nie obserwuj", + "upload": "Wyślij", + "upload-avatar": "Wyślij avatar", + "uploaded-avatar": "Wysłany avatar", + "custom-top-left-corner-logo-image-url": "URL obrazu logo w lewym górnym rogu", + "custom-top-left-corner-logo-link-url": "URL linku logo w lewym górnym rogu", + "custom-top-left-corner-logo-height": "Wysokość logo w górnym lewym rogu (domyślnie: 27)", + "custom-login-logo-image-url": "URL obrazu logo ekranu logowania", + "custom-login-logo-link-url": "URL linku logo ekranu logowania", + "text-below-custom-login-logo": "Tekst pod logo na ekranie logowania", + "automatic-linked-url-schemes": "Schematy adresów URL, które powinny być automatycznie przekształcane w aktywne. Wpisz jeden schemat URL w każdej linii", + "username": "Nazwa użytkownika", + "import-usernames": "Importuj użytkowników", + "view-it": "Zobacz", + "warn-list-archived": "Ostrzeżenie: ta karta jest na liście będącej w Archiwum", + "watch": "Obserwuj", + "watching": "Obserwuj", + "watching-info": "Dostaniesz powiadomienie o każdej zmianie na tej tablicy.", + "welcome-board": "Tablica powitalna", + "welcome-swimlane": "Kamień milowy 1", + "welcome-list1": "Podstawy", + "welcome-list2": "Zaawansowane", + "card-templates-swimlane": "Utwórz szablony", + "list-templates-swimlane": "Wyświetl szablony", + "board-templates-swimlane": "Szablony tablic", + "what-to-do": "Co chcesz zrobić?", + "wipLimitErrorPopup-title": "Nieprawidłowy limit kart na liście", + "wipLimitErrorPopup-dialog-pt1": "Aktualna ilość kart na tej liście jest większa niż aktualny zdefiniowany limit kart.", + "wipLimitErrorPopup-dialog-pt2": "Wycofaj jakieś karty z tej listy lub zwiększ limit kart na tej liście.", + "admin-panel": "Panel administracyjny", + "settings": "Ustawienia", + "people": "Osoby", + "registration": "Rejestracja", + "disable-self-registration": "Wyłącz samodzielną rejestrację", "disable-forgot-password": "Disable Forgot Password", - "invite": "Invite", - "invite-people": "Invite People", - "to-boards": "To board(s)", - "email-addresses": "Email Addresses", - "smtp-host-description": "The address of the SMTP server that handles your emails.", - "smtp-port-description": "The port your SMTP server uses for outgoing emails.", - "smtp-tls-description": "Enable TLS support for SMTP server", - "smtp-host": "SMTP Host", - "smtp-port": "SMTP Port", - "smtp-username": "Username", - "smtp-password": "Password", - "smtp-tls": "TLS support", - "send-from": "From", - "send-smtp-test": "Send a test email to yourself", - "invitation-code": "Invitation Code", - "email-invite-register-subject": "__inviter__ sent you an invitation", - "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", - "email-smtp-test-subject": "SMTP Test Email", - "email-smtp-test-text": "You have successfully sent an email", - "error-invitation-code-not-exist": "Invitation code doesn't exist", - "error-notAuthorized": "You are not authorized to view this page.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", - "OS_Arch": "OS Arch", - "OS_Cpus": "OS CPU Count", - "OS_Freemem": "OS Free Memory", - "OS_Loadavg": "OS Load Average", - "OS_Platform": "OS Platform", - "OS_Release": "OS Release", - "OS_Totalmem": "OS Total Memory", - "OS_Type": "OS Type", - "OS_Uptime": "OS Uptime", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", - "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode": "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified at", - "verified": "Verified", - "active": "Active", - "card-received": "Received", - "card-received-on": "Received on", - "card-end": "End", - "card-end-on": "Ends on", - "editCardReceivedDatePopup-title": "Change received date", - "editCardEndDatePopup-title": "Change end date", - "setCardColorPopup-title": "Set color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", + "invite": "Zaproś", + "invite-people": "Zaproś osoby", + "to-boards": "Do tablic(y)", + "email-addresses": "Adres e-mail", + "smtp-host-description": "Adres serwera SMTP, który wysyła Twoje maile.", + "smtp-port-description": "Port, który Twój serwer SMTP wykorzystuje do wysyłania emaili.", + "smtp-tls-description": "Włącz wsparcie TLS dla serwera SMTP", + "smtp-host": "Serwer SMTP", + "smtp-port": "Port SMTP", + "smtp-username": "Nazwa użytkownika", + "smtp-password": "Hasło", + "smtp-tls": "Wsparcie dla TLS", + "send-from": "Od", + "send-smtp-test": "Wyślij wiadomość testową do siebie", + "invitation-code": "Kod z zaproszenia", + "email-invite-register-subject": "__inviter__ wysłał Ci zaproszenie", + "email-invite-register-text": "Drogi __user__,\n\n__inviter__ zaprasza Cię do współpracy na naszej tablicy kanban.\n\nAby kontynuować, wejdź w poniższy link:\n__url__\n\nTwój kod zaproszenia to: __icode__\n\nDziękuję.", + "email-smtp-test-subject": "Wiadomość testowa SMTP", + "email-smtp-test-text": "Wiadomość testowa została wysłana z powodzeniem.", + "error-invitation-code-not-exist": "Kod zaproszenia nie istnieje", + "error-notAuthorized": "Nie jesteś uprawniony do przeglądania tej strony.", + "webhook-title": "Nazwa webhooka", + "webhook-token": "Token (opcjonalny do autoryzacji)", + "outgoing-webhooks": "Wychodzące webhooki", + "bidirectional-webhooks": "Dwustronne webhooki", + "outgoingWebhooksPopup-title": "Wychodzące webhooki", + "boardCardTitlePopup-title": "Filtruj poprzez nazwę karty", + "disable-webhook": "Wyłącz tego webhooka", + "global-webhook": "Globalne webhooki", + "new-outgoing-webhook": "Nowy wychodzący webhook", + "no-name": "(nieznany)", + "Node_version": "Wersja Node", + "Meteor_version": "Wersja Meteor", + "MongoDB_version": "Wersja MongoDB", + "MongoDB_storage_engine": "Silnik MongoDB", + "MongoDB_Oplog_enabled": "MongoDB - włączony Oplog", + "OS_Arch": "Architektura systemu", + "OS_Cpus": "Ilość rdzeni systemu", + "OS_Freemem": "Wolna pamięć RAM", + "OS_Loadavg": "Średnie obciążenie systemu", + "OS_Platform": "Platforma systemu", + "OS_Release": "Wersja jądra", + "OS_Totalmem": "Dostępna pamięć RAM", + "OS_Type": "Typ systemu", + "OS_Uptime": "Czas działania systemu", + "days": "dni", + "hours": "godzin", + "minutes": "minut", + "seconds": "sekund", + "show-field-on-card": "Pokaż te pole na karcie", + "automatically-field-on-card": "Dodaj pole do nowych kart", + "always-field-on-card": "Dodaj pole do wszystkich kart", + "showLabel-field-on-card": "Pokaż pole etykiety w minikarcie", + "showSum-field-on-list": "Pokaż sumę pól na górze listy", + "yes": "Tak", + "no": "Nie", + "accounts": "Konto", + "accounts-allowEmailChange": "Zezwól na zmianę adresu email", + "accounts-allowUserNameChange": "Zezwól na zmianę nazwy użytkownika", + "tableVisibilityMode-allowPrivateOnly": "Widoczność tablic: Tylko tablice prywatne", + "tableVisibilityMode": "Widoczność tablic", + "createdAt": "Utworzone o", + "modifiedAt": "Zmodyfikowano", + "verified": "Zweryfikowane", + "active": "Aktywny", + "card-received": "Przyjęto", + "card-received-on": "Przyjęto", + "card-end": "Koniec", + "card-end-on": "Kończy się", + "editCardReceivedDatePopup-title": "Zmień datę przyjęcia", + "editCardEndDatePopup-title": "Zmień datę zakończenia", + "setCardColorPopup-title": "Ustaw kolor", + "setCardActionsColorPopup-title": "Wybierz kolor", + "setSwimlaneColorPopup-title": "Wybierz kolor", + "setListColorPopup-title": "Wybierz kolor", + "assigned-by": "Przypisane przez", + "requested-by": "Zlecone przez", + "card-sorting-by-number": "Sortowanie kart wg numeru", + "board-delete-notice": "Usunięcie jest nieodwracalne. Stracisz wszystkie listy, karty oraz reguły przypisane do tej tablicy.", + "delete-board-confirm-popup": "Wszystkie listy, etykiety oraz aktywności zostaną usunięte i nie będziesz w stanie przywrócić zawartości tablicy. Tego nie da się cofnąć.", + "boardDeletePopup-title": "Usunąć tablicę?", + "delete-board": "Usuń tablicę", + "default-subtasks-board": "Podzadania dla tablicy __board__", + "default": "Domyślny", + "queue": "Kolejka", + "subtask-settings": "Ustawienia podzadań", + "card-settings": "Ustawienia karty", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", + "boardSubtaskSettingsPopup-title": "Ustawienia tablicy podzadań", + "boardCardSettingsPopup-title": "Ustawienia kart", "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", + "deposit-subtasks-board": "Twórz podzadania na tablicy:", + "deposit-subtasks-list": "Początkowa lista dla podzadań jest przechowywana w:", + "show-parent-in-minicard": "Pokaż rodzica w minikarcie:", "description-on-minicard": "Description on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", - "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "list": "List", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", - "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", - "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", - "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", - "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value.", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", + "prefix-with-full-path": "Prefix z pełną ścieżką", + "prefix-with-parent": "Prefix z rodzicem", + "subtext-with-full-path": "Podtekst z pełną ścieżką", + "subtext-with-parent": "Podtekst z rodzicem", + "change-card-parent": "Zmień rodzica karty", + "parent-card": "Karta rodzica", + "source-board": "Tablica źródłowa", + "no-parent": "Nie pokazuj rodzica", + "activity-added-label": "dodał etykietę '%s' z '%s'", + "activity-removed-label": "usunął etykietę '%s' z '%s'", + "activity-delete-attach": "usunął załącznik z %s", + "activity-added-label-card": "dodał etykietę '%s'", + "activity-removed-label-card": "usunął etykietę '%s'", + "activity-delete-attach-card": "usunął załącznik", + "activity-set-customfield": "ustawił niestandardowe pole '%s' na '%s' w '%s'", + "activity-unset-customfield": "wyczyścił niestandardowe pole '%s' w '%s'", + "r-rule": "Reguła", + "r-add-trigger": "Dodaj aktywator", + "r-add-action": "Dodaj reakcję", + "r-board-rules": "Reguły tablicy", + "r-add-rule": "Dodaj regułę", + "r-view-rule": "Zobacz regułę", + "r-delete-rule": "Usuń regułę", + "r-new-rule-name": "Nowa nazwa reguły", + "r-no-rules": "Brak regułę", + "r-trigger": "Aktywator", + "r-action": "Reakcja", + "r-when-a-card": "Gdy karta", + "r-is": "jest", + "r-is-moved": "jest przenoszona", + "r-added-to": "dodana do", + "r-removed-from": "usunięta z", + "r-the-board": "na tablicy", + "r-list": "listy", + "list": "Lista", + "set-filter": "Ustaw filtr", + "r-moved-to": "przenoszona do", + "r-moved-from": "przenoszona z", + "r-archived": "zarchiwizowana", + "r-unarchived": "przywrócona z archiwum", + "r-a-card": "karta", + "r-when-a-label-is": "Gdy etykieta jest", + "r-when-the-label": "Gdy etykieta", + "r-list-name": "nazwa listy", + "r-when-a-member": "Gdy osoba (użytkownik) jest", + "r-when-the-member": "Gdy osoba", + "r-name": "nazwa", + "r-when-a-attach": "Gdy załącznik", + "r-when-a-checklist": "Gdy czeklista jest", + "r-when-the-checklist": "Gdy czeklista", + "r-completed": "ukończona", + "r-made-incomplete": "ponownie nieukończona", + "r-when-a-item": "Gdy element czeklisty jest", + "r-when-the-item": "Gdy element", + "r-checked": "zaznaczony", + "r-unchecked": "ponownie niezaznaczony", + "r-move-card-to": "Przenieś kartę na", + "r-top-of": "początek", + "r-bottom-of": "koniec", + "r-its-list": "tej listy", + "r-archive": "Zarchiwizuj", + "r-unarchive": "Przywróć z Archiwum", + "r-card": "kartę", + "r-add": "Dodaj", + "r-remove": "Usuń", + "r-label": "etykietę", + "r-member": "użytkownika", + "r-remove-all": "Usuń wszystkich użytkowników tej karty", + "r-set-color": "Ustaw kolor na", + "r-checklist": "czeklistę", + "r-check-all": "Zaznacz wszystkie", + "r-uncheck-all": "Odznacz wszystkie", + "r-items-check": "elementy czeklisty", + "r-check": "Zaznacz", + "r-uncheck": "Odznacz", + "r-item": "element", + "r-of-checklist": "z czeklisty", + "r-send-email": "Wyślij wiadomość email", + "r-to": "do", + "r-of": "z", + "r-subject": "temat", + "r-rule-details": "Szczegóły reguł", + "r-d-move-to-top-gen": "Przenieś kartę na początek listy", + "r-d-move-to-top-spec": "Przenieś kartę na początek listy", + "r-d-move-to-bottom-gen": "Przenieś kartę na koniec listy", + "r-d-move-to-bottom-spec": "Przenieś kartę na koniec listy", + "r-d-send-email": "Wyślij wiadomość email", + "r-d-send-email-to": "do", + "r-d-send-email-subject": "temat", + "r-d-send-email-message": "wiadomość", + "r-d-archive": "Zarchiwizuj kartę", + "r-d-unarchive": "Przywróć kartę z Archiwum", + "r-d-add-label": "Dodaj etykietę", + "r-d-remove-label": "Usuń etykietę", + "r-create-card": "Utwórz nową kartę", + "r-in-list": "na liście", + "r-in-swimlane": "na ścieżce", + "r-d-add-member": "Dodaj użytkownika", + "r-d-remove-member": "Usuń użytkownika", + "r-d-remove-all-member": "Usuń wszystkich użytkowników", + "r-d-check-all": "Zaznacz wszystkie elementy listy", + "r-d-uncheck-all": "Odznacz wszystkie elementy listy", + "r-d-check-one": "Zaznacz element", + "r-d-uncheck-one": "Odznacz element", + "r-d-check-of-list": "z czeklisty", + "r-d-add-checklist": "Dodaj czeklistę", + "r-d-remove-checklist": "Usuń czeklistę", + "r-by": "przez", + "r-add-checklist": "Dodaj czeklistę", + "r-with-items": "z elementami", + "r-items-list": "element1,element2,element3", + "r-add-swimlane": "Dodaj ścieżkę", + "r-swimlane-name": "Nazwa ścieżki", + "r-board-note": "Uwaga: pozostaw pole puste, aby każda wartość była brana pod uwagę.", + "r-checklist-note": "Uwaga: elementy czeklisty muszą być oddzielone przecinkami.", + "r-when-a-card-is-moved": "Gdy karta jest przenoszona do innej listy", + "r-set": "Ustaw", + "r-update": "Aktualizuj", + "r-datefield": "datę", + "r-df-start-at": "rozpoczęcia", + "r-df-due-at": "wykonania", + "r-df-end-at": "zakończenia", + "r-df-received-at": "przyjęcia", + "r-to-current-datetime": "na aktualną datę i godzinę", + "r-remove-value-from": "Wyczyść", "ldap": "LDAP", "oauth2": "OAuth2", "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "add-custom-html-after-body-start": "Add Custom HTML after <body> start", - "add-custom-html-before-body-end": "Add Custom HTML before </body> end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "org-number": "The number of organizations is:", - "team-number": "The number of teams is:", - "people-number": "The number of people is:", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", + "authentication-method": "Sposób autoryzacji", + "authentication-type": "Typ autoryzacji", + "custom-product-name": "Niestandardowa nazwa produktu", + "layout": "Układ strony", + "hide-logo": "Ukryj logo", + "add-custom-html-after-body-start": "Dodaj niestandardowy kod HTML po <body> starcie", + "add-custom-html-before-body-end": "Dodaj niestandardowy kod HTML przed </body> końcem", + "error-undefined": "Coś poszło nie tak", + "error-ldap-login": "Wystąpił błąd w trakcie logowania", + "display-authentication-method": "Wyświetl metodę logowania", + "oidc-button-text": "Własny tekst przycisku OIDC", + "default-authentication-method": "Domyślna metoda logowania", + "duplicate-board": "Duplikuj tablicę", + "org-number": "Liczba organizacji:", + "team-number": "Liczba zespołów:", + "people-number": "Liczba użytkowników to:", + "swimlaneDeletePopup-title": "Usunąć ścieżkę?", + "swimlane-delete-pop": "Wszystkie zdarzenia dotyczące tej ścieżki zostaną usunięte z historii aktywności. Tej operacji nie można cofnąć. Usunięcie jest nieodwracalne.", + "restore-all": "Przywróć wszystkie", + "delete-all": "Usuń wszystkie", + "loading": "Ładowanie, proszę czekać.", + "previous_as": "ostatni raz był", + "act-a-dueAt": "zmienił(a) datę wykonania na: __timeValue__ w karcie __card__, poprzednia data wykonania: __timeOldValue__", + "act-a-endAt": "zmienił czas zakończenia na __timeValue__ z __timeOldValue__", + "act-a-startAt": "zmienił czas rozpoczęcia na __timeValue__ z __timeOldValue__", + "act-a-receivedAt": "zmienił czas przyjęcia zadania na __timeValue__ z __timeOldValue__", + "a-dueAt": "zmienił datę wykonania na", + "a-endAt": "zmienił czas zakończenia na", + "a-startAt": "zmienił czas rozpoczęcia na", + "a-receivedAt": "zmienił czas przyjęcia zadania na", + "almostdue": "data wykonania %s jest bliska", + "pastdue": "data wykonania %s minęła", + "duenow": "data wykonania %s przypada dzisiaj", + "act-newDue": "__list__/__card__ pierwszy raz przypomina o dacie wykonania [__board__]", + "act-withDue": "__list__/__card__ ma przypomnienia o dacie wykonania [__board__]", + "act-almostdue": "przypominał o zbliżającej się dacie wykonania (__timeValue__) karty __card__", + "act-pastdue": "przypominał o upłynięciu daty wykonania (__timeValue__) karty __card__", + "act-duenow": "przypominał o mijającej właśnie dacie wykonania (__timeValue__) karty __card__", + "act-atUserComment": "Zostałeś wspomniany w [__board] __list__/__card__", + "delete-user-confirm-popup": "Czy jesteś pewien, że chcesz usunąć te konto? Nie można tego wycofać.", + "delete-team-confirm-popup": "Czy na pewno chcesz usunąć ten zespół? Operacji nie można cofnąć.", + "delete-org-confirm-popup": "Czy na pewno chcesz usunąć tą organizację? Operacji nie można cofnąć.", + "accounts-allowUserDelete": "Pozwól użytkownikom na usuwanie własnych kont", + "hide-minicard-label-text": "Ukryj opisy etykiet minikart", + "show-desktop-drag-handles": "Pokaż przeciągnięcia na pulpit", + "assignee": "Przypisani", + "cardAssigneesPopup-title": "Przypisani", + "addmore-detail": "Dodaj bardziej szczegółowy opis", + "show-on-card": "Pokaż na karcie", "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", + "new": "Nowy", + "editOrgPopup-title": "Edytuj organizację", + "newOrgPopup-title": "Nowa organizacja", + "editTeamPopup-title": "Edytuj zespół", + "newTeamPopup-title": "Nowy zespół", + "editUserPopup-title": "Edytuj użytkownika", + "newUserPopup-title": "Nowy użytkownik", + "notifications": "Powiadomienia", + "view-all": "Wyświetl wszystko", + "filter-by-unread": "Filtruj nieprzeczytane", + "mark-all-as-read": "Zaznacz wszystkie jako przeczytane", + "remove-all-read": "Usuń wszystkie przeczytane", + "allow-rename": "Zezwól na zmianę nazwy", + "allowRenamePopup-title": "Zezwól na zmianę nazwy", + "start-day-of-week": "Wybierz pierwszy dzień tygodnia", + "monday": "Poniedziałek", + "tuesday": "Wtorek", + "wednesday": "Środa", + "thursday": "Czwartek", + "friday": "Piątek", + "saturday": "Sobota", + "sunday": "Niedziela", "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "task": "Task", - "create-task": "Create Task", + "swimlane": "Ścieżka", + "owner": "Właściciel", + "last-modified-at": "Ostatnio zmodyfikowano", + "last-activity": "Ostatnia aktywność", + "voting": "Głosowanie", + "archived": "Zarchiwizowany", + "delete-linked-card-before-this-card": "Nie możesz usunąć tej karty, dopóki nie usuniesz podpiętej karty, w której są", + "delete-linked-cards-before-this-list": "Nie możesz usunąć tej karty, dopóki nie usuniesz podpiętych kart, które wskazują na karty w tej liście", + "hide-checked-items": "Ukryj ukończone", + "task": "Zadanie", + "create-task": "Utwórz zadanie", "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "board": "Board", + "organizations": "Organizacje", + "teams": "Zespoły", + "displayName": "Nazwa wyświetlana", + "shortName": "Nazwa skrócona", + "website": "Strona internetowa", + "person": "Osoba", + "my-cards": "Moje karty", + "card": "karty", + "board": "Tablica", "context-separator": "/", "myCardsViewChange-title": "My Cards View", "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-boards": "Tablice", "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", + "myCardsSortChange-title": "Moje karty sortuj", + "myCardsSortChangePopup-title": "Moje karty sortuj", + "myCardsSortChange-choice-board": "według tablic", + "myCardsSortChange-choice-dueat": "według terminów", + "dueCards-title": "Karty oczekujące", + "dueCardsViewChange-title": "Lista kart oczekujących", + "dueCardsViewChangePopup-title": "Lista kart oczekujących", + "dueCardsViewChange-choice-me": "Moje", + "dueCardsViewChange-choice-all": "Wszystkich użytkowników", + "dueCardsViewChange-choice-all-description": "Wyświetla wszystkie nieukończone karty z ustawioną datą wykonania ze wszystkich tablic, do których użytkownik ma dostęp.", + "broken-cards": "Karty wadliwe", + "board-title-not-found": "Nie znaleziono tablicy '%s'.", + "swimlane-title-not-found": "Nie znaleziono ścieżki '%s'.", + "list-title-not-found": "Nie znaleziono listy '%s'.", + "label-not-found": "Nie znaleziono etykiety '%s'.", + "label-color-not-found": "Kolor etykiety %s nie istnieje.", + "user-username-not-found": "Nie znaleziono użytkownika '%s'.", + "comment-not-found": "Nie znaleziono karty z komentarzem zawierającym '%s'.", "org-name-not-found": "Organization '%s' not found.", "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", + "globalSearch-title": "Przeszukaj wszystkie tablice", + "no-cards-found": "Nie znaleziono kart", + "one-card-found": "Znaleziono 1 kartę", + "n-cards-found": "Znaleziono %skart(y)", + "n-n-of-n-cards-found": "__start__-__end__ z __total__ znalezionych kart", + "operator-board": "tablica", + "operator-board-abbrev": "t", + "operator-swimlane": "ścieżka", "operator-swimlane-abbrev": "s", - "operator-list": "list", + "operator-list": "listy", "operator-list-abbrev": "l", - "operator-label": "label", + "operator-label": "etykietę", "operator-label-abbrev": "#", - "operator-user": "user", + "operator-user": "użytkownik", "operator-user-abbrev": "@", - "operator-member": "member", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", + "operator-member": "użytkownika", + "operator-member-abbrev": "u", + "operator-assignee": "przypisany", + "operator-assignee-abbrev": "p", + "operator-creator": "twórca", "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", + "operator-due": "wykonania", + "operator-created": "stworzono", + "operator-modified": "zmodyfikowano", + "operator-sort": "kategoria", + "operator-comment": "komentarz", + "operator-has": "ma", "operator-limit": "limit", "operator-debug": "debug", "operator-org": "org", "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", + "predicate-archived": "zarchiwizowane", + "predicate-open": "rozpoczęte", + "predicate-ended": "ukończone", + "predicate-all": "wszystkie", + "predicate-overdue": "przeterminowane", + "predicate-week": "tydzień", + "predicate-month": "miesiąc", + "predicate-quarter": "kwartał", + "predicate-year": "rok", + "predicate-due": "wykonania", + "predicate-modified": "zmodyfikowano", + "predicate-created": "stworzono", + "predicate-attachment": "załącznik", + "predicate-description": "opis", + "predicate-checklist": "czeklistę", + "predicate-start": "rozpoczęcia", + "predicate-end": "zakończenia", + "predicate-assignee": "przypisany", + "predicate-member": "użytkownika", + "predicate-public": "publiczne", + "predicate-private": "prywatne", "predicate-selector": "selector", "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-unknown-error": "%s nie jest operatorem", + "operator-number-expected": "operator __operator__ oczekiwał wartości cyfrowej, otrzymał '__value__'", + "operator-sort-invalid": "kategoria '%s' jest niepoprawna", + "operator-status-invalid": "status '%s' jest niepoprawny", + "operator-has-invalid": "%s nie jest poprawnym sprawdzeniem istnienia", + "operator-limit-invalid": "%s nie jest poprawnym limitem. Limit musi być liczbą naturalną.", "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "next-page": "Następna strona", + "previous-page": "Poprzednia strona", + "heading-notes": "Notatki", + "globalSearch-instructions-heading": "Instrukcja wyszukiwania", + "globalSearch-instructions-description": "W wyszukiwanym ciągu można umieszczać specjalne klucze, aby doprecyzować zapytanie. Klucz składa się z operatora i argumentu, rozdzielonych dwukropkiem. Na przykład klucz `lista:Wstrzymane` zawęża wyszukiwanie do kart znajdujących się na listach o nazwie *Wstrzymane*. Jeśli argument zawiera spacje lub znaki specjalne, należy go umieścić w cudzysłowie, np. `__operator_list__:\"Do uzgodnienia\"`.", + "globalSearch-instructions-operators": "Dostępne klucze wyszukiwania:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - karty na tablicach pasujących do klucza *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - karty na listach pasujących do klucza *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - karty na ścieżkach pasujących do klucza *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - karty z komentarzem zawierającym *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - karty z etykietą pasującą do *<color>* lub *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - skrót dla `__operator_label__:<color>` lub `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - karty, których *użytkownikiem* lub *osobą przypisaną* jest *<username>*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - skrócona forma dla `użytkownik:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - karty, których *użytkownikiem* jest *<username>*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - karty, do których *przypisany* jest użytkownik *<username>*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - karty, których twórcą jest *<username>*", "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - karty, których termin mija w ciągu *<n>* lub mniej dni od teraz. `__operator_due__:__predicate_overdue__ wyświetla wszystkie karty, których termin minął.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - karty utworzone *<n>* lub mniej dni temu", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - karty zmodyfikowane *<n>* lub mniej dni temu", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - gdzie *<status>* jest jednym z:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - karty zarchiwizowane", + "globalSearch-instructions-status-all": "`__predicate_all__` - wszystkie karty zarchiwizowane i przywrócone z archiwum", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - karty z podanym terminem zakończenia", + "globalSearch-instructions-status-public": "`__predicate_public__` - karty wyłącznie na publicznych tablicach", + "globalSearch-instructions-status-private": "`__predicate_private__` - karty wyłącznie na prywatnych tablicach", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - gdzie *<field>* to jeden z `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` lub `__predicate_member__`. Umieszczenie znaku `-` na początku *<field>* spowoduje wyszukanie elementów, w których brakuje wartości w tym polu (np. `ma:-data_wykonania` wyszuka karty, które nie mają ustawionej daty wykonania).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - gdzie *<sort-name>* jest jednym z `__predicate_due__`, `__predicate_created__` lub `__predicate_modified__`. Aby sortować malejąco, umieść znak `-` przed operatorem.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - gdzie *<n>* to liczba naturalna określająca liczbę kart wyświetlanych na stronie.", + "globalSearch-instructions-notes-1": "Można używać wielu kluczy w jednym zapytaniu.", + "globalSearch-instructions-notes-2": "Operatory tego samego typu są traktowane jako alternatywy. To znaczy, że zwracane są wszystkie karty, w których spełnione jest przynajmniej jedno z kryteriów.\n`__operator_list__:Dostępne __operator_list__:Wstrzymane` zwróci karty znajdujące się na listach o nazwach *Dostępne* i *Wstrzymane*.", + "globalSearch-instructions-notes-3": "Operatory różnego typu traktowane są jako suma logiczna *AND*. Zwracane są tylko karty pasujące do wszystkich operatorów różnego typu. `__operator_list__:Dostępne __operator_label__:czerwona` zwróci tylko karty z listy *Dostępne*, które mają etykietę w kolorze *czerwonym*.", + "globalSearch-instructions-notes-3-2": "Dni można określać za pomocą liczby dodatniej lub ujemnej, albo za pomocą `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` lub `__predicate_year__` dla bieżącego okresu.", + "globalSearch-instructions-notes-4": "W kluczach wyszukiwania wielkie i małe litery można stosować zamiennie.", + "globalSearch-instructions-notes-5": "Domyślnie karty zarchiwizowane nie są przeszukiwane.", + "link-to-search": "Link do tego wyszukiwania", "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-system-messages-of-all-users": "Hide system messages of all users", - "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", + "number": "Numer", + "label-colors": "Kolory etykiet", + "label-names": "Nazwy etykiet", + "archived-at": "zarchiwizowana", + "sort-cards": "Sortuj karty", + "cardsSortPopup-title": "Sortuj karty według", + "due-date": "terminu wykonania", + "server-error": "Błąd serwera", + "server-error-troubleshooting": "Uprzejmie proszę o przesłanie treści tego błędu serwera z logu.\nDla wersji snap uruchom: `sudo snap logs wekan.wekan`\nDla wersji Docker uruchom: `sudo docker logs wekan-app`", + "title-alphabetically": "nazwy (alfabetycznie)", + "created-at-newest-first": "daty utworzenia (najpierw najnowsze)", + "created-at-oldest-first": "daty utworzenia (najpierw najstarsze)", + "links-heading": "Linki", + "hide-system-messages-of-all-users": "Ukryj powiadomienia systemowe wszystkich użytkowników", + "now-system-messages-of-all-users-are-hidden": "Odtąd powiadomienia systemowe wszystkich użytkowników będą ukryte", + "move-swimlane": "Przenieś ścieżkę", + "moveSwimlanePopup-title": "Przenieś ścieżkę", + "custom-field-stringtemplate": "Wzór ciągu znaków", + "custom-field-stringtemplate-format": "Format (wstaw %{value} w miejsce zmiennych)", + "custom-field-stringtemplate-separator": "Separator (użyj lub   jako odstępu)", + "custom-field-stringtemplate-item-placeholder": "Wciśnij Enter, aby dodać więcej elementów", + "creator": "Twórca", + "filesReportTitle": "Wykaz plików", + "reports": "Wykazy", + "rulesReportTitle": "Wykaz reguł", "boardsReportTitle": "Boards Report", "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", + "copy-swimlane": "Skopiuj ścieżkę", + "copySwimlanePopup-title": "Kopiowanie ścieżki", + "display-card-creator": "Wyświetlaj autora karty", + "wait-spinner": "Animowany wskaźnik postępu", + "Bounce": "Odbijanie", + "Cube": "Sześcian", + "Cube-Grid": "Sześcian-Siatka", + "Dot": "Kropki", + "Double-Bounce": "Podwójne odbicie", + "Rotateplane": "Obrót płaszczyzny", + "Scaleout": "Skalowanie", + "Wave": "Fala", + "maximize-card": "Maksymalizuj kartę", + "minimize-card": "Minimalizuj kartę", + "delete-org-warning-message": "Nie można usunąć tej organizacji. Do organizacji należy co najmniej jeden użytkownik.", + "delete-team-warning-message": "Nie można usunąć tego zespołu. Do zespołu należy co najmniej jeden użytkownik.", + "subject": "Temat", + "details": "Szczegóły", + "carbon-copy": "Kopia (Cc:)", "ticket": "Ticket", "tickets": "Tickets", "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", + "open": "Otwarte", + "pending": "Oczekujące", + "closed": "Zamknięte", + "resolved": "Rozwiązane", + "cancelled": "Anulowane", + "history": "Historia", "request": "Request", "requests": "Requests", "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", + "editCardSortOrderPopup-title": "Zmień Sortowanie", + "cardDetailsPopup-title": "Szczegóły Karty", + "add-teams": "Dodaj zespoły", + "add-teams-label": "Dodane zespoły są wyświetlone poniżej:", "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "confirm-btn": "Potwierdź", + "remove-btn": "Usuń", + "filter-card-title-label": "Filtruj według tytułu karty", + "invite-people-success": "Zaproszenie do rejestracji zostało wysłane", + "invite-people-error": "Błąd podczas wysyłki zaproszenia do rejestracji", + "can-invite-if-same-mailDomainName": "Nazwa domeny email", + "to-create-teams-contact-admin": "Żeby tworzyć zespoły, skontaktuj się z administratorem.", "Node_heap_total_heap_size": "Node heap: total heap size", "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", "Node_heap_total_physical_size": "Node heap: total physical size", @@ -1147,14 +1147,14 @@ "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", "Node_memory_usage_heap_used": "Node memory usage: actual memory used", "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", + "add-organizations": "Dodaj organizacje", + "add-organizations-label": "Dodane organizacje są wyświetlone poniżej:", "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "to-create-organizations-contact-admin": "Żeby tworzyć organizacje, skontaktuj się z administratorem.", "custom-legal-notice-link-url": "Custom legal notice page URL", "acceptance_of_our_legalNotice": "By continuing, you accept our", "legalNotice": "legal notice", - "copied": "Copied!", + "copied": "Skopiowano!", "checklistActionsPopup-title": "Checklist Actions", "moveChecklist": "Move Checklist", "moveChecklistPopup-title": "Move Checklist", @@ -1175,6 +1175,6 @@ "version-name": "Version-Name", "size": "Size", "storage": "Storage", - "action": "Action", + "action": "Reakcja", "board-title": "Board Title" } \ No newline at end of file From 2dfbb48114ef0c8709978ad625abe69b42349470 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:35:11 +0300 Subject: [PATCH 093/246] Updated translations. --- imports/i18n/languages.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 80f4fddf4..a72c5ec09 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -377,6 +377,12 @@ export default { name: "ਪੰਜਾਬੀ", load: () => import('./data/pa.i18n.json'), }, + "pl-PL": { + code: "pl", + tag: "pl-PL", + name: "Polski (Polska)", + load: () => import('./data/pl-PL.i18n.json'), + }, "pl": { code: "pl", tag: "pl", From d8702b2ca1b63214fd9c42228248d5616095fe08 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:47:06 +0300 Subject: [PATCH 094/246] Updated translations. --- imports/i18n/languages.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index a72c5ec09..d6a56e286 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -41,6 +41,12 @@ export default { name: "čeština (Česká republika)", load: () => import('./data/cs-CZ.i18n.json'), }, + "cy-GB": { + code: "cy", + tag: "cy-GB", + name: "Welsh (UK)", + load: () => import('./data/cy-GB.i18n.json'), + }, "da": { code: "da", tag: "da", @@ -209,6 +215,12 @@ export default { name: "Français", load: () => import('./data/fr.i18n.json'), }, + "fy-NL": { + code: "fy", + tag: "fy-NL", + name: "Westerlauwersk Frysk", + load: () => import('./data/fy-NL.i18n.json'), + }, "gl-ES": { code: "gl", tag: "gl-ES", @@ -437,6 +449,12 @@ export default { name: "Српски језик", load: () => import('./data/sr.i18n.json'), }, + "st": { + code: "st", + tag: "st", + name: "Sãotomense", + load: () => import('./data/st.i18n.json'), + }, "sv": { code: "sv", tag: "sv", @@ -479,6 +497,24 @@ export default { name: "українська (Україна)", load: () => import('./data/ua.i18n.json'), }, + "uz-AR": { + code: "uz", + tag: "uz-AR", + name: "o'zbek (arab)", + load: () => import('./data/uz-AR.i18n.json'), + }, + "uz-LA": { + code: "uz", + tag: "uz-LA", + name: "o'zbek (lotin)", + load: () => import('./data/uz-LA.i18n.json'), + }, + "uz-UZ": { + code: "uz", + tag: "uz-UZ", + name: "o'zbek (O'zbekiston)", + load: () => import('./data/uz-UZ.i18n.json'), + }, "vi": { code: "vi", tag: "vi", From 5a3bc74daf12dea7c6a4ac79aa002572f4e02549 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 21:50:26 +0300 Subject: [PATCH 095/246] Updated translations. --- imports/i18n/languages.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index d6a56e286..4d52abbd6 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -80,7 +80,7 @@ export default { "el": { code: "el", tag: "el", - name: "el", + name: "Ελληνικά", load: () => import('./data/el.i18n.json'), }, "en-BR": { From 7607090bdfe620d411401296bc849bad3bc3dfe4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 23:16:58 +0300 Subject: [PATCH 096/246] Updated translations. --- imports/i18n/languages.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 4d52abbd6..1a6278622 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -515,6 +515,30 @@ export default { name: "o'zbek (O'zbekiston)", load: () => import('./data/uz-UZ.i18n.json'), }, + "ve-CC": { + code: "ve", + tag: "ve-CC", + name: "vèneto", + load: () => import('./data/ve-CC.i18n.json'), + }, + "ve-PP": { + code: "ve", + tag: "ve-PP", + name: "vepsän kelʹ", + load: () => import('./data/ve-PP.i18n.json'), + }, + "ve": { + code: "ve", + tag: "ve", + name: "Tshivenḓa", + load: () => import('./data/ve.i18n.json'), + }, + "vi-VN": { + code: "vi", + tag: "vi-VN", + name: "Tiếng Việt (Việt Nam)", + load: () => import('./data/vi-VN.i18n.json'), + }, "vi": { code: "vi", tag: "vi", @@ -536,7 +560,7 @@ export default { "zh-TW": { code: "zh", tag: "zh-TW", - name: "繁体中文(台湾)", + name: "繁體中文(台灣)", load: () => import('./data/zh-TW.i18n.json'), } }; From 0e6b31b636977ca1e0fb6e29f8a0f78a5635a560 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 21 Apr 2022 23:59:56 +0300 Subject: [PATCH 097/246] Updated translations. --- imports/i18n/languages.js | 56 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 1a6278622..77a0891df 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -47,6 +47,12 @@ export default { name: "Welsh (UK)", load: () => import('./data/cy-GB.i18n.json'), }, + "cy": { + code: "cy", + tag: "cy", + name: "Welsh", + load: () => import('./data/cy.i18n.json'), + }, "da": { code: "da", tag: "da", @@ -107,6 +113,12 @@ export default { name: "English (Italy)", load: () => import('./data/en-IT.i18n.json'), }, + "en-YS": { + code: "en", + tag: "en-YS", + name: "English (Yeshivish)", + load: () => import('./data/en-YS.i18n.json'), + }, "en": { code: "en", tag: "en", @@ -218,9 +230,15 @@ export default { "fy-NL": { code: "fy", tag: "fy-NL", - name: "Westerlauwersk Frysk", + name: "Westerlauwersk Frysk (Nederlân)", load: () => import('./data/fy-NL.i18n.json'), }, + "fy": { + code: "fy", + tag: "fy", + name: "Westerlauwersk Frysk", + load: () => import('./data/fy.i18n.json'), + }, "gl-ES": { code: "gl", tag: "gl-ES", @@ -545,6 +563,42 @@ export default { name: "Tiếng Việt", load: () => import('./data/vi.i18n.json'), }, + "vl-SS": { + code: "vl", + tag: "vl-SS", + name: "Vlaams", + load: () => import('./data/vl-SS.i18n.json'), + }, + "vo": { + code: "vo", + tag: "vo", + name: "Volapük", + load: () => import('./data/vo.i18n.json'), + }, + "wa-RR": { + code: "wa", + tag: "wa-RR", + name: "Wáray-Wáray", + load: () => import('./data/wa-RR.i18n.json'), + }, + "wa": { + code: "wa", + tag: "wa", + name: "walon", + load: () => import('./data/wa.i18n.json'), + }, + "wo": { + code: "wo", + tag: "wo", + name: "ولوفل", + load: () => import('./data/wo.i18n.json'), + }, + "xh": { + code: "xh", + tag: "xh", + name: "isiXhosa", + load: () => import('./data/xh.i18n.json'), + }, "zh-CN": { code: "zh", tag: "zh-CN", From e726b9be7dde61c226f41b17314131bedcd5e44c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 00:23:19 +0300 Subject: [PATCH 098/246] Updated translations. --- imports/i18n/languages.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 77a0891df..d4d98bdbd 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -599,6 +599,18 @@ export default { name: "isiXhosa", load: () => import('./data/xh.i18n.json'), }, + "yi": { + code: "yi", + tag: "yi", + name: "ייִדיש, יידיש", + load: () => import('./data/yi.i18n.json'), + }, + "yo": { + code: "yo", + tag: "yo", + name: "Èdè Yorùbá", + load: () => import('./data/yo.i18n.json'), + }, "zh-CN": { code: "zh", tag: "zh-CN", @@ -616,5 +628,17 @@ export default { tag: "zh-TW", name: "繁體中文(台灣)", load: () => import('./data/zh-TW.i18n.json'), + }, + "zu-ZA": { + code: "zu", + tag: "zu-ZA", + name: "isiZulu (Ningizimu Afrika)", + load: () => import('./data/zu-ZA.i18n.json'), + }, + "zu": { + code: "zu", + tag: "zu", + name: "isiZulu", + load: () => import('./data/zu.i18n.json'), } }; From 9f723b58636596bb55a65fcc10c13ca10fb00649 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 00:28:27 +0300 Subject: [PATCH 099/246] Updated translations. --- imports/i18n/data/nl-NL.i18n.json | 24 ++++++++++++------------ imports/i18n/data/pl-PL.i18n.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json index 9f3d6fd05..46b0043f1 100644 --- a/imports/i18n/data/nl-NL.i18n.json +++ b/imports/i18n/data/nl-NL.i18n.json @@ -78,7 +78,7 @@ "activity-receivedDate": "ontvangst datum gewijzigd naar %s van %s", "activity-startDate": "start datum gewijzigd naar %s van %s", "activity-dueDate": "vervaldatum gewijzigd naar %s van %s", - "activity-endDate": "einddatum gewijzigd naar %s van %s ", + "activity-endDate": "einddatum gewijzigd naar %s van %s", "add-attachment": "Bijlage Toevoegen", "add-board": "Bord Toevoegen", "add-template": "Template Toevoegen", @@ -106,7 +106,7 @@ "and-n-other-card": "En __count__ andere kaarten", "and-n-other-card_plural": "En __count__ andere kaarten", "apply": "Aanmelden", - "app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check dan of de Wekan server niet is gestopt. ", + "app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check dan of de Wekan server niet is gestopt.", "app-try-reconnect": "Probeer opnieuw te verbinden.", "archive": "Verplaats naar Archief", "archive-all": "Verplaats Alles naar Archief", @@ -170,7 +170,7 @@ "card-archive-pop": "Kaart is na archivering niet meer zichtbaar op deze lijst.", "card-archive-suggest-cancel": "Je kunt de kaart later terughalen vanuit het Archief.", "card-due": "Verval", - "card-due-on": "Vervalt op ", + "card-due-on": "Vervalt op", "card-spent": "Gespendeerde tijd", "card-edit-attachments": "Wijzig bijlagen", "card-edit-custom-fields": "Wijzig maatwerkvelden", @@ -313,7 +313,7 @@ "custom-field-dropdown": "Dropdown Lijst", "custom-field-dropdown-none": "(geen)", "custom-field-dropdown-options": "Lijst Opties", - "custom-field-dropdown-options-placeholder": "Toets Enter om meer opties toe te voegen ", + "custom-field-dropdown-options-placeholder": "Toets Enter om meer opties toe te voegen", "custom-field-dropdown-unknown": "(onbekend)", "custom-field-number": "Aantal", "custom-field-text": "Tekst", @@ -589,7 +589,7 @@ "upload": "Upload", "upload-avatar": "Upload een avatar", "uploaded-avatar": "Avatar is geüpload", - "custom-top-left-corner-logo-image-url": "URL Voor Maatwerk Logo Afbeelding In Linker Bovenhoek ", + "custom-top-left-corner-logo-image-url": "URL Voor Maatwerk Logo Afbeelding In Linker Bovenhoek", "custom-top-left-corner-logo-link-url": "URL Voor Maatwerk Logo Link In Linker Bovenhoek", "custom-top-left-corner-logo-height": "Hoogte Van Maatwerk Logo In Linker Bovenhoek. Default: 27", "custom-login-logo-image-url": "URL Voor Maatwerk Login Logo Afbeelding", @@ -612,7 +612,7 @@ "board-templates-swimlane": "Bord Templates", "what-to-do": "Wat wil je doen?", "wipLimitErrorPopup-title": "Ongeldige WIP limiet", - "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet ", + "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet", "wipLimitErrorPopup-dialog-pt2": "Verwijder een aantal taken uit deze lijst, of zet de WIP limiet hoger", "admin-panel": "Administrator paneel", "settings": "Instellingen", @@ -699,7 +699,7 @@ "requested-by": "Aangevraagd door", "card-sorting-by-number": "Kaarten sorteren op nummer", "board-delete-notice": "Verwijdering kan niet ongedaan gemaakt worden. Je raakt alle met dit bord gerelateerde lijsten, kaarten en acties kwijt.", - "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid. ", + "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid.", "boardDeletePopup-title": "Bord verwijderen?", "delete-board": "Verwijder bord", "default-subtasks-board": "Subtaken voor __board__ bord", @@ -878,9 +878,9 @@ "duenow": "huidige vervaldatum %s is vandaag", "act-newDue": "__list__/__card__ heeft eerste vervaldatum herinnering [__board__]", "act-withDue": "__list__/__card__ vervaldatum herinneringen [__board__]", - "act-almostdue": "wil je herinneren aan het naderen van de huidige vervaldatum (__timeValue__) van __card__ ", - "act-pastdue": "wil je herinneren aan het verlopen van de huidige vervaldatum (__timeValue__) van __card__ ", - "act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__ ", + "act-almostdue": "wil je herinneren aan het naderen van de huidige vervaldatum (__timeValue__) van __card__", + "act-pastdue": "wil je herinneren aan het verlopen van de huidige vervaldatum (__timeValue__) van __card__", + "act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__", "act-atUserComment": "Je werd genoemd in [__board__] __list__/__card__", "delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.", "delete-team-confirm-popup": "Weet je zeker dat je dit team wilt verwijderen? Er is geen herstelmogelijkheid.", @@ -922,7 +922,7 @@ "last-activity": "Laatste activiteit", "voting": "Stemmen", "archived": "Gearchiveerd", - "delete-linked-card-before-this-card": "Je kunt deze kaart niet verwijderen voordat de gekoppelde kaart is verwijderd ", + "delete-linked-card-before-this-card": "Je kunt deze kaart niet verwijderen voordat de gekoppelde kaart is verwijderd", "delete-linked-cards-before-this-list": "Je kunt deze lijst niet verwijderen voordat de gekoppelde kaarten verwijderd zijn die verwijzen naar kaarten in deze lijst", "hide-checked-items": "Verberg aangevinkte items", "task": "Taak", @@ -1152,7 +1152,7 @@ "remove-organization-from-board": "Weet je zeker dat je deze organisatie van het bord wilt verwijderen?", "to-create-organizations-contact-admin": "Zoek contact met de beheerder om organisaties aan te maken.", "custom-legal-notice-link-url": "URL voor maatwerk juridische disclaimer tekst pagina", - "acceptance_of_our_legalNotice": "Als u doorgaat accepteert u onze ", + "acceptance_of_our_legalNotice": "Als u doorgaat accepteert u onze", "legalNotice": "juridische disclaimer tekst", "copied": "Gekopieerd!", "checklistActionsPopup-title": "Checklist acties", diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json index 77dc487de..1fd351b2d 100644 --- a/imports/i18n/data/pl-PL.i18n.json +++ b/imports/i18n/data/pl-PL.i18n.json @@ -410,7 +410,7 @@ "filter-member-label": "Filtruj wg użytkownika", "filter-no-member": "Brak użytkowników", "filter-assignee-label": "Filtruj wg osoby przypisanej", - "filter-no-assignee": "Nieprzypisane ", + "filter-no-assignee": "Nieprzypisane", "filter-custom-fields-label": "Filtruj wg niestandardowych pól", "filter-no-custom-fields": "Brak niestandardowych pól", "filter-show-archive": "Pokaż zarchiwizowane listy", From a34cbf95e84bb46fb4da673fe50333341cc781b1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 01:19:43 +0300 Subject: [PATCH 100/246] Add missing code. --- models/attachments.js | 2 ++ models/avatars.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/models/attachments.js b/models/attachments.js index 2b2813734..bb7702580 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { FilesCollection } from 'meteor/ostrio:files'; +import { createBucket } from './lib/grid/createBucket'; +import fs from 'fs'; import path from 'path'; import { AttachmentStoreStrategyFilesystem, AttachmentStoreStrategyGridFs} from '/models/lib/attachmentStoreStrategy'; import FileStoreStrategyFactory, {moveToStorage, STORAGE_NAME_FILESYSTEM, STORAGE_NAME_GRIDFS} from '/models/lib/fileStoreStrategy'; diff --git a/models/avatars.js b/models/avatars.js index 739d2e550..1d038d075 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -1,5 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { FilesCollection } from 'meteor/ostrio:files'; +import { createBucket } from './lib/grid/createBucket'; +import fs from 'fs'; import path from 'path'; import FileStoreStrategyFactory, { FileStoreStrategyFilesystem, FileStoreStrategyGridFs} from '/models/lib/fileStoreStrategy'; From fbb4f0c9336bd55207a91c9ced019acc889efa8d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 02:06:58 +0300 Subject: [PATCH 101/246] Updated dependencies. --- package-lock.json | 428 +++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 388 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9f88526b..b70833d89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -261,9 +261,9 @@ } }, "@braintree/sanitize-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", - "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" }, "@fast-csv/format": { "version": "4.3.5", @@ -408,20 +408,20 @@ "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==" }, "@wekanteam/cli-table3": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.3.tgz", - "integrity": "sha512-P8utbj+no50cRDlkq21dJC68kjVigl/dPStXJLRFxndgHELC1N0mYIdwQLDBi9DsouUBFcjSP3rtewu0/Z23Ug==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", + "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", "requires": { "string-width": "^5.1.2" } }, "@wekanteam/markdown-it-mermaid": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.3.tgz", - "integrity": "sha512-voYErAXo/pp8qXOO/lX6odNldonQ4mhvOR4JBwUkPzfg2QxKCp8qE4rRKXbNYrwCvEnsM4dhOEpqjFWnqLUK7w==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", + "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", "requires": { - "@wekanteam/cli-table3": "^0.7.3", - "mermaid": "^8.14.0" + "@wekanteam/cli-table3": "^0.7.6", + "mermaid": "^9.0.1" } }, "abbrev": { @@ -454,6 +454,14 @@ "uri-js": "^4.2.2" } }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -467,6 +475,14 @@ "color-convert": "^1.9.0" } }, + "app-path": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/app-path/-/app-path-3.3.0.tgz", + "integrity": "sha512-EAgEXkdcxH1cgEePOSsmUtw9ItPl0KTxnh/pj9ZbhvbKbij9x0oX6PWpGnorDr0DS5AosLgoa5n3T/hZmKQpYA==", + "requires": { + "execa": "^1.0.0" + } + }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -963,10 +979,42 @@ "readable-stream": "^3.4.0" } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "cypress-image-snapshot": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cypress-image-snapshot/-/cypress-image-snapshot-4.0.1.tgz", + "integrity": "sha512-PBpnhX/XItlx3/DAk5ozsXQHUi72exybBNH5Mpqj1DVmjq+S5Jd9WE5CRa4q5q0zuMZb2V2VpXHth6MjFpgj9Q==", + "requires": { + "chalk": "^2.4.1", + "fs-extra": "^7.0.1", + "glob": "^7.1.3", + "jest-image-snapshot": "4.2.0", + "pkg-dir": "^3.0.0", + "term-img": "^4.0.0" + } + }, "d3": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.3.0.tgz", - "integrity": "sha512-MDRLJCMK232OJQRqGljQ/gCxtB8k3/sLKFjftMjzPB3nKVUODpdW9Rb3vcq7U8Ka5YKoZkAmp++Ur6I+6iNWIw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", + "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", "requires": { "d3-array": "3", "d3-axis": "3", @@ -1001,9 +1049,9 @@ } }, "d3-array": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", - "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", + "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", "requires": { "internmap": "1 - 2" } @@ -1039,9 +1087,9 @@ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", - "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, "d3-contour": { "version": "3.0.1", @@ -1120,9 +1168,9 @@ } }, "d3-hierarchy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", - "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" }, "d3-interpolate": { "version": "3.0.1", @@ -1696,6 +1744,20 @@ "uuid": "^8.3.0" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -1792,6 +1854,16 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -1894,6 +1966,19 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -1912,6 +1997,11 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "glur": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", + "integrity": "sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok=" + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -1933,6 +2023,21 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2034,11 +2139,21 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -2058,6 +2173,81 @@ "semver": "^6.3.0" } }, + "iterm2-version": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-4.2.0.tgz", + "integrity": "sha512-IoiNVk4SMPu6uTcK+1nA5QaHNok2BMDLjSl5UomrOixe5g4GkylhPwuiGdw00ysSCrXAKNMfFTu+u/Lk5f6OLQ==", + "requires": { + "app-path": "^3.2.0", + "plist": "^3.0.1" + } + }, + "jest-image-snapshot": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-4.2.0.tgz", + "integrity": "sha512-6aAqv2wtfOgxiJeBayBCqHo1zX+A12SUNNzo7rIxiXh6W6xYVu8QyHWkada8HeRi+QUTHddp0O0Xa6kmQr+xbQ==", + "requires": { + "chalk": "^1.1.3", + "get-stdin": "^5.0.1", + "glur": "^1.1.2", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "pixelmatch": "^5.1.0", + "pngjs": "^3.4.0", + "rimraf": "^2.6.2", + "ssim.js": "^3.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "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" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "jquery": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", @@ -2109,6 +2299,14 @@ "minimist": "^1.2.5" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jszip": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", @@ -2409,26 +2607,20 @@ "optional": true }, "mermaid": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.14.0.tgz", - "integrity": "sha512-ITSHjwVaby1Li738sxhF48sLTxcNyUAoWfoqyztL1f7J6JOLpHOuQPNLBb6lxGPUA0u7xP9IRULgvod0dKu35A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.0.1.tgz", + "integrity": "sha512-TXXffALLhCACez+MUky4cOOcGXEXiJhHwN8eRV7bBqD8F6KdcjssyPZClVgzrC2KQzSGLqQkj7ce8ea7MhWz+Q==", "requires": { - "@braintree/sanitize-url": "^3.1.0", + "@braintree/sanitize-url": "^6.0.0", + "cypress-image-snapshot": "^4.0.1", "d3": "^7.0.0", "dagre": "^0.8.5", "dagre-d3": "^0.6.4", - "dompurify": "2.3.5", + "dompurify": "2.3.6", "graphlib": "^2.1.8", "khroma": "^1.4.1", "moment-mini": "^2.24.0", "stylis": "^4.0.10" - }, - "dependencies": { - "dompurify": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", - "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==" - } } }, "message-box": { @@ -3328,6 +3520,11 @@ "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "nise": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", @@ -3383,6 +3580,14 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -3425,11 +3630,15 @@ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -3446,8 +3655,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "page": { "version": "1.11.6", @@ -3478,6 +3686,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "path-to-regexp": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", @@ -3503,6 +3716,75 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "pixelmatch": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", + "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", + "requires": { + "pngjs": "^4.0.1" + }, + "dependencies": { + "pngjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", + "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==" + } + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", + "requires": { + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" + } + }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", @@ -3530,6 +3812,15 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3689,6 +3980,19 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3781,6 +4085,11 @@ "memory-pager": "^1.0.2" } }, + "ssim.js": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ssim.js/-/ssim.js-3.5.0.tgz", + "integrity": "sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==" + }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3814,10 +4123,15 @@ "ansi-regex": "^6.0.1" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.0.tgz", + "integrity": "sha512-SrSDzNasOCBTo7C2N9geFwydg/2bmdkWXd4gJirtq82m5JBYtR2+Ialck8czmfBLIdPxCOotlgJESPa8C1RqvA==" }, "supports-color": { "version": "5.5.0", @@ -3871,6 +4185,15 @@ } } }, + "term-img": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/term-img/-/term-img-4.1.0.tgz", + "integrity": "sha512-DFpBhaF5j+2f7kheKFc1ajsAUUDGOaNPpKPtiIMxlbfud6mvfFZuWGnTRpaujUa5J7yl6cIw/h6nyr4mSsENPg==", + "requires": { + "ansi-escapes": "^4.1.0", + "iterm2-version": "^4.1.0" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -3921,6 +4244,11 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -3932,6 +4260,11 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -4040,6 +4373,14 @@ "webidl-conversions": "^3.0.0" } }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -4092,6 +4433,11 @@ "async-limiter": "~1.0.0" } }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index d34478e04..9f243c1fe 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4", "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.2", + "@wekanteam/markdown-it-mermaid": "^0.5.4", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", From 50ce0ce442d804bf1d9eacacba3b493761ca6773 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 16:18:48 +0300 Subject: [PATCH 102/246] Added --trace-warnings to start-wekan.sh. Thanks to xet7 ! --- start-wekan.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-wekan.sh b/start-wekan.sh index eea76c9c7..184ef482a 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -508,7 +508,7 @@ # Add more Node heap: export NODE_OPTIONS="--max_old_space_size=4096" # Add more stack: - bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js" + bash -c "ulimit -s 65500; exec node --stack-size=65500 --trace-warnings main.js" #node main.js #--------------------------------------------------------------------- # & >> ../../wekan.log From 3fb709ed70d8a2a823116bb348f7a02b1600afa9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 16:23:14 +0300 Subject: [PATCH 103/246] Added --trace-warnings to meteor dev. Thanks to xet7 ! --- rebuild-wekan.sh | 6 +++--- start-wekan.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index c61a556ad..c024ed93b 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -110,14 +110,14 @@ do ;; "Run Meteor for dev on http://localhost:4000") - WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 + WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096 --trace-warnings" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 break ;; "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000") IPADDRESS=$(ip a | grep 'noprefixroute' | grep 'inet ' | cut -d: -f2 | awk '{ print $2}' | cut -d '/' -f 1) echo "Your IP address is $IPADDRESS" - WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 + WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096 --trace-warnings" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 break ;; @@ -128,7 +128,7 @@ do echo "On what port you would like to run Wekan?" read PORT echo "ROOT_URL=http://$IPADDRESS:$PORT" - WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:$PORT meteor run --exclude-archs web.browser.legacy,web.cordova --port $PORT + WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096 --trace-warnings" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:$PORT meteor run --exclude-archs web.browser.legacy,web.cordova --port $PORT break ;; diff --git a/start-wekan.sh b/start-wekan.sh index 184ef482a..eea76c9c7 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -508,7 +508,7 @@ # Add more Node heap: export NODE_OPTIONS="--max_old_space_size=4096" # Add more stack: - bash -c "ulimit -s 65500; exec node --stack-size=65500 --trace-warnings main.js" + bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js" #node main.js #--------------------------------------------------------------------- # & >> ../../wekan.log From a196a5ed63cba2b812b9e825172f3a97d9756daa Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Fri, 22 Apr 2022 16:32:28 +0300 Subject: [PATCH 104/246] Updated MongoDB 5 rawCollection deprecated update to updateMany (or updateOne). Thanks to xet7 ! --- server/migrations.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/migrations.js b/server/migrations.js index 625ec0d17..7641f516d 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -717,7 +717,7 @@ Migrations.add('add-missing-created-and-modified', () => { modifiedAtTables.map(db => db .rawCollection() - .update( + .updateMany( { modifiedAt: { $exists: false } }, { $set: { modifiedAt: new Date() } }, { multi: true }, @@ -725,7 +725,7 @@ Migrations.add('add-missing-created-and-modified', () => { .then(() => db .rawCollection() - .update( + .updateMany( { createdAt: { $exists: false } }, { $set: { createdAt: new Date() } }, { multi: true }, @@ -772,7 +772,7 @@ Migrations.add('fix-incorrect-dates', () => { .rawCollection() .find({ $or: [{ createdAt: { $type: 1 } }, { updatedAt: { $type: 1 } }] }) .forEach(({ _id, createdAt, updatedAt }) => { - t.rawCollection().update( + t.rawCollection().updateMany( { _id }, { $set: { From 3fad014e919be29fc85af754f89b708888d8a98e Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Fri, 22 Apr 2022 11:27:03 +0200 Subject: [PATCH 105/246] Multi-File Storage code was missing after merge - Merge commit was: 68e815580552e2bcdba46f5d6b47bb91332033c0 - Partially resolved by this commit: a34cbf95e84bb46fb4da673fe50333341cc781b1 --- client/components/cards/attachments.jade | 4 ++-- models/attachments.js | 7 ++++++- models/avatars.js | 8 ++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 7c7e2684c..975d21e84 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -20,7 +20,7 @@ template(name="attachmentsGalery") each attachments .attachment-item a.attachment-thumbnail.swipebox(href="{{link}}" title="{{name}}") - if isUploaded + if link if isImage img.attachment-thumbnail-img(src="{{link}}") else if($eq extension 'mp3') @@ -38,7 +38,7 @@ template(name="attachmentsGalery") else span.attachment-thumbnail-ext= extension else - span.attachment-thumbnail-ext= extension + +spinner p.attachment-details = name span.file-size ({{fileSize size}} KB) diff --git a/models/attachments.js b/models/attachments.js index bb7702580..0f46d3568 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -89,7 +89,12 @@ if (Meteor.isServer) { }); Meteor.startup(() => { - Attachments.collection.createIndex({ cardId: 1 }); + Attachments.collection.createIndex({ 'meta.cardId': 1 }); + const storagePath = fileStoreStrategyFactory.storagePath; + if (!fs.existsSync(storagePath)) { + console.log("create storagePath because it doesn't exist: " + storagePath); + fs.mkdirSync(storagePath, { recursive: true }); + } }); } diff --git a/models/avatars.js b/models/avatars.js index 1d038d075..49fd4c8af 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -59,6 +59,14 @@ if (Meteor.isServer) { remove: isOwner, fetch: ['userId'], }); + + Meteor.startup(() => { + const storagePath = fileStoreStrategyFactory.storagePath; + if (!fs.existsSync(storagePath)) { + console.log("create storagePath because it doesn't exist: " + storagePath); + fs.mkdirSync(storagePath, { recursive: true }); + } + }); } export default Avatars; From 3f250a17fdbbd8388ac4e4231c59555f09d93130 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Fri, 22 Apr 2022 11:29:46 +0200 Subject: [PATCH 106/246] .devcontainer changed for Meteor 2.7.1 build --- .devcontainer/Dockerfile | 6 ------ .devcontainer/docker-compose.yml | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index bb7759152..1b1b0d5e6 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -220,12 +220,6 @@ RUN set -o xtrace \ USER wekan -RUN \ - set -o xtrace && \ - sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \ - cd /home/wekan/.meteor && \ - /home/wekan/.meteor/meteor -- help; - RUN \ set -o xtrace && \ # Build app diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index cbb7ca08e..ecfbedaf2 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -42,7 +42,7 @@ services: - ../client:/home/wekan/app/client - ../models:/home/wekan/app/models - ../config:/home/wekan/app/config - - ../i18n:/home/wekan/app/i18n + - ../imports:/home/wekan/app/imports - ../server:/home/wekan/app/server - ../public:/home/wekan/app/public From d1714abc6a13783600c68526c259967886dbe80d Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 27 Apr 2022 12:59:14 +0200 Subject: [PATCH 107/246] Card Details dates in user language format --- client/components/cards/cardDate.js | 2 +- client/lib/datepicker.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index ca3af61c0..40002dd73 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index 7138c366b..ee9ddea02 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -1,5 +1,5 @@ import { TAPi18n } from '/imports/i18n'; -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; // Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours function adjustedTimeFormat() { From 2e5ec0308f2ac8059af6219693177e294197776a Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 27 Apr 2022 13:00:43 +0200 Subject: [PATCH 108/246] Adjust all other moment imports to moment-with-locales --- client/components/cards/cardCustomFields.js | 2 +- client/components/cards/cardDetails.js | 2 +- client/config/blazeHelpers.js | 2 +- client/lib/filter.js | 2 +- config/query-classes.js | 2 +- models/cards.js | 2 +- models/exporter.js | 2 +- models/server/ExporterExcel.js | 2 +- models/trelloCreator.js | 2 +- models/wekanCreator.js | 2 +- server/publications/cards.js | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/components/cards/cardCustomFields.js b/client/components/cards/cardCustomFields.js index 6dafd8e4d..c4559c3f0 100644 --- a/client/components/cards/cardCustomFields.js +++ b/client/components/cards/cardCustomFields.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; import Cards from '/models/cards'; diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 320ed7cd2..f8350a1c0 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; import Cards from '/models/cards'; diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index 715803ef6..a7c31f8de 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -1,6 +1,6 @@ import { Blaze } from 'meteor/blaze'; import { Session } from 'meteor/session'; -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; Blaze.registerHelper('currentBoard', () => { const ret = Utils.getCurrentBoard(); diff --git a/client/lib/filter.js b/client/lib/filter.js index d1d5669e9..9dd48abfb 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; // Filtered view manager // We define local filter objects for each different type of field (SetFilter, diff --git a/config/query-classes.js b/config/query-classes.js index be3b098f8..ae6153fc0 100644 --- a/config/query-classes.js +++ b/config/query-classes.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { OPERATOR_ASSIGNEE, diff --git a/models/cards.js b/models/cards.js index ae34c50f6..c6bf0cdd7 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { ALLOWED_COLORS, TYPE_CARD, diff --git a/models/exporter.js b/models/exporter.js index 5184cd858..273072b04 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; const Papa = require('papaparse'); import { TAPi18n } from '/imports/i18n'; diff --git a/models/server/ExporterExcel.js b/models/server/ExporterExcel.js index e5656626f..9daf80dbe 100644 --- a/models/server/ExporterExcel.js +++ b/models/server/ExporterExcel.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { createWorkbook } from './createWorkbook'; diff --git a/models/trelloCreator.js b/models/trelloCreator.js index 15bb9e1f5..c34fdb6f0 100644 --- a/models/trelloCreator.js +++ b/models/trelloCreator.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; const DateString = Match.Where(function(dateAsString) { diff --git a/models/wekanCreator.js b/models/wekanCreator.js index c643d8ddd..b48af847c 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; const DateString = Match.Where(function(dateAsString) { check(dateAsString, String); diff --git a/server/publications/cards.js b/server/publications/cards.js index 9530e2724..6430a2720 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -1,4 +1,4 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import escapeForRegex from 'escape-string-regexp'; import Users from '../../models/users'; import Boards from '../../models/boards'; From 441b3e9c0a50b21da2c875946ff1059a14ce04e4 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Wed, 27 Apr 2022 13:03:01 +0200 Subject: [PATCH 109/246] Change date format to L (include 0 on short days/month) --- client/components/cards/cardDate.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 40002dd73..01abe9279 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -319,31 +319,31 @@ CardCustomFieldDate.register('cardCustomFieldDate'); (class extends CardReceivedDate { showDate() { - return this.date.get().format('l'); + return this.date.get().format('L'); } }.register('minicardReceivedDate')); (class extends CardStartDate { showDate() { - return this.date.get().format('l'); + return this.date.get().format('L'); } }.register('minicardStartDate')); (class extends CardDueDate { showDate() { - return this.date.get().format('l'); + return this.date.get().format('L'); } }.register('minicardDueDate')); (class extends CardEndDate { showDate() { - return this.date.get().format('l'); + return this.date.get().format('L'); } }.register('minicardEndDate')); (class extends CardCustomFieldDate { showDate() { - return this.date.get().format('l'); + return this.date.get().format('L'); } }.register('minicardCustomFieldDate')); @@ -360,7 +360,7 @@ class VoteEndDate extends CardDate { return classes; } showDate() { - return this.date.get().format('l LT'); + return this.date.get().format('L LT'); } showTitle() { return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`; From 567be456befa19acc882ee10a01bbabf80f9ddf5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 28 Apr 2022 20:22:16 +0300 Subject: [PATCH 110/246] Upgraded to Meteor 2.7.2-rc.0 . Thanks to Meteor developers ! Related https://github.com/meteor/meteor/pull/11999#issuecomment-1112461873 --- .meteor/packages | 2 +- .meteor/release | 2 +- .meteor/versions | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index bb1a39465..601cd7b32 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -22,7 +22,7 @@ cottz:publish-relations dburles:collection-helpers idmontie:migrations matteodem:easy-search -mongo@1.15.0-beta272.0 +mongo@1.15.0-rc272.0 mquandalle:collection-mutations # Account system diff --git a/.meteor/release b/.meteor/release index 375811b97..a57cf27ad 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.2-beta.0 +METEOR@2.7.2-rc.0 diff --git a/.meteor/versions b/.meteor/versions index afed8e1e5..5896492cd 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,4 +1,4 @@ -accounts-base@2.2.3-beta272.0 +accounts-base@2.2.3-rc272.0 accounts-password@2.3.1 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 @@ -102,11 +102,11 @@ minifier-js@2.7.4 minifiers@1.1.8-faster-rebuild.0 minimongo@1.8.0 mobile-status-bar@1.1.0 -modern-browsers@0.1.8-beta272.0 +modern-browsers@0.1.8-rc272.0 modules@0.18.0 modules-runtime@0.13.0 momentjs:moment@2.29.3 -mongo@1.15.0-beta272.0 +mongo@1.15.0-rc272.0 mongo-decimal@0.1.3 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -205,7 +205,7 @@ simple:json-routes@2.3.1 simple:rest-accounts-password@1.2.1 simple:rest-bearer-token-parser@1.1.1 simple:rest-json-error-handler@1.1.1 -socket-stream-client@0.5.0-beta272.0 +socket-stream-client@0.5.0-rc272.0 spacebars@1.3.0 spacebars-compiler@1.3.1 standard-minifier-css@1.8.1 From 58d760a615834f989633efcd5e1577265219af19 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Sat, 30 Apr 2022 01:07:24 +0200 Subject: [PATCH 111/246] FileStoreStrategy, moveToStorage, wrong variable in error handling --- models/lib/fileStoreStrategy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index d8f0cc15b..5ec438fa3 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -312,11 +312,11 @@ export const moveToStorage = function(fileObj, storageDestination, fileStoreStra const writeStream = strategyWrite.getWriteStream(filePath); writeStream.on('error', error => { - console.error('[writeStream error]: ', error, fileObjId); + console.error('[writeStream error]: ', error, fileObj._id); }); readStream.on('error', error => { - console.error('[readStream error]: ', error, fileObjId); + console.error('[readStream error]: ', error, fileObj._id); }); writeStream.on('finish', Meteor.bindEnvironment((finishedData) => { From fbb0ed5ec19c39da2dded4ea3e6926d9ab3f31d1 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Sat, 30 Apr 2022 01:07:55 +0200 Subject: [PATCH 112/246] Board copy work now again - there was an error at attachment copy - fixes: https://github.com/wekan/wekan/issues/4485#issue-1211353265 --- client/components/boards/boardsList.js | 3 +- models/cards.js | 13 ++++--- models/lib/fileStoreStrategy.js | 52 ++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index c6ce48af6..b1dcc2d79 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -260,7 +260,7 @@ BlazeComponent.extendComponent({ }, (err, res) => { if (err) { - self.setError(err.error); + console.error(err); } else { Session.set('fromBoard', null); subManager.subscribe('board', res, false); @@ -268,7 +268,6 @@ BlazeComponent.extendComponent({ id: res, slug: title, }); - //Utils.goBoardId(res); } }, ); diff --git a/models/cards.js b/models/cards.js index c6bf0cdd7..0b926f4b6 100644 --- a/models/cards.js +++ b/models/cards.js @@ -5,7 +5,8 @@ import { TYPE_LINKED_BOARD, TYPE_LINKED_CARD, } from '../config/const'; -import Attachments from "./attachments"; +import Attachments, { fileStoreStrategyFactory } from "./attachments"; +import { copyFile } from './lib/fileStoreStrategy.js'; Cards = new Mongo.Collection('cards'); @@ -586,11 +587,11 @@ Cards.helpers({ const _id = Cards.insert(this); // Copy attachments - oldCard.attachments().forEach(att => { - att.cardId = _id; - delete att._id; - return Attachments.insert(att); - }); + oldCard.attachments() + .map(att => att.get()) + .forEach(att => { + copyFile(att, _id, fileStoreStrategyFactory); + }); // copy checklists Checklists.find({ cardId: oldId }).forEach(ch => { diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index 5ec438fa3..e184b2fdf 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -336,3 +336,55 @@ export const moveToStorage = function(fileObj, storageDestination, fileStoreStra } }); }; + +export const copyFile = function(fileObj, newCardId, fileStoreStrategyFactory) { + const versionName = "original"; + const strategyRead = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName); + const readStream = strategyRead.getReadStream(); + const strategyWrite = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName, STORAGE_NAME_FILESYSTEM); + + const tempPath = path.join(fileStoreStrategyFactory.storagePath, Random.id() + "-" + versionName + "-" + fileObj.name); + const writeStream = strategyWrite.getWriteStream(tempPath); + + writeStream.on('error', error => { + console.error('[writeStream error]: ', error, fileObj._id); + }); + + readStream.on('error', error => { + console.error('[readStream error]: ', error, fileObj._id); + }); + + // https://forums.meteor.com/t/meteor-code-must-always-run-within-a-fiber-try-wrapping-callbacks-that-you-pass-to-non-meteor-libraries-with-meteor-bindenvironmen/40099/8 + readStream.on('end', Meteor.bindEnvironment(() => { + const fileId = Random.id(); + Attachments.addFile( + tempPath, + { + fileName: fileObj.name, + type: fileObj.type, + meta: { + boardId: fileObj.meta.boardId, + cardId: newCardId, + listId: fileObj.meta.listId, + swimlaneId: fileObj.meta.swimlaneId, + source: 'copy', + copyFrom: fileObj._id, + }, + userId: fileObj.userId, + size: fileObj.fileSize, + fileId, + }, + (err, fileRef) => { + if (err) { + console.log(err); + } else { + // Set the userId again + Attachments.update({ _id: fileRef._id }, { $set: { userId: fileObj.userId } }); + } + }, + true, + ); + })); + + readStream.pipe(writeStream); +}; From 000e27a4a158a1efc3e57303347a5ea516c31fde Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Sat, 30 Apr 2022 20:07:03 +0200 Subject: [PATCH 113/246] Board copy moves the attachments to the "copied from board storage" --- models/attachments.js | 3 ++- models/lib/fileStoreStrategy.js | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/models/attachments.js b/models/attachments.js index 0f46d3568..22e3c979f 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -34,12 +34,13 @@ Attachments = new FilesCollection({ return ret; }, onAfterUpload(fileObj) { + let storage = fileObj.meta.copyStorage || STORAGE_NAME_GRIDFS; // current storage is the filesystem, update object and database Object.keys(fileObj.versions).forEach(versionName => { fileObj.versions[versionName].storage = STORAGE_NAME_FILESYSTEM; }); Attachments.update({ _id: fileObj._id }, { $set: { "versions" : fileObj.versions } }); - moveToStorage(fileObj, STORAGE_NAME_GRIDFS, fileStoreStrategyFactory); + moveToStorage(fileObj, storage, fileStoreStrategyFactory); }, interceptDownload(http, fileObj, versionName) { const ret = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName).interceptDownload(http, this.cacheControl); diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index e184b2fdf..5d43ae3dd 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -369,6 +369,7 @@ export const copyFile = function(fileObj, newCardId, fileStoreStrategyFactory) { swimlaneId: fileObj.meta.swimlaneId, source: 'copy', copyFrom: fileObj._id, + copyStorage: strategyRead.getStorageName(), }, userId: fileObj.userId, size: fileObj.fileSize, From 40aae378b6618ac34657399d53b216efaf0343fd Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 2 May 2022 02:58:40 +0300 Subject: [PATCH 114/246] Updated translations. --- imports/i18n/data/es.i18n.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index c958e24c4..5687dbda5 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -217,7 +217,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "¿Eliminar la tarjeta?", - "cardArchivePopup-title": "Archive Card?", + "cardArchivePopup-title": "¿Archivar tarjeta?", "cardDetailsActionsPopup-title": "Acciones de la tarjeta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Miembros", @@ -279,8 +279,8 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Solo puedes comentar en las tarjetas.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", + "comment-delete": "¿Seguro que quieres borrar el comentario?", + "deleteCommentPopup-title": "¿Borrar comentario?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", "worker": "Trabajador", @@ -288,7 +288,7 @@ "computer": "el ordenador", "confirm-subtask-delete-popup": "¿Seguro que quieres eliminar la subtarea?", "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", + "subtaskDeletePopup-title": "¿Borrar subtarea?", "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", "copy-text-to-clipboard": "Copy text to clipboard", From f260b7ba889c39a2db4a5f3057439a9b78dd7cf1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 2 May 2022 23:30:01 +0300 Subject: [PATCH 115/246] Added Sandstorm Accounts. --- .meteor/packages | 2 +- .meteor/versions | 2 +- packages/wekan-accounts-sandstorm/.gitignore | 3 + .../.test-app/.meteor/.finished-upgraders | 17 ++ .../.test-app/.meteor/.gitignore | 1 + .../.test-app/.meteor/.id | 7 + .../.test-app/.meteor/packages | 31 +++ .../.test-app/.meteor/platforms | 2 + .../.test-app/.meteor/release | 1 + .../.test-app/.meteor/versions | 83 +++++++ .../.test-app/accounts-meteor-test.css | 1 + .../.test-app/accounts-meteor-test.html | 19 ++ .../.test-app/accounts-meteor-test.js | 48 ++++ .../packages/kenton:accounts-sandstorm | 1 + .../.test-app/sandstorm-pkgdef.capnp | 74 ++++++ packages/wekan-accounts-sandstorm/LICENSE | 21 ++ packages/wekan-accounts-sandstorm/README.md | 137 ++++++++++++ packages/wekan-accounts-sandstorm/client.js | 186 ++++++++++++++++ packages/wekan-accounts-sandstorm/package.js | 45 ++++ packages/wekan-accounts-sandstorm/server.js | 210 ++++++++++++++++++ 20 files changed, 889 insertions(+), 2 deletions(-) create mode 100644 packages/wekan-accounts-sandstorm/.gitignore create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.id create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/packages create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/release create mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/versions create mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css create mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html create mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js create mode 120000 packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm create mode 100644 packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp create mode 100644 packages/wekan-accounts-sandstorm/LICENSE create mode 100644 packages/wekan-accounts-sandstorm/README.md create mode 100644 packages/wekan-accounts-sandstorm/client.js create mode 100644 packages/wekan-accounts-sandstorm/package.js create mode 100644 packages/wekan-accounts-sandstorm/server.js diff --git a/.meteor/packages b/.meteor/packages index 601cd7b32..96b23a76f 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -26,7 +26,6 @@ mongo@1.15.0-rc272.0 mquandalle:collection-mutations # Account system -kenton:accounts-sandstorm #wekan-ldap #wekan-accounts-cas #wekan-accounts-oidc @@ -142,3 +141,4 @@ useraccounts:unstyled service-configuration@1.3.0 communitypackages:picker simple:rest-accounts-password +wekan-accounts-sandstorm diff --git a/.meteor/versions b/.meteor/versions index 5896492cd..d091ebf74 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -76,7 +76,6 @@ jquery@1.11.11 kadira:blaze-layout@2.3.0 kadira:dochead@1.5.0 kadira:flow-router@2.12.1 -kenton:accounts-sandstorm@0.1.0 konecty:mongo-counter@0.0.5_3 launch-screen@1.3.0 livedata@1.0.18 @@ -225,5 +224,6 @@ useraccounts:flow-routing@1.15.0 useraccounts:unstyled@1.14.2 webapp@1.13.1 webapp-hashing@1.1.0 +wekan-accounts-sandstorm@0.7.0 wekan-markdown@1.0.9 zimme:active-route@2.3.2 diff --git a/packages/wekan-accounts-sandstorm/.gitignore b/packages/wekan-accounts-sandstorm/.gitignore new file mode 100644 index 000000000..b39d80246 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.gitignore @@ -0,0 +1,3 @@ +.build* +test-app/.meteor/local +test-app/.meteor-spk diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders new file mode 100644 index 000000000..910574ce2 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders @@ -0,0 +1,17 @@ +# This file contains information which helps Meteor properly upgrade your +# app when you run 'meteor update'. You should check it into version control +# with your project. + +notices-for-0.9.0 +notices-for-0.9.1 +0.9.4-platform-file +notices-for-facebook-graph-api-2 +1.2.0-standard-minifiers-package +1.2.0-meteor-platform-split +1.2.0-cordova-changes +1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.4.0-remove-old-dev-bundle-link +1.4.1-add-shell-server-package +1.4.3-split-account-service-packages +1.5-add-dynamic-import-package diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore new file mode 100644 index 000000000..408303742 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id new file mode 100644 index 000000000..2b0fce4e8 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +1w4v0yxh077n01wrnl8j diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages b/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages new file mode 100644 index 000000000..68bc73b73 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages @@ -0,0 +1,31 @@ +# Meteor packages used by this project, one per line. +# Check this file (and the other files in this directory) into your repository. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +# List accounts-sandstorm first so that any missing dependencies it has +# are discovered. +kenton:accounts-sandstorm + +# Optional dependency. Should still work commented-out. +accounts-base@1.3.1 + +meteor-base@1.1.0 # Packages every Meteor app needs to have +mobile-experience@1.0.4 # Packages for a great mobile UX +mongo@1.1.19 # The database Meteor supports right now +blaze-html-templates # Compile .html files into Meteor Blaze views +session@1.1.7 # Client-side reactive dictionary for your app +jquery@1.11.10 # Helpful client-side library +tracker@1.1.3 # Meteor's client-side reactive programming library + +es5-shim@4.6.15 # ECMAScript 5 compatibility for older browsers. +ecmascript@0.8.1 # Enable ECMAScript2015+ syntax in app code + +autopublish@1.0.7 # Publish all data to the clients (for prototyping) +insecure@1.0.7 # Allow all DB writes from clients (for prototyping) + +standard-minifier-css +standard-minifier-js +shell-server +dynamic-import diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms b/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms new file mode 100644 index 000000000..efeba1b50 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms @@ -0,0 +1,2 @@ +server +browser diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/release b/packages/wekan-accounts-sandstorm/.test-app/.meteor/release new file mode 100644 index 000000000..1e7fc5b56 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/release @@ -0,0 +1 @@ +METEOR@1.5.1 diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions b/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions new file mode 100644 index 000000000..c72576ee5 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions @@ -0,0 +1,83 @@ +accounts-base@1.3.1 +allow-deny@1.0.6 +autopublish@1.0.7 +autoupdate@1.3.12 +babel-compiler@6.19.4 +babel-runtime@1.0.1 +base64@1.0.10 +binary-heap@1.0.10 +blaze@2.3.2 +blaze-html-templates@1.1.2 +blaze-tools@1.0.10 +boilerplate-generator@1.1.1 +caching-compiler@1.1.9 +caching-html-compiler@1.1.2 +callback-hook@1.0.10 +check@1.2.5 +ddp@1.3.0 +ddp-client@2.0.0 +ddp-common@1.2.9 +ddp-rate-limiter@1.0.7 +ddp-server@2.0.0 +deps@1.0.12 +diff-sequence@1.0.7 +dynamic-import@0.1.1 +ecmascript@0.8.2 +ecmascript-runtime@0.4.1 +ecmascript-runtime-client@0.4.3 +ecmascript-runtime-server@0.4.1 +ejson@1.0.13 +es5-shim@4.6.15 +fastclick@1.0.13 +geojson-utils@1.0.10 +hot-code-push@1.0.4 +html-tools@1.0.11 +htmljs@1.0.11 +http@1.2.12 +id-map@1.0.9 +insecure@1.0.7 +jquery@1.11.10 +kenton:accounts-sandstorm@0.7.0 +launch-screen@1.1.1 +livedata@1.0.18 +localstorage@1.1.1 +logging@1.1.17 +meteor@1.7.1 +meteor-base@1.1.0 +minifier-css@1.2.16 +minifier-js@2.1.1 +minimongo@1.2.1 +mobile-experience@1.0.4 +mobile-status-bar@1.0.14 +modules@0.9.4 +modules-runtime@0.8.0 +mongo@1.1.22 +mongo-id@1.0.6 +npm-mongo@2.2.30 +observe-sequence@1.0.16 +ordered-dict@1.0.9 +promise@0.8.9 +random@1.0.10 +rate-limit@1.0.8 +reactive-dict@1.1.9 +reactive-var@1.0.11 +reload@1.1.11 +retry@1.0.9 +routepolicy@1.0.12 +service-configuration@1.0.11 +session@1.1.7 +shell-server@0.2.4 +spacebars@1.0.15 +spacebars-compiler@1.1.3 +standard-minifier-css@1.3.4 +standard-minifier-js@2.1.1 +templating@1.3.2 +templating-compiler@1.3.2 +templating-runtime@1.3.2 +templating-tools@1.1.2 +tracker@1.1.3 +ui@1.0.13 +underscore@1.0.10 +url@1.1.0 +webapp@1.3.17 +webapp-hashing@1.0.9 diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css new file mode 100644 index 000000000..b6b4052b4 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css @@ -0,0 +1 @@ +/* CSS declarations go here */ diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html new file mode 100644 index 000000000..c7ce7638b --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html @@ -0,0 +1,19 @@ +<head> + <title>accounts-meteor-test + + + +

Welcome to Meteor!

+ + {{> hello}} + + + diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js new file mode 100644 index 000000000..9e5539e45 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js @@ -0,0 +1,48 @@ +if (Meteor.isClient) { + var Info = new Mongo.Collection("info"); + var Counter = new Mongo.Collection("counter"); + + Template.hello.onCreated(function () { + Meteor.subscribe("info"); + Meteor.subscribe("counter"); + }); + + Template.hello.helpers({ + counter: function () { + if (!Template.instance().subscriptionsReady()) return "not ready"; + return Counter.findOne("counter").counter; + }, + + serverInfo: function () { + var obj = Info.findOne("info"); + console.log("server", Meteor.loggingIn && Meteor.loggingIn(), obj); + return JSON.stringify(obj, null, 2); + }, + + clientInfo: function () { + var obj = Meteor.sandstormUser(); + console.log("client", Meteor.loggingIn && Meteor.loggingIn(), obj); + return JSON.stringify(obj, null, 2); + }, + }); +} + +if (Meteor.isServer) { + Meteor.startup(function () { + // code to run on server at startup + }); + + Meteor.publish("info", function () { + var user = Meteor.users && this.userId && Meteor.users.findOne(this.userId); + this.added("info", "info", {userId: this.userId, user: user, sandstormUser: this.connection.sandstormUser(), + sessionId: this.connection.sandstormSessionId(), + tabId: this.connection.sandstormTabId()}); + this.ready(); + }); + + var counter = 0; + Meteor.publish("counter", function () { + this.added("counter", "counter", {counter: counter++}); + this.ready(); + }); +} diff --git a/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm b/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm new file mode 120000 index 000000000..c25bddb6d --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm @@ -0,0 +1 @@ +../.. \ No newline at end of file diff --git a/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp b/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp new file mode 100644 index 000000000..a2df64a0c --- /dev/null +++ b/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp @@ -0,0 +1,74 @@ +@0xb412d6a17c04e5cc; + +using Spk = import "/sandstorm/package.capnp"; + +const pkgdef :Spk.PackageDefinition = ( + id = "y49n7yrxk6p3ud1hkgeup1mah6f7a488nancvay7v6y1wxq78cn0", + + manifest = ( + appTitle = (defaultText = "Meteor Accounts Test App"), + appVersion = 0, + appMarketingVersion = (defaultText = "0.0.0"), + actions = [ + ( title = (defaultText = "New Test"), + command = .myCommand + ) + ], + + continueCommand = .myCommand, + ), + + sourceMap = ( + searchPath = [ + ( sourcePath = ".meteor-spk/deps" ), + ( sourcePath = ".meteor-spk/bundle" ) + ] + ), + + alwaysInclude = [ "." ], + + bridgeConfig = ( + viewInfo = ( + permissions = [ + ( + name = "editor", + title = (defaultText = "editor"), + description = (defaultText = "grants ability to modify data"), + ), + ( + name = "commenter", + title = (defaultText = "commenter"), + description = (defaultText = "grants ability to modify data"), + ), + ], + roles = [ + ( + title = (defaultText = "editor"), + permissions = [true, true], + verbPhrase = (defaultText = "can edit"), + description = (defaultText = "editors may view all site data and change settings."), + ), + ( + title = (defaultText = "commenter"), + permissions = [false, true], + verbPhrase = (defaultText = "can comment"), + description = (defaultText = "viewers may view what other users have written."), + ), + ( + title = (defaultText = "viewer"), + permissions = [false, false], + verbPhrase = (defaultText = "can view"), + description = (defaultText = "viewers may view what other users have written."), + ), + ], + ), + ), +); + +const myCommand :Spk.Manifest.Command = ( + argv = ["/sandstorm-http-bridge", "4000", "--", "node", "start.js"], + environ = [ + (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), + (key = "SANDSTORM", value = "1"), + ] +); diff --git a/packages/wekan-accounts-sandstorm/LICENSE b/packages/wekan-accounts-sandstorm/LICENSE new file mode 100644 index 000000000..039de6863 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors +Licensed under the MIT License: + +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. + diff --git a/packages/wekan-accounts-sandstorm/README.md b/packages/wekan-accounts-sandstorm/README.md new file mode 100644 index 000000000..17ad0d5e8 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/README.md @@ -0,0 +1,137 @@ +# Sandstorm.io login integration for Meteor.js + +[Sandstorm](https://sandstorm.io) is a platform for personal clouds that makes +installing apps to your personal server as easy as installing apps to your +phone. + +[Meteor](https://meteor.com) is a revolutionary web app framework. Sandstorm's +own UI is built using Meteor, and Meteor is also a great way to build Sandstorm +apps. + +This package is meant to be used by Meteor apps built to run on Sandstorm. +It integrates with Sandstorm's built-in login system to log the user in +automatically when they open the app. The user's `profile.name` will be +populated from Sandstorm. When using this package, you should not use +`accounts-ui` at all; just let login happen automatically. + +## Including in your app + +To use this package in your Meteor project, simply install it from the Meteor +package repository: + + meteor add kenton:accounts-sandstorm + +To package a Meteor app for Sandstorm, see +[the Meteor app packaging guide](https://docs.sandstorm.io/en/latest/vagrant-spk/packaging-tutorial-meteor/). + +Note that this package does nothing if the `SANDSTORM` environment variable is +not set. Therefore, it is safe to include the package even in non-Sandstorm +builds of your app. Note that `sandstorm-pkgdef.capnp` files generated by +`spk init` automatically have a line like `(key = "SANDSTORM", value = "1"),` +which sets the environment variable, so you shouldn't have to do anything +special to enable it. + +Conversely, when `SANDSTORM` is set, this package will enter Highlander Mode +in which it will *disable* all other accounts packages. This makes it safe +to include those other accounts packages in the Sandstorm build, which is +often convenient, although they will add bloat to your spk. + +## Usage + +* On the client, call `Meteor.sandstormUser()`. (This is a reactive data source.) +* In a method or publish (on the server), call `this.connection.sandstormUser()`. + +Either of these will return an object containing the following fields: + +* `id`: From `X-Sandstorm-User-Id`; globally unique and stable + identifier for this user. `null` if the user is not logged in. +* `name`: From "X-Sandstorm-Username`, the user's display name (e.g. + `"Kenton Varda"`). +* `picture`: From `X-Sandstorm-User-Picture`, URL of the user's preferred + avatar, or `null` if they don't have one. +* `permissions`: From `X-Sandstorm-Permissions` (but parsed to a list), + the list of permissions the user has as determined by the Sandstorm + sharing model. Apps can define their own permissions. +* `preferredHandle`: From `X-Sandstorm-Preferred-Handle`, the user's + preferred handle ("username", in the unix sense). This is NOT + guaranteed to be unique; it's just a different form of display name. +* `pronouns`: From `X-Sandstorm-User-Pronouns`, indicates the pronouns + by which the user prefers to be referred. + +See [the Sandstorm docs](https://docs.sandstorm.io/en/latest/developing/auth/#headers-that-an-app-receives) for more information about these fields. + +Note that `sandstormUser()` may return `null` on the client side if the login +handshake has not completed yet (`Meteor.loggingIn()` returns `true` during +this time). It never returns `null` on the server, but it may throw an +exception if the client skipped the authentication handshake (which indicates +the client is not running accounts-sandstorm, which is rather suspicious!). + +## Synchronization with Meteor Accounts + +`accounts-sandstorm` does NOT require `accounts-base`. However, if you do +include `accounts-base` in your dependencies, then `accounts-sandstorm` will +integrate with it in order to store information about users seen previously. +In particular: + +* A Meteor account will be automatically created for each logged-in Sandstorm user, + the first time they visit the grain. +* In the `Meteor.users` table, `services.sandstorm` will contain the same data + returned by `Meteor.sandstormUser()`. +* `Meteor.loggingIn()` will return `true` during the initial handshake (when + `sandstormUser()` would return `null`). + +Please note, however, that you should prefer `sandstormUser()` over +`Meteor.user().services.sandstorm` whenever possible, **especially** for enforcing +permissions, for a few reasons: + +* Anonymous users do NOT get a table entry, therefore `Meteor.user()` will be + `null` for them. However, anonymous users of a sharing link may have permissions! +* Moreover, in the future, anonymous users may additionally be able to assign + themselves names, handles, avatars, etc. The only thing that makes them "anonymous" + is that they have not provided the app with a unique identifier that could be used + to recognize the same user when they visit again later. +* `services.sandstorm` is only updated when the user is online; it may be stale + when they are not present. This implies that when a user's access is revoked, + their user table entry will never be updated again, and will continue to + indicate that they have permissions when they in fact no longer do. + +## Development aids + +`accounts-sandstorm` normally works its magic when running inside Sandstorm. However, +it's often a lot more convenient to develop Meteor apps using Meteor's normal dev tools +which currently cannot run inside Sandstorm. + +Therefore, when *not* running inside Sansdtorm, you may use the following console +function to fake your user information: + + SandstormAccounts.setTestUserInfo({ + id: "12345", + name: "Alice", + // ... other parameters, as listed above ... + }); + +This will cause `accounts-sandstorm` to spoof the `X-Sandstorm-*` headers with the +parameters you provided when it attempts to log in. When actually running inside +Sandstorm, such spoofing is blocked by Sandstorm, but when running outside it will +work and now you can test your app. + +Note that this functionality, like all of the package, is only enabled if you set the +`SANDSTORM` environment variable. So, run `meteor` like so: + + SANDSTORM=1 meteor + +## Migrating from 0.1 + +In version 0.1.x of this puackage, there was no `sandstormUser()` function; the +only mode of operation was through Meteor accounts. This had problems with +permissions and anonymous users as described adove. Introducing `sandstormUser()` +is a huge update. + +For almost all users, 0.2 should be a drop-in replacement for 0.1, only adding +new features. Please note, though, two possible issues: + +* If you did not explicitly depend on `accounts-base` before, you must add this + dependency, since it is no longer implied by `accounts-sansdtorm`. +* The `/.sandstorm-credentials` endpoint no longer exists. If you were directly + fetching this undocumented endpoint before, you will need to switch your code + to use `Meteor.sandstormUser()`. diff --git a/packages/wekan-accounts-sandstorm/client.js b/packages/wekan-accounts-sandstorm/client.js new file mode 100644 index 000000000..61c176fcb --- /dev/null +++ b/packages/wekan-accounts-sandstorm/client.js @@ -0,0 +1,186 @@ +// Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors +// Licensed under the MIT License: +// +// 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 loginWithSandstorm(connection, apiHost, apiToken) { + // Log in the connection using Sandstorm authentication. + // + // After calling this, connection.sandstormUser() will reactively return an object containing + // Sansdstorm user info, including permissions as authenticated by the server. Even if the user + // is anonymous, this information is returned. `sandstormUser()` returns `null` up until the + // point where login succeeds. + + // How this works: + // 1. We create a cryptographically random token, which we're going to send to the server twice. + // 2. We make a method call to log in with this token. The server initially has no idea who + // is calling and will block waiting for info. (The method is marked "wait" on the client side + // so that further method calls are blocked until login completes.) + // 3. We also send an XHR with the same token. When the server receives the XHR, it harvests the + // Sandstorm headers, looks for the corresponding login method call, marks its connection as + // logged in, and then lets it return. + // + // We don't actually use Accounts.callLoginMethod() because we don't need or want the + // "resume token" logic. On a disconnect, we need to re-authenticate, because the user's + // permissions may have changed (indeed, this may be the reason for the disconnect). + + // If the connection doesn't already have a sandstormUser() method, add it now. + if (!connection._sandstormUser) { + connection._sandstormUser = new ReactiveVar(null); + connection.sandstormUser = connection._sandstormUser.get.bind(connection._sandstormUser); + } + + // Generate a random token which we'll send both over an XHR and over DDP at the same time. + var token = Random.secret(); + + var waiting = true; // We'll keep retrying XHRs until the method returns. + var reconnected = false; + + var onResultReceived = function (error, result) { + waiting = false; + + if (error) { + // ignore for now; loggedInAndDataReadyCallback() will get the error too + } else { + connection.onReconnect = function () { + reconnected = true; + loginWithSandstorm(connection, apiHost, apiToken); + }; + } + }; + + var loggedInAndDataReadyCallback = function (error, result) { + if (reconnected) { + // Oh, we're already on a future connection attempt. Don't mess with anything. + return; + } + + if (error) { + console.error("loginWithSandstorm failed:", error); + } else { + connection._sandstormUser.set(result.sandstorm); + connection.setUserId(result.userId); + } + }; + + Meteor.apply("loginWithSandstorm", [token], + {wait: true, onResultReceived: onResultReceived}, + loggedInAndDataReadyCallback); + + var sendXhr = function () { + if (!waiting) return; // Method call finished. + + headers = {"Content-Type": "application/x-sandstorm-login-token"}; + + var testInfo = localStorage.sandstormTestUserInfo; + if (testInfo) { + testInfo = JSON.parse(testInfo); + if (testInfo.id) { + headers["X-Sandstorm-User-Id"] = testInfo.id; + } + if (testInfo.name) { + headers["X-Sandstorm-Username"] = encodeURI(testInfo.name); + } + if (testInfo.picture) { + headers["X-Sandstorm-User-Picture"] = testInfo.picture; + } + if (testInfo.permissions) { + headers["X-Sandstorm-Permissions"] = testInfo.permissions.join(","); + } + if (testInfo.preferredHandle) { + headers["X-Sandstorm-Preferred-Handle"] = testInfo.preferredHandle; + } + if (testInfo.pronouns) { + headers["X-Sandstorm-User-Pronouns"] = testInfo.pronouns; + } + } + + var postUrl = "/.sandstorm-login"; + // Sandstorm mobile apps need to point at a different host and use an Authorization token. + if (apiHost) { + postUrl = apiHost + postUrl; + headers.Authorization = "Bearer " + apiToken; + } + + // Send the token in an HTTP POST request which on the server side will allow us to receive the + // Sandstorm headers. + HTTP.post(postUrl, + {content: token, headers: headers}, + function (error, result) { + if (error) { + console.error("couldn't get /.sandstorm-login:", error); + + if (waiting) { + // Try again in a second. + Meteor.setTimeout(sendXhr, 1000); + } + } + }); + }; + + // Wait until the connection is up before we start trying to send XHRs. + var stopImmediately = false; // Unfortunately, Tracker.autorun() runs the first time inline. + var handle = Tracker.autorun(function () { + if (!waiting) { + if (handle) { + handle.stop(); + } else { + stopImmediately = true; + } + return; + } else if (connection.status().connected) { + if (handle) { + handle.stop(); + } else { + stopImmediately = true; + } + + // Wait 10ms before our first attempt to send the rendezvous XHR because if it arrives + // before the method call it will be rejected. + Meteor.setTimeout(sendXhr, 10); + } + }); + if (stopImmediately) handle.stop(); +} + +if (__meteor_runtime_config__.SANDSTORM) { + // Auto-login the main Meteor connection. + loginWithSandstorm(Meteor.connection, __meteor_runtime_config__.SANDSTORM_API_HOST, + __meteor_runtime_config__.SANDSTORM_API_TOKEN); + + if (Package["accounts-base"]) { + // Make Meteor.loggingIn() work by calling a private method of accounts-base. If this breaks then + // maybe we should just overwrite Meteor.loggingIn() instead. + Tracker.autorun(function () { + Package["accounts-base"].Accounts._setLoggingIn(!Meteor.connection.sandstormUser()); + }); + } + + Meteor.sandstormUser = function () { + return Meteor.connection.sandstormUser(); + }; + + SandstormAccounts = { + setTestUserInfo: function (info) { + localStorage.sandstormTestUserInfo = JSON.stringify(info); + loginWithSandstorm(Meteor.connection, __meteor_runtime_config__.SANDSTORM_API_HOST, + __meteor_runtime_config__.SANDSTORM_API_TOKEN); + } + }; +} diff --git a/packages/wekan-accounts-sandstorm/package.js b/packages/wekan-accounts-sandstorm/package.js new file mode 100644 index 000000000..1606cf263 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/package.js @@ -0,0 +1,45 @@ +// Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors +// Licensed under the MIT License: +// +// 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. + +Package.describe({ + summary: "Login service for Sandstorm.io applications", + version: "0.7.0", + name: "wekan-accounts-sandstorm", + git: "https://github.com/sandstorm-io/meteor-accounts-sandstorm.git" +}); + +Package.onUse(function(api) { + api.versionsFrom('1.8.2'); + + api.use('random', ['client', 'server']); + api.use('accounts-base@~2.2.3-rc272.0', ['client', 'server'], {weak: true}); + api.use('webapp', 'server'); + api.use('http', 'client'); + api.use('tracker', 'client'); + api.use('reactive-var', 'client'); + api.use('check', 'server'); + api.use('ddp-server', 'server'); + + api.addFiles("client.js", "client"); + api.addFiles("server.js", "server"); + + api.export("SandstormAccounts", "client"); +}); diff --git a/packages/wekan-accounts-sandstorm/server.js b/packages/wekan-accounts-sandstorm/server.js new file mode 100644 index 000000000..032549692 --- /dev/null +++ b/packages/wekan-accounts-sandstorm/server.js @@ -0,0 +1,210 @@ +// Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors +// Licensed under the MIT License: +// +// 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. + +if (process.env.SANDSTORM) { + __meteor_runtime_config__.SANDSTORM = true; +} + +if (__meteor_runtime_config__.SANDSTORM) { + if (Package["accounts-base"]) { + // Highlander Mode: Disable all non-Sandstorm login mechanisms. + Package["accounts-base"].Accounts.validateLoginAttempt(function (attempt) { + if (!attempt.allowed) { + return false; + } + if (attempt.type !== "sandstorm") { + throw new Meteor.Error(403, "Non-Sandstorm login mechanisms disabled on Sandstorm."); + } + return true; + }); + Package["accounts-base"].Accounts.validateNewUser(function (user) { + if (!user.services.sandstorm) { + throw new Meteor.Error(403, "Non-Sandstorm login mechanisms disabled on Sandstorm."); + } + return true; + }); + } + + var Future = Npm.require("fibers/future"); + + var inMeteor = Meteor.bindEnvironment(function (callback) { + callback(); + }); + + var logins = {}; + // Maps tokens to currently-waiting login method calls. + + if (Package["accounts-base"]) { + Meteor.users.createIndex("services.sandstorm.id", {unique: 1, sparse: 1}); + } + + Meteor.onConnection(function (connection) { + connection._sandstormUser = null; + connection._sandstormSessionId = null; + connection._sandstormTabId = null; + connection.sandstormUser = function () { + if (!connection._sandstormUser) { + throw new Meteor.Error(400, "Client did not complete authentication handshake."); + } + return this._sandstormUser; + }; + connection.sandstormSessionId = function () { + if (!connection._sandstormUser) { + throw new Meteor.Error(400, "Client did not complete authentication handshake."); + } + return this._sandstormSessionId; + } + connection.sandstormTabId = function () { + if (!connection._sandstormUser) { + throw new Meteor.Error(400, "Client did not complete authentication handshake."); + } + return this._sandstormTabId; + } + }); + + Meteor.methods({ + loginWithSandstorm: function (token) { + check(token, String); + + var future = new Future(); + + logins[token] = future; + + var timeout = setTimeout(function () { + future.throw(new Meteor.Error("timeout", "Gave up waiting for login rendezvous XHR.")); + }, 10000); + + var info; + try { + info = future.wait(); + } finally { + clearTimeout(timeout); + delete logins[token]; + } + + // Set connection info. The call to setUserId() resets all publishes. We update the + // connection's sandstorm info first so that when the publishes are re-run they'll see the + // new info. In theory we really want to update it exactly when this.userId is updated, but + // we'd have to dig into Meteor internals to pull that off. Probably updating it a little + // early is fine? + // + // Note that calling setUserId() with the same ID a second time still goes through the motions + // of restarting all subscriptions, which is important if the permissions changed. Hopefully + // Meteor won't decide to "optimize" this by returning early if the user ID hasn't changed. + this.connection._sandstormUser = info.sandstorm; + this.connection._sandstormSessionId = info.sessionId; + this.connection._sandstormTabId = info.tabId; + this.setUserId(info.userId); + + return info; + } + }); + + WebApp.rawConnectHandlers.use(function (req, res, next) { + if (req.url === "/.sandstorm-login") { + handlePostToken(req, res); + return; + } + return next(); + }); + + function readAll(stream) { + var future = new Future(); + + var chunks = []; + stream.on("data", function (chunk) { + chunks.push(chunk.toString()); + }); + stream.on("error", function (err) { + future.throw(err); + }); + stream.on("end", function () { + future.return(); + }); + + future.wait(); + + return chunks.join(""); + } + + var handlePostToken = Meteor.bindEnvironment(function (req, res) { + inMeteor(function () { + try { + // Note that cross-origin POSTs cannot set arbitrary Content-Types without explicit CORS + // permission, so this effectively prevents XSRF. + if (req.headers["content-type"].split(";")[0].trim() !== "application/x-sandstorm-login-token") { + throw new Error("wrong Content-Type for .sandstorm-login: " + req.headers["content-type"]); + } + + var token = readAll(req); + + var future = logins[token]; + if (!future) { + throw new Error("no current login request matching token"); + } + + var permissions = req.headers["x-sandstorm-permissions"]; + if (permissions && permissions !== "") { + permissions = permissions.split(","); + } else { + permissions = []; + } + + var sandstormInfo = { + id: req.headers["x-sandstorm-user-id"] || null, + name: decodeURIComponent(req.headers["x-sandstorm-username"]), + permissions: permissions, + picture: req.headers["x-sandstorm-user-picture"] || null, + preferredHandle: req.headers["x-sandstorm-preferred-handle"] || null, + pronouns: req.headers["x-sandstorm-user-pronouns"] || null, + }; + + var userInfo = {sandstorm: sandstormInfo}; + if (Package["accounts-base"]) { + if (sandstormInfo.id) { + // The user is logged into Sandstorm. Create a Meteor account for them, or find the + // existing one, and record the user ID. + var login = Package["accounts-base"].Accounts.updateOrCreateUserFromExternalService( + "sandstorm", sandstormInfo, {profile: {name: sandstormInfo.name}}); + userInfo.userId = login.userId; + } else { + userInfo.userId = null; + } + } else { + // Since the app isn't using regular Meteor accounts, we can define Meteor.userId() + // however we want. + userInfo.userId = sandstormInfo.id; + } + + userInfo.sessionId = req.headers["x-sandstorm-session-id"] || null; + userInfo.tabId = req.headers["x-sandstorm-tab-id"] || null; + future.return(userInfo); + res.writeHead(204, {}); + res.end(); + } catch (err) { + res.writeHead(500, { + "Content-Type": "text/plain" + }); + res.end(err.stack); + } + }); + }); +} From 255eac9f988ff03a7f341ec4ff3727aed2b8be07 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 2 May 2022 23:40:19 +0300 Subject: [PATCH 116/246] Fix typos. --- packages/wekan-accounts-sandstorm/package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wekan-accounts-sandstorm/package.js b/packages/wekan-accounts-sandstorm/package.js index 1606cf263..10fdc1fed 100644 --- a/packages/wekan-accounts-sandstorm/package.js +++ b/packages/wekan-accounts-sandstorm/package.js @@ -27,10 +27,10 @@ Package.describe({ }); Package.onUse(function(api) { - api.versionsFrom('1.8.2'); + api.versionsFrom('1.5.1'); api.use('random', ['client', 'server']); - api.use('accounts-base@~2.2.3-rc272.0', ['client', 'server'], {weak: true}); + api.use('accounts-base@2.2.2', ['client', 'server'], {weak: true}); api.use('webapp', 'server'); api.use('http', 'client'); api.use('tracker', 'client'); From 5ddf88bca1812cebe567da8f12e45de97bd18c90 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 3 May 2022 13:19:23 +0300 Subject: [PATCH 117/246] Updated translations. --- i18n/ru.i18n.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index b87ab3ec9..c446b7f86 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -135,7 +135,7 @@ "avatar-too-big": "Аватар слишком большой (максимум 520КБ)", "back": "Назад", "board-change-color": "Изменить цвет", - "show-at-all-boards-page": "Show at All Boards page", + "show-at-all-boards-page": "Показать на всех досках", "board-info-on-my-boards": "All Boards Settings", "boardInfoOnMyBoardsPopup-title": "All Boards Settings", "boardInfoOnMyBoards-title": "All Boards Settings", @@ -941,7 +941,7 @@ "myCardsViewChange-title": "My Cards View", "myCardsViewChangePopup-title": "My Cards View", "myCardsViewChange-choice-boards": "Доски", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "Таблица", "myCardsSortChange-title": "Сортировать мои карточки", "myCardsSortChangePopup-title": "Сортировать мои карточки", "myCardsSortChange-choice-board": "По доскам", @@ -1108,9 +1108,9 @@ "subject": "Тема", "details": "Детали", "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", + "ticket": "Тикет", + "tickets": "Тикеты", + "ticket-number": "Номер тикета", "open": "Открыт", "pending": "В ожидании", "closed": "Закрыт", From 38d26fa7e32c705a0cad34c199e1190c5226b968 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 3 May 2022 15:55:27 +0300 Subject: [PATCH 118/246] Improvements to future WeKan Snap core20. Does not work yet. In Progress. Thanks to xet7 ! --- .future-snap/snapcraft.yaml | 52 +++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/.future-snap/snapcraft.yaml b/.future-snap/snapcraft.yaml index 101cb6087..b6b792494 100644 --- a/.future-snap/snapcraft.yaml +++ b/.future-snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.10' +version: '6.21' base: core20 summary: Open Source kanban description: | @@ -20,6 +20,12 @@ architectures: - build-on: arm64 run-on: arm64 + - build-on: ppc64el + run-on: ppc64el + + - build-on: s390x + run-on: s390x + plugs: mongodb-plug: interface: content @@ -73,8 +79,10 @@ parts: mongodb: plugin: dump source: - - on amd64: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-amd64/mongodb-org-server_4.4.12_amd64.deb - - on arm64: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-arm64/mongodb-org-server_4.4.12_arm64.deb + - on amd64: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-amd64/mongodb-org-server_4.4.13_amd64.deb + - on arm64: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-arm64/mongodb-org-server_4.4.13_arm64.deb + - on ppc64el: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-ppc64el/mongodb-org-server_4.4.13_ppc64el.deb + - on s390x: https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-s390x/mongodb-org-server_4.4.13_s390x.deb stage-packages: - libssl1.1 - libcurl3-dev @@ -90,19 +98,22 @@ parts: - $mongo wekan: - plugin: npm + #plugin: npm + plugin: dump source: - # TODO: Fix URLs to some allowed GitHub releases URL. + # Fixed URLs to some allowed GitHub releases URL. # Non-GitHub build server file urls are not allowed at 2022-03-02 and later. - - on amd64: https://wekan.github.io/wekan-latest-x64.zip - - on arm64: https://wekan.github.io/raspi3/wekan-latest-arm64.zip - npm-node-version: 14.19.0 + - on amd64: https://github.com/wekan/wekan/releases/download/v6.20/wekan-6.20-amd64.zip + - on arm64: https://github.com/wekan/wekan/releases/download/v6.20/wekan-6.20-arm64.zip + - on ppc64el: https://github.com/wekan/wekan/releases/download/v6.20/wekan-6.20-ppc64el.zip + - on s390x: https://github.com/wekan/wekan/releases/download/v6.20/wekan-6.20-s390x.zip +# npm-node-version: 14.19.1 # node-packages: # - node-gyp # - node-pre-gyp # - fibers - build-packages: - - npm +# build-packages: +# - npm # - build-essential # - ca-certificates # - apt-utils @@ -114,7 +125,7 @@ parts: # - execstack # - nodejs # - npm - - p7zip-full +# - p7zip-full # stage-packages: # - libfontconfig1 override-build: | @@ -151,3 +162,22 @@ parts: README.txt: CADDY_README.txt stage: - -init + + caddy2: + plugin: dump + source: + # Fixed URLs to some allowed GitHub releases URL. + # Non-GitHub build server file urls are not allowed at 2022-03-02 and later. + - on amd64: https://github.com/wekan/wekan/releases/download/v6.20/caddy-v2-amd64.zip + - on arm64: https://github.com/wekan/wekan/releases/download/v6.20/caddy-v2-arm64.zip + - on ppc64el: https://github.com/wekan/wekan/releases/download/v6.20/caddy-v2-ppc64el.zip + - on s390x: https://github.com/wekan/wekan/releases/download/v6.20/caddy-v2-s390x.zip + source-type: zip + organize: + caddy: bin/caddy + CHANGES.txt: CADDY_CHANGES.txt + EULA.txt: CADDY_EULA.txt + LICENSES.txt: CADDY_LICENSES.txt + README.txt: CADDY_README.txt + stage: + - -init From 2856cf9baa71744ba6959dad18b4c31b7d9fcdd5 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 3 May 2022 21:48:24 +0200 Subject: [PATCH 119/246] Upgrade wekan-accounts-sandstorm to Meteor 2.7 dependencies Clone of Repository: https://github.com/wekan/meteor-accounts-sandstorm/commit/3ba279df9265d955d2aa8a79e1b796165acb128c --- .meteor/versions | 2 +- packages/wekan-accounts-sandstorm/package.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.meteor/versions b/.meteor/versions index d091ebf74..c594bc288 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -224,6 +224,6 @@ useraccounts:flow-routing@1.15.0 useraccounts:unstyled@1.14.2 webapp@1.13.1 webapp-hashing@1.1.0 -wekan-accounts-sandstorm@0.7.0 +wekan-accounts-sandstorm@0.8.0 wekan-markdown@1.0.9 zimme:active-route@2.3.2 diff --git a/packages/wekan-accounts-sandstorm/package.js b/packages/wekan-accounts-sandstorm/package.js index 10fdc1fed..efec314f5 100644 --- a/packages/wekan-accounts-sandstorm/package.js +++ b/packages/wekan-accounts-sandstorm/package.js @@ -21,16 +21,16 @@ Package.describe({ summary: "Login service for Sandstorm.io applications", - version: "0.7.0", + version: "0.8.0", name: "wekan-accounts-sandstorm", git: "https://github.com/sandstorm-io/meteor-accounts-sandstorm.git" }); Package.onUse(function(api) { - api.versionsFrom('1.5.1'); + api.versionsFrom('2.7'); api.use('random', ['client', 'server']); - api.use('accounts-base@2.2.2', ['client', 'server'], {weak: true}); + api.use('accounts-base', ['client', 'server'], {weak: true}); api.use('webapp', 'server'); api.use('http', 'client'); api.use('tracker', 'client'); From ca0dfe160f813c710e710ebaefce556414ef8043 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 9 May 2022 07:20:42 +0300 Subject: [PATCH 120/246] Updated translations. --- i18n/it.i18n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 72b224f58..859779d6d 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1176,5 +1176,5 @@ "size": "Size", "storage": "Storage", "action": "Azione", - "board-title": "Board Title" + "board-title": "Titolo della Bacheca" } \ No newline at end of file From bfef7844ba15a28bce63a577ed499ed899aaff79 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 9 May 2022 07:27:30 +0300 Subject: [PATCH 121/246] Updated to Node.js v14.19.2. Thanks to Node.js developers. --- .devcontainer/Dockerfile | 2 +- .future-snap/broken-snapcraft.yaml | 2 +- .travis.yml | 2 +- Dockerfile | 2 +- Dockerfile.arm64v8 | 4 ++-- rebuild-wekan.bat | 4 ++-- rebuild-wekan.sh | 2 +- snapcraft.yaml | 2 +- stacksmith/user-scripts/build.sh | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 554676ecd..bf96a9d4f 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -10,7 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive ENV \ DEBUG=false \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/.future-snap/broken-snapcraft.yaml b/.future-snap/broken-snapcraft.yaml index b8ea68778..9df91c51c 100644 --- a/.future-snap/broken-snapcraft.yaml +++ b/.future-snap/broken-snapcraft.yaml @@ -81,7 +81,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.1 + node-engine: 14.19.2 node-packages: - node-gyp - node-pre-gyp diff --git a/.travis.yml b/.travis.yml index d689fd195..f9d6758d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: required env: TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0 - TRAVIS_NODE_VERSION: 14.19.1 + TRAVIS_NODE_VERSION: 14.19.2 TRAVIS_NPM_VERSION: latest before_install: diff --git a/Dockerfile b/Dockerfile index 7506deab6..d3a76b8ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ ARG DEBIAN_FRONTEND=noninteractive ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/Dockerfile.arm64v8 b/Dockerfile.arm64v8 index 3b3fb2cd9..40424f5cc 100644 --- a/Dockerfile.arm64v8 +++ b/Dockerfile.arm64v8 @@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder ENV QEMU_VERSION=v4.2.0-6 \ QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ WEKAN_VERSION=latest \ WEKAN_ARCHITECTURE=arm64 \ NODE_OPTIONS="--max_old_space_size=4096" @@ -49,7 +49,7 @@ LABEL maintainer="wekan" # Set the environment variables (defaults where required) ENV QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ NODE_ENV=production \ NPM_VERSION=latest \ WITH_API=true \ diff --git a/rebuild-wekan.bat b/rebuild-wekan.bat index 21f8eb2bb..32058587d 100644 --- a/rebuild-wekan.bat +++ b/rebuild-wekan.bat @@ -15,8 +15,8 @@ REM Install chocolatey choco install -y git curl python2 dotnet4.5.2 nano mongodb-4 mongoclient -curl -O https://nodejs.org/dist/v14.19.1/node-v14.19.1-x64.msi -call node-v14.19.1-x64.msi +curl -O https://nodejs.org/dist/v14.19.2/node-v14.19.2-x64.msi +call node-v14.19.2-x64.msi call npm config -g set msvs_version 2015 call meteor npm config -g set msvs_version 2015 diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index c61a556ad..6f12f152f 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -39,7 +39,7 @@ do #curl -0 -L https://npmjs.org/install.sh | sudo sh #sudo chown -R $(id -u):$(id -g) $HOME/.npm sudo npm -g install n - sudo n 14.19.1 + sudo n 14.19.2 #sudo npm -g install npm ## Latest npm with Meteor 2.2 sudo npm -g install node-gyp diff --git a/snapcraft.yaml b/snapcraft.yaml index d3e9e7323..8c6b92850 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -80,7 +80,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.1 + node-engine: 14.19.2 node-packages: - node-gyp - node-pre-gyp diff --git a/stacksmith/user-scripts/build.sh b/stacksmith/user-scripts/build.sh index 396b5e9ad..b7eafbe59 100755 --- a/stacksmith/user-scripts/build.sh +++ b/stacksmith/user-scripts/build.sh @@ -2,7 +2,7 @@ set -euxo pipefail BUILD_DEPS="bsdtar gnupg wget curl bzip2 python git ca-certificates perl-Digest-SHA" -NODE_VERSION=v14.19.1 +NODE_VERSION=v14.19.2 #METEOR_RELEASE=1.6.0.1 - for Stacksmith, meteor-1.8 branch that could have METEOR@1.8.1-beta.8 or newer USE_EDGE=false METEOR_EDGE=1.5-beta.17 From 4a78c718d3c4011e24312d9d0f238988be4f84d8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 9 May 2022 07:30:02 +0300 Subject: [PATCH 122/246] Updated ChangeLog. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e7b8dd0a..3446e7f4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +- [Updated to Node.js v14.19.2](https://github.com/wekan/wekan/commit/bfef7844ba15a28bce63a577ed499ed899aaff79). + Thanks to Node.js developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.21 2022-04-28 WeKan ® release This release fixes the following bugs: From bc8b8cbdbe61fd434182c04d8e0bb0db901ef366 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 9 May 2022 07:52:54 +0300 Subject: [PATCH 123/246] v6.22 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3446e7f4c..b4ddd956e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.22 2022-05-09 WeKan ® release - [Updated to Node.js v14.19.2](https://github.com/wekan/wekan/commit/bfef7844ba15a28bce63a577ed499ed899aaff79). Thanks to Node.js developers. diff --git a/Stackerfile.yml b/Stackerfile.yml index f30dc3f56..d1ca50943 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.21.0" +appVersion: "v6.22.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index 92bea3e15..0126d84d3 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.21" +appVersion: "6.22" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 6dccb838e..b7288275c 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.21 + tag: v6.22 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index 29994390f..b170cc4f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.20.0", + "version": "v6.22.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5ca26590c..2d2ce47a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.20.0", + "version": "v6.22.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index ddee17bba..316917fed 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.21 + Wekan REST API v6.22 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
  • - Wekan REST API v6.21 + Wekan REST API v6.22
  • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    -

    Wekan REST API v6.21

    +

    Wekan REST API v6.22

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 9376446da..e119e0326 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.21 + version: v6.22 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 938c833e4..8b0ac87b8 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 621, + appVersion = 622, # Increment this for every release. - appMarketingVersion = (defaultText = "6.21.0~2022-04-28"), + appMarketingVersion = (defaultText = "6.22.0~2022-05-09"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 8c6b92850..f33b371a2 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.21' +version: '6.22' summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. From 963a4711dbad325a1618abf2f76541d94570ca89 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 16 May 2022 19:55:07 +0300 Subject: [PATCH 124/246] Upgrade to Meteor 2.7.2. Thanks to Meteor developers! --- .meteor/packages | 2 +- .meteor/release | 2 +- .meteor/versions | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 96b23a76f..37ee20f12 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -22,7 +22,7 @@ cottz:publish-relations dburles:collection-helpers idmontie:migrations matteodem:easy-search -mongo@1.15.0-rc272.0 +mongo@1.15.0 mquandalle:collection-mutations # Account system diff --git a/.meteor/release b/.meteor/release index a57cf27ad..22462328f 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.2-rc.0 +METEOR@2.7.2 diff --git a/.meteor/versions b/.meteor/versions index c594bc288..08b2c4f82 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,4 +1,4 @@ -accounts-base@2.2.3-rc272.0 +accounts-base@2.2.3 accounts-password@2.3.1 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 @@ -101,11 +101,11 @@ minifier-js@2.7.4 minifiers@1.1.8-faster-rebuild.0 minimongo@1.8.0 mobile-status-bar@1.1.0 -modern-browsers@0.1.8-rc272.0 +modern-browsers@0.1.8 modules@0.18.0 modules-runtime@0.13.0 momentjs:moment@2.29.3 -mongo@1.15.0-rc272.0 +mongo@1.15.0 mongo-decimal@0.1.3 mongo-dev-server@1.1.0 mongo-id@1.0.8 @@ -204,7 +204,7 @@ simple:json-routes@2.3.1 simple:rest-accounts-password@1.2.1 simple:rest-bearer-token-parser@1.1.1 simple:rest-json-error-handler@1.1.1 -socket-stream-client@0.5.0-rc272.0 +socket-stream-client@0.5.0 spacebars@1.3.0 spacebars-compiler@1.3.1 standard-minifier-css@1.8.1 From a73a4c1e5b1971ff32643fb39a37e285a240a77a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 16 May 2022 20:43:40 +0300 Subject: [PATCH 125/246] When developing with Meteor on macOS, get current IP address. Thanks to xet7 ! --- rebuild-wekan.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index c024ed93b..e3b6fb5c2 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -115,7 +115,11 @@ do ;; "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000") - IPADDRESS=$(ip a | grep 'noprefixroute' | grep 'inet ' | cut -d: -f2 | awk '{ print $2}' | cut -d '/' -f 1) + if [[ "$OSTYPE" == "darwin"* ]]; then + IPADDRESS=$(ifconfig | grep broadcast | grep 'inet ' | cut -d: -f2 | awk '{ print $2}' | cut -d '/' -f 1) + else + IPADDRESS=$(ip a | grep 'noprefixroute' | grep 'inet ' | cut -d: -f2 | awk '{ print $2}' | cut -d '/' -f 1) + fi echo "Your IP address is $IPADDRESS" WRITABLE_PATH=.. NODE_OPTIONS="--max_old_space_size=4096 --trace-warnings" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:4000 meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 break From 00768b4392109dec62a4dcf44dbceb295990d785 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 16 May 2022 21:12:27 +0300 Subject: [PATCH 126/246] Added back WeKan lockout, ldap, oidc, cas. Thanks to xet7 ! --- .meteor/packages | 5 + .meteor/versions | 9 + packages/wekan-accounts-cas/.gitignore | 2 + packages/wekan-accounts-cas/LICENSE | 21 + packages/wekan-accounts-cas/README.md | 88 +++ packages/wekan-accounts-cas/cas_client.js | 117 ++++ .../wekan-accounts-cas/cas_client_cordova.js | 71 +++ packages/wekan-accounts-cas/cas_server.js | 304 +++++++++ packages/wekan-accounts-cas/package.js | 29 + .../wekan-accounts-lockout/CONTRIBUTING.md | 25 + packages/wekan-accounts-lockout/LICENSE | 21 + packages/wekan-accounts-lockout/README.md | 126 ++++ .../accounts-lockout.js | 5 + packages/wekan-accounts-lockout/package.js | 18 + packages/wekan-accounts-lockout/package.json | 4 + .../src/accountsLockout.js | 29 + .../src/accountsLockoutCollection.js | 3 + .../wekan-accounts-lockout/src/knownUser.js | 326 ++++++++++ .../wekan-accounts-lockout/src/unknownUser.js | 329 ++++++++++ packages/wekan-accounts-oidc/.gitignore | 1 + packages/wekan-accounts-oidc/LICENSE.txt | 14 + packages/wekan-accounts-oidc/README.md | 75 +++ packages/wekan-accounts-oidc/oidc.js | 22 + .../wekan-accounts-oidc/oidc_login_button.css | 3 + packages/wekan-accounts-oidc/package.js | 19 + packages/wekan-ldap/LICENSE | 21 + packages/wekan-ldap/README.md | 130 ++++ packages/wekan-ldap/client/loginHelper.js | 52 ++ packages/wekan-ldap/package.js | 28 + packages/wekan-ldap/server/index.js | 1 + packages/wekan-ldap/server/ldap.js | 593 ++++++++++++++++++ packages/wekan-ldap/server/logger.js | 15 + packages/wekan-ldap/server/loginHandler.js | 252 ++++++++ packages/wekan-ldap/server/sync.js | 474 ++++++++++++++ packages/wekan-ldap/server/syncUser.js | 29 + packages/wekan-ldap/server/testConnection.js | 39 ++ packages/wekan-oidc/.gitignore | 1 + packages/wekan-oidc/LICENSE.txt | 14 + packages/wekan-oidc/README.md | 52 ++ packages/wekan-oidc/loginHandler.js | 179 ++++++ packages/wekan-oidc/oidc_client.js | 67 ++ packages/wekan-oidc/oidc_configure.html | 6 + packages/wekan-oidc/oidc_configure.js | 17 + packages/wekan-oidc/oidc_server.js | 306 +++++++++ packages/wekan-oidc/package.js | 24 + 45 files changed, 3966 insertions(+) create mode 100644 packages/wekan-accounts-cas/.gitignore create mode 100644 packages/wekan-accounts-cas/LICENSE create mode 100644 packages/wekan-accounts-cas/README.md create mode 100644 packages/wekan-accounts-cas/cas_client.js create mode 100644 packages/wekan-accounts-cas/cas_client_cordova.js create mode 100644 packages/wekan-accounts-cas/cas_server.js create mode 100644 packages/wekan-accounts-cas/package.js create mode 100644 packages/wekan-accounts-lockout/CONTRIBUTING.md create mode 100644 packages/wekan-accounts-lockout/LICENSE create mode 100644 packages/wekan-accounts-lockout/README.md create mode 100644 packages/wekan-accounts-lockout/accounts-lockout.js create mode 100644 packages/wekan-accounts-lockout/package.js create mode 100644 packages/wekan-accounts-lockout/package.json create mode 100644 packages/wekan-accounts-lockout/src/accountsLockout.js create mode 100644 packages/wekan-accounts-lockout/src/accountsLockoutCollection.js create mode 100644 packages/wekan-accounts-lockout/src/knownUser.js create mode 100644 packages/wekan-accounts-lockout/src/unknownUser.js create mode 100644 packages/wekan-accounts-oidc/.gitignore create mode 100644 packages/wekan-accounts-oidc/LICENSE.txt create mode 100644 packages/wekan-accounts-oidc/README.md create mode 100644 packages/wekan-accounts-oidc/oidc.js create mode 100644 packages/wekan-accounts-oidc/oidc_login_button.css create mode 100644 packages/wekan-accounts-oidc/package.js create mode 100644 packages/wekan-ldap/LICENSE create mode 100644 packages/wekan-ldap/README.md create mode 100644 packages/wekan-ldap/client/loginHelper.js create mode 100644 packages/wekan-ldap/package.js create mode 100644 packages/wekan-ldap/server/index.js create mode 100644 packages/wekan-ldap/server/ldap.js create mode 100644 packages/wekan-ldap/server/logger.js create mode 100644 packages/wekan-ldap/server/loginHandler.js create mode 100644 packages/wekan-ldap/server/sync.js create mode 100644 packages/wekan-ldap/server/syncUser.js create mode 100644 packages/wekan-ldap/server/testConnection.js create mode 100644 packages/wekan-oidc/.gitignore create mode 100644 packages/wekan-oidc/LICENSE.txt create mode 100644 packages/wekan-oidc/README.md create mode 100644 packages/wekan-oidc/loginHandler.js create mode 100644 packages/wekan-oidc/oidc_client.js create mode 100644 packages/wekan-oidc/oidc_configure.html create mode 100644 packages/wekan-oidc/oidc_configure.js create mode 100644 packages/wekan-oidc/oidc_server.js create mode 100644 packages/wekan-oidc/package.js diff --git a/.meteor/packages b/.meteor/packages index 37ee20f12..624cc9e16 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -142,3 +142,8 @@ service-configuration@1.3.0 communitypackages:picker simple:rest-accounts-password wekan-accounts-sandstorm +wekan-accounts-lockout +wekan-oidc +wekan-accounts-oidc +wekan-ldap +wekan-accounts-cas diff --git a/.meteor/versions b/.meteor/versions index 08b2c4f82..ad5bead11 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,4 +1,5 @@ accounts-base@2.2.3 +accounts-oauth@1.4.1 accounts-password@2.3.1 aldeed:collection2@2.10.0 aldeed:collection2-core@1.2.0 @@ -119,6 +120,8 @@ mquandalle:jquery-textcomplete@0.8.0_1 mquandalle:mousetrap-bindglobal@0.0.1 msavin:usercache@1.8.0 npm-mongo@4.3.1 +oauth@2.1.2 +oauth2@1.3.1 observe-sequence@1.0.20 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 @@ -224,6 +227,12 @@ useraccounts:flow-routing@1.15.0 useraccounts:unstyled@1.14.2 webapp@1.13.1 webapp-hashing@1.1.0 +wekan-accounts-cas@0.1.0 +wekan-accounts-lockout@1.0.0 +wekan-accounts-oidc@1.0.10 wekan-accounts-sandstorm@0.8.0 +wekan-ldap@0.0.2 wekan-markdown@1.0.9 +wekan-oidc@1.0.12 +yasaricli:slugify@0.0.7 zimme:active-route@2.3.2 diff --git a/packages/wekan-accounts-cas/.gitignore b/packages/wekan-accounts-cas/.gitignore new file mode 100644 index 000000000..bed7713fa --- /dev/null +++ b/packages/wekan-accounts-cas/.gitignore @@ -0,0 +1,2 @@ +.build* +node_modules/ diff --git a/packages/wekan-accounts-cas/LICENSE b/packages/wekan-accounts-cas/LICENSE new file mode 100644 index 000000000..c2d691582 --- /dev/null +++ b/packages/wekan-accounts-cas/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 The Wekan Team + +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. diff --git a/packages/wekan-accounts-cas/README.md b/packages/wekan-accounts-cas/README.md new file mode 100644 index 000000000..3e246c4f1 --- /dev/null +++ b/packages/wekan-accounts-cas/README.md @@ -0,0 +1,88 @@ +This is a merged repository of useful forks of: atoy40:accounts-cas +=================== +([(https://atmospherejs.com/atoy40/accounts-cas](https://atmospherejs.com/atoy40/accounts-cas)) + +## Essential improvements by ppoulard to atoy40 and xaionaro versions + +* Added support of CAS attributes + +With this plugin, you can pick CAS attributes : https://github.com/joshchan/node-cas/wiki/CAS-Attributes + +Moved to Wekan GitHub org from from https://github.com/ppoulard/meteor-accounts-cas + +## Install + +``` +cd ~site +mkdir packages +cd packages +git clone https://github.com/wekan/meteor-accounts-cas +cd ~site +meteor add wekan:accounts-cas +``` + +## Usage + +Put CAS settings in Meteor.settings (for example using METEOR_SETTINGS env or --settings) like so: + +If casVersion is not defined, it will assume you use CAS 1.0. (note by xaionaro: option `casVersion` seems to be just ignored in the code, ATM). + +Server side settings: + +``` +Meteor.settings = { + "cas": { + "baseUrl": "https://cas.example.com/cas", + "autoClose": true, + "validateUrl":"https://cas.example.com/cas/p3/serviceValidate", + "casVersion": 3.0, + "attributes": { + "debug" : true + } + }, +} +``` + +CAS `attributes` settings : + +* `attributes`: by default `{}` : all default values below will apply +* * `debug` : by default `false` ; `true` will print to the server console the CAS attribute names to map, the CAS attributes values retrieved, if necessary the new user account created, and finally the user to use +* * `id` : by default, the CAS user is used for the user account, but you can specified another CAS attribute +* * `firstname` : by default `cas:givenName` ; but you can use your own CAS attribute +* * `lastname` : by default `cas:sn` (respectively) ; but you can use your own CAS attribute +* * `fullname` : by default unused, but if you specify your own CAS attribute, it will be used instead of the `firstname` + `lastname` +* * `mail` : by default `cas:mail` + +Client side settings: + +``` +Meteor.settings = { + "public": { + "cas": { + "loginUrl": "https://cas.example.com/login", + "serviceParam": "service", + "popupWidth": 810, + "popupHeight": 610, + "popup": true, + } + } +} +``` + +`proxyUrl` is not required. Setup [ROOT_URL](http://docs.meteor.com/api/core.html#Meteor-absoluteUrl) environment variable instead. + +Then, to start authentication, you have to call the following method from the client (for example in a click handler) : + +``` +Meteor.loginWithCas([callback]); +``` + +It must open a popup containing you CAS login form or redirect to the CAS login form (depending on "popup" setting). + +If popup is disabled (== false), then it's required to execute `Meteor.initCas([callback])` in `Meteor.startup` of the client side. ATM, `Meteor.initCas()` completes authentication. + +## Examples + +* [https://devel.mephi.ru/dyokunev/start-mephi-ru](https://devel.mephi.ru/dyokunev/start-mephi-ru) + + diff --git a/packages/wekan-accounts-cas/cas_client.js b/packages/wekan-accounts-cas/cas_client.js new file mode 100644 index 000000000..ca9288ae2 --- /dev/null +++ b/packages/wekan-accounts-cas/cas_client.js @@ -0,0 +1,117 @@ + +function addParameterToURL(url, param){ + var urlSplit = url.split('?'); + return url+(urlSplit.length>0 ? '?':'&') + param; +} + +Meteor.initCas = function(callback) { + const casTokenMatch = window.location.href.match(/[?&]casToken=([^&]+)/); + if (casTokenMatch == null) { + return; + } + + window.history.pushState('', document.title, window.location.href.replace(/([&?])casToken=[^&]+[&]?/, '$1').replace(/[?&]+$/g, '')); + + Accounts.callLoginMethod({ + methodArguments: [{ cas: { credentialToken: casTokenMatch[1] } }], + userCallback: function(err){ + if (err == null) { + // should we do anything on success? + } + if (callback != null) { + callback(err); + } + } + }); +} + +Meteor.loginWithCas = function(options, callback) { + + var credentialToken = Random.id(); + + if (!Meteor.settings.public && + !Meteor.settings.public.cas && + !Meteor.settings.public.cas.loginUrl) { + return; + } + + var settings = Meteor.settings.public.cas; + + var backURL = window.location.href.replace('#', ''); + if (options != null && options.redirectUrl != null) + backURL = options.redirectUrl; + + var serviceURL = addParameterToURL(backURL, 'casToken='+credentialToken); + + var loginUrl = settings.loginUrl + + "?" + (settings.serviceParam || "service") + "=" + + encodeURIComponent(serviceURL) + + if (settings.popup == false) { + window.location = loginUrl; + return; + } + + var popup = openCenteredPopup( + loginUrl, + settings.width || 800, + settings.height || 600 + ); + + var checkPopupOpen = setInterval(function() { + try { + if(popup && popup.document && popup.document.getElementById('popupCanBeClosed')) { + popup.close(); + } + // Fix for #328 - added a second test criteria (popup.closed === undefined) + // to humour this Android quirk: + // http://code.google.com/p/android/issues/detail?id=21061 + var popupClosed = popup.closed || popup.closed === undefined; + } catch (e) { + // For some unknown reason, IE9 (and others?) sometimes (when + // the popup closes too quickly?) throws "SCRIPT16386: No such + // interface supported" when trying to read 'popup.closed'. Try + // again in 100ms. + return; + } + + if (popupClosed) { + clearInterval(checkPopupOpen); + + // check auth on server. + Accounts.callLoginMethod({ + methodArguments: [{ cas: { credentialToken: credentialToken } }], + userCallback: err => { + // Fix redirect bug after login successfully + if (!err) { + window.location.href = '/'; + } + } + }); + } + }, 100); +}; + +var openCenteredPopup = function(url, width, height) { + var screenX = typeof window.screenX !== 'undefined' + ? window.screenX : window.screenLeft; + var screenY = typeof window.screenY !== 'undefined' + ? window.screenY : window.screenTop; + var outerWidth = typeof window.outerWidth !== 'undefined' + ? window.outerWidth : document.body.clientWidth; + var outerHeight = typeof window.outerHeight !== 'undefined' + ? window.outerHeight : (document.body.clientHeight - 22); + // XXX what is the 22? + + // Use `outerWidth - width` and `outerHeight - height` for help in + // positioning the popup centered relative to the current window + var left = screenX + (outerWidth - width) / 2; + var top = screenY + (outerHeight - height) / 2; + var features = ('width=' + width + ',height=' + height + + ',left=' + left + ',top=' + top + ',scrollbars=yes'); + + var newwindow = window.open(url, '_blank', features); + if (newwindow.focus) + newwindow.focus(); + return newwindow; +}; diff --git a/packages/wekan-accounts-cas/cas_client_cordova.js b/packages/wekan-accounts-cas/cas_client_cordova.js new file mode 100644 index 000000000..c7f95b500 --- /dev/null +++ b/packages/wekan-accounts-cas/cas_client_cordova.js @@ -0,0 +1,71 @@ + +Meteor.loginWithCas = function(callback) { + + var credentialToken = Random.id(); + + if (!Meteor.settings.public && + !Meteor.settings.public.cas && + !Meteor.settings.public.cas.loginUrl) { + return; + } + + var settings = Meteor.settings.public.cas; + + var loginUrl = settings.loginUrl + + "?" + (settings.service || "service") + "=" + + Meteor.absoluteUrl('_cas/') + + credentialToken; + + + var fail = function (err) { + Meteor._debug("Error from OAuth popup: " + JSON.stringify(err)); + }; + + // When running on an android device, we sometimes see the + // `pageLoaded` callback fire twice for the final page in the OAuth + // popup, even though the page only loads once. This is maybe an + // Android bug or maybe something intentional about how onPageFinished + // works that we don't understand and isn't well-documented. + var oauthFinished = false; + + var pageLoaded = function (event) { + if (oauthFinished) { + return; + } + + if (event.url.indexOf(Meteor.absoluteUrl('_cas')) === 0) { + + oauthFinished = true; + + // On iOS, this seems to prevent "Warning: Attempt to dismiss from + // view controller while a presentation + // or dismiss is in progress". My guess is that the last + // navigation of the OAuth popup is still in progress while we try + // to close the popup. See + // https://issues.apache.org/jira/browse/CB-2285. + // + // XXX Can we make this timeout smaller? + setTimeout(function () { + popup.close(); + // check auth on server. + Accounts.callLoginMethod({ + methodArguments: [{ cas: { credentialToken: credentialToken } }], + userCallback: callback + }); + }, 100); + } + }; + + var onExit = function () { + popup.removeEventListener('loadstop', pageLoaded); + popup.removeEventListener('loaderror', fail); + popup.removeEventListener('exit', onExit); + }; + + var popup = window.open(loginUrl, '_blank', 'location=no,hidden=no'); + popup.addEventListener('loadstop', pageLoaded); + popup.addEventListener('loaderror', fail); + popup.addEventListener('exit', onExit); + popup.show(); + +}; \ No newline at end of file diff --git a/packages/wekan-accounts-cas/cas_server.js b/packages/wekan-accounts-cas/cas_server.js new file mode 100644 index 000000000..2e8edef2c --- /dev/null +++ b/packages/wekan-accounts-cas/cas_server.js @@ -0,0 +1,304 @@ +"use strict"; + +const Fiber = Npm.require('fibers'); +const https = Npm.require('https'); +const url = Npm.require('url'); +const xmlParser = Npm.require('xml2js'); + +// Library +class CAS { + constructor(options) { + options = options || {}; + + if (!options.validate_url) { + throw new Error('Required CAS option `validateUrl` missing.'); + } + + if (!options.service) { + throw new Error('Required CAS option `service` missing.'); + } + + const cas_url = url.parse(options.validate_url); + if (cas_url.protocol != 'https:' ) { + throw new Error('Only https CAS servers are supported.'); + } else if (!cas_url.hostname) { + throw new Error('Option `validateUrl` must be a valid url like: https://example.com/cas/serviceValidate'); + } else { + this.hostname = cas_url.host; + this.port = 443;// Should be 443 for https + this.validate_path = cas_url.pathname; + } + + this.service = options.service; + } + + validate(ticket, callback) { + const httparams = { + host: this.hostname, + port: this.port, + path: url.format({ + pathname: this.validate_path, + query: {ticket: ticket, service: this.service}, + }), + }; + + https.get(httparams, (res) => { + res.on('error', (e) => { + console.log('error' + e); + callback(e); + }); + + // Read result + res.setEncoding('utf8'); + let response = ''; + res.on('data', (chunk) => { + response += chunk; + }); + + res.on('end', (error) => { + if (error) { + console.log('error callback'); + console.log(error); + callback(undefined, false); + } else { + xmlParser.parseString(response, (err, result) => { + if (err) { + console.log('Bad response format.'); + callback({message: 'Bad response format. XML could not parse it'}); + } else { + if (result['cas:serviceResponse'] == null) { + console.log('Empty response.'); + callback({message: 'Empty response.'}); + } + if (result['cas:serviceResponse']['cas:authenticationSuccess']) { + const userData = { + id: result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:user'][0].toLowerCase(), + }; + const attributes = result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:attributes'][0]; + + // Check allowed ldap groups if exist (array only) + // example cas settings : "allowedLdapGroups" : ["wekan", "admin"], + let findedGroup = false; + const allowedLdapGroups = Meteor.settings.cas.allowedLdapGroups || false; + for (const fieldName in attributes) { + if (allowedLdapGroups && fieldName === 'cas:memberOf') { + for (const groups in attributes[fieldName]) { + const str = attributes[fieldName][groups]; + if (!Array.isArray(allowedLdapGroups)) { + callback({message: 'Settings "allowedLdapGroups" must be an array'}); + } + for (const allowedLdapGroup in allowedLdapGroups) { + if (str.search(`cn=${allowedLdapGroups[allowedLdapGroup]}`) >= 0) { + findedGroup = true; + } + } + } + } + userData[fieldName] = attributes[fieldName][0]; + } + + if (allowedLdapGroups && !findedGroup) { + callback({message: 'Group not finded.'}, false); + } else { + callback(undefined, true, userData); + } + } else { + callback(undefined, false); + } + } + }); + } + }); + }); + } +} +////// END OF CAS MODULE + +let _casCredentialTokens = {}; +let _userData = {}; + +//RoutePolicy.declare('/_cas/', 'network'); + +// Listen to incoming OAuth http requests +WebApp.connectHandlers.use((req, res, next) => { + // Need to create a Fiber since we're using synchronous http calls and nothing + // else is wrapping this in a fiber automatically + + Fiber(() => { + middleware(req, res, next); + }).run(); +}); + +const middleware = (req, res, next) => { + // Make sure to catch any exceptions because otherwise we'd crash + // the runner + try { + urlParsed = url.parse(req.url, true); + + // Getting the ticket (if it's defined in GET-params) + // If no ticket, then request will continue down the default + // middlewares. + const query = urlParsed.query; + if (query == null) { + next(); + return; + } + const ticket = query.ticket; + if (ticket == null) { + next(); + return; + } + + const serviceUrl = Meteor.absoluteUrl(urlParsed.href.replace(/^\//g, '')).replace(/([&?])ticket=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); + const redirectUrl = serviceUrl;//.replace(/([&?])casToken=[^&]+[&]?/g, '$1').replace(/[?&]+$/g, ''); + + // get auth token + const credentialToken = query.casToken; + if (!credentialToken) { + end(res, redirectUrl); + return; + } + + // validate ticket + casValidate(req, ticket, credentialToken, serviceUrl, () => { + end(res, redirectUrl); + }); + + } catch (err) { + console.log("account-cas: unexpected error : " + err.message); + end(res, redirectUrl); + } +}; + +const casValidate = (req, ticket, token, service, callback) => { + // get configuration + if (!Meteor.settings.cas/* || !Meteor.settings.cas.validate*/) { + throw new Error('accounts-cas: unable to get configuration.'); + } + + const cas = new CAS({ + validate_url: Meteor.settings.cas.validateUrl, + service: service, + version: Meteor.settings.cas.casVersion + }); + + cas.validate(ticket, (err, status, userData) => { + if (err) { + console.log("accounts-cas: error when trying to validate " + err); + console.log(err); + } else { + if (status) { + console.log(`accounts-cas: user validated ${userData.id} + (${JSON.stringify(userData)})`); + _casCredentialTokens[token] = { id: userData.id }; + _userData = userData; + } else { + console.log("accounts-cas: unable to validate " + ticket); + } + } + callback(); + }); + + return; +}; + +/* + * Register a server-side login handle. + * It is call after Accounts.callLoginMethod() is call from client. + */ + Accounts.registerLoginHandler((options) => { + if (!options.cas) + return undefined; + + if (!_hasCredential(options.cas.credentialToken)) { + throw new Meteor.Error(Accounts.LoginCancelledError.numericError, + 'no matching login attempt found'); + } + + const result = _retrieveCredential(options.cas.credentialToken); + + const attrs = Meteor.settings.cas.attributes || {}; + // CAS keys + const fn = attrs.firstname || 'cas:givenName'; + const ln = attrs.lastname || 'cas:sn'; + const full = attrs.fullname; + const mail = attrs.mail || 'cas:mail'; // or 'email' + const uid = attrs.id || 'id'; + if (attrs.debug) { + if (full) { + console.log(`CAS fields : id:"${uid}", fullname:"${full}", mail:"${mail}"`); + } else { + console.log(`CAS fields : id:"${uid}", firstname:"${fn}", lastname:"${ln}", mail:"${mail}"`); + } + } + const name = full ? _userData[full] : _userData[fn] + ' ' + _userData[ln]; + // https://docs.meteor.com/api/accounts.html#Meteor-users + options = { + // _id: Meteor.userId() + username: _userData[uid], // Unique name + emails: [ + { address: _userData[mail], verified: true } + ], + createdAt: new Date(), + profile: { + // The profile is writable by the user by default. + name: name, + fullname : name, + email : _userData[mail] + }, + active: true, + globalRoles: ['user'] + }; + if (attrs.debug) { + console.log(`CAS response : ${JSON.stringify(result)}`); + } + let user = Meteor.users.findOne({ 'username': options.username }); + if (! user) { + if (attrs.debug) { + console.log(`Creating user account ${JSON.stringify(options)}`); + } + const userId = Accounts.insertUserDoc({}, options); + user = Meteor.users.findOne(userId); + } + if (attrs.debug) { + console.log(`Using user account ${JSON.stringify(user)}`); + } + return { userId: user._id }; +}); + +const _hasCredential = (credentialToken) => { + return _.has(_casCredentialTokens, credentialToken); +} + +/* + * Retrieve token and delete it to avoid replaying it. + */ +const _retrieveCredential = (credentialToken) => { + const result = _casCredentialTokens[credentialToken]; + delete _casCredentialTokens[credentialToken]; + return result; +} + +const closePopup = (res) => { + if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { + return; + } + res.writeHead(200, {'Content-Type': 'text/html'}); + const content = '
    '; + res.end(content, 'utf-8'); +} + +const redirect = (res, whereTo) => { + res.writeHead(302, {'Location': whereTo}); + const content = 'Redirection to '+whereTo+''; + res.end(content, 'utf-8'); + return +} + +const end = (res, whereTo) => { + if (Meteor.settings.cas && Meteor.settings.cas.popup == false) { + redirect(res, whereTo); + } else { + closePopup(res); + } +} diff --git a/packages/wekan-accounts-cas/package.js b/packages/wekan-accounts-cas/package.js new file mode 100644 index 000000000..f698a6b23 --- /dev/null +++ b/packages/wekan-accounts-cas/package.js @@ -0,0 +1,29 @@ +Package.describe({ + summary: "CAS support for accounts", + version: "0.1.0", + name: "wekan-accounts-cas", + git: "https://github.com/wekan/meteor-accounts-cas" +}); + +Package.onUse(function(api) { + api.versionsFrom('2.7'); + api.use('routepolicy', 'server'); + api.use('webapp', 'server'); + api.use('accounts-base', ['client', 'server']); + // Export Accounts (etc) to packages using this one. + api.imply('accounts-base', ['client', 'server']); + api.use('underscore'); + api.addFiles('cas_client.js', 'web.browser'); + api.addFiles('cas_client_cordova.js', 'web.cordova'); + api.addFiles('cas_server.js', 'server'); + +}); + +Npm.depends({ + xml2js: "0.4.17", + cas: "https://github.com/anrizal/node-cas/tarball/2baed530842e7a437f8f71b9346bcac8e84773cc" +}); + +Cordova.depends({ + 'cordova-plugin-inappbrowser': '1.2.0' +}); diff --git a/packages/wekan-accounts-lockout/CONTRIBUTING.md b/packages/wekan-accounts-lockout/CONTRIBUTING.md new file mode 100644 index 000000000..c72e88f69 --- /dev/null +++ b/packages/wekan-accounts-lockout/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing guide + +Want to contribute to Accounts-Lockout? Awesome! +There are many ways you can contribute, see below. + +## Opening issues + +Open an issue to report bugs or to propose new features. + +- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable. + +- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution. + +## Proposing pull requests + +Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it. + +Fork the Accounts-Lockout repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch. + +Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch. + +## Documentation + +Documentation is extremely important and takes a fair deal of time and effort to write and keep updated. +Please submit any and all improvements you can make to the repository's docs. diff --git a/packages/wekan-accounts-lockout/LICENSE b/packages/wekan-accounts-lockout/LICENSE new file mode 100644 index 000000000..a5298594c --- /dev/null +++ b/packages/wekan-accounts-lockout/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Lucas Antoniassi de Paiva + +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. diff --git a/packages/wekan-accounts-lockout/README.md b/packages/wekan-accounts-lockout/README.md new file mode 100644 index 000000000..8d9c6897c --- /dev/null +++ b/packages/wekan-accounts-lockout/README.md @@ -0,0 +1,126 @@ +# Meteor - Accounts - Lockout + +[![Build Status](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout.svg?branch=master)](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8ce60fa7e2c24891b9bdfc3b65433d23)](https://www.codacy.com/app/lucasantoniassi/meteor-accounts-lockout?utm_source=github.com&utm_medium=referral&utm_content=LucasAntoniassi/meteor-accounts-lockout&utm_campaign=Badge_Grade) +[![Code Climate](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout/badges/gpa.svg)](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout) + +## What it is + +Seamless Meteor apps accounts protection from password brute-force attacks. +Users won't notice it. Hackers shall not pass. + +![you-shall-not-pass](https://cloud.githubusercontent.com/assets/3399956/9023729/007dd2a2-38b1-11e5-807a-b81c6ce00c80.jpg) + +## Installation + +``` +meteor add lucasantoniassi:accounts-lockout +``` + +## Usage via ES6 import + +```javascript +// server +import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout'; +``` + +## How to use + +Default settings: + +```javascript + "knownUsers": { + "failuresBeforeLockout": 3, // positive integer greater than 0 + "lockoutPeriod": 60, // in seconds + "failureWindow": 10 // in seconds + }, + "unknownUsers": { + "failuresBeforeLockout": 3, // positive integer greater than 0 + "lockoutPeriod": 60, // in seconds + "failureWindow": 10 // in seconds + } +``` + +`knownUsers` are users where already belongs to your `Meteor.users` collections, +these rules are applied if they attempt to login with an incorrect password but a know email. + +`unknownUsers` are users where **not** belongs to your `Meteor.users` collections, +these rules are applied if they attempt to login with a unknown email. + +`failuresBeforeLockout` should be a positive integer greater than 0. + +`lockoutPeriod` should be in seconds. + +`failureWindow` should be in seconds. + +If the `default` is nice to you, you can do that. + +```javascript +(new AccountsLockout()).startup(); +``` + +You can overwrite passing an `object` as argument. + +```javascript +(new AccountsLockout({ + knownUsers: { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + unknownUsers: { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, +})).startup(); +``` + +If you prefer, you can pass a `function` as argument. + +```javascript +const knownUsersRules = (user) => { + // apply some logic with this user + return { + failuresBeforeLockout, + lockoutPeriod, + failureWindow, + }; +}; + +const unknownUsersRules = (connection) => { + // apply some logic with this connection + return { + failuresBeforeLockout, + lockoutPeriod, + failureWindow, + }; +}; + +(new AccountsLockout({ + knownUsers: knownUsersRules, + unknownUsers: unknownUsersRules, +})).startup(); +``` + +If you prefer, you can use `Meteor.settings`. It will overwrite any previous case. + +```javascript +"accounts-lockout": { + "knownUsers": { + "failuresBeforeLockout": 3, + "lockoutPeriod": 60, + "failureWindow": 10 + }, + "unknownUsers": { + "failuresBeforeLockout": 3, + "lockoutPeriod": 60, + "failureWindow": 10 + } +} +``` + +## License + +This package is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). + diff --git a/packages/wekan-accounts-lockout/accounts-lockout.js b/packages/wekan-accounts-lockout/accounts-lockout.js new file mode 100644 index 000000000..0c781c802 --- /dev/null +++ b/packages/wekan-accounts-lockout/accounts-lockout.js @@ -0,0 +1,5 @@ +import AccountsLockout from './src/accountsLockout'; + +const Name = 'wekan-accounts-lockout'; + +export { Name, AccountsLockout }; diff --git a/packages/wekan-accounts-lockout/package.js b/packages/wekan-accounts-lockout/package.js new file mode 100644 index 000000000..769680679 --- /dev/null +++ b/packages/wekan-accounts-lockout/package.js @@ -0,0 +1,18 @@ +/* global Package */ + +Package.describe({ + name: 'wekan-accounts-lockout', + version: '1.0.0', + summary: 'Meteor package for locking user accounts and stopping brute force attacks', + git: 'https://github.com/lucasantoniassi/meteor-accounts-lockout.git', + documentation: 'README.md', +}); + +Package.onUse((api) => { + api.versionsFrom('2.7'); + api.use([ + 'ecmascript', + 'accounts-password', + ]); + api.mainModule('accounts-lockout.js'); +}); diff --git a/packages/wekan-accounts-lockout/package.json b/packages/wekan-accounts-lockout/package.json new file mode 100644 index 000000000..bbff88655 --- /dev/null +++ b/packages/wekan-accounts-lockout/package.json @@ -0,0 +1,4 @@ +{ + "name": "wekan-accounts-lockout", + "private": true +} diff --git a/packages/wekan-accounts-lockout/src/accountsLockout.js b/packages/wekan-accounts-lockout/src/accountsLockout.js new file mode 100644 index 000000000..8a1f05ea1 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/accountsLockout.js @@ -0,0 +1,29 @@ +import KnownUser from './knownUser'; +import UnknownUser from './unknownUser'; + +class AccountsLockout { + constructor({ + knownUsers = { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + unknownUsers = { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + }) { + this.settings = { + knownUsers, + unknownUsers, + }; + } + + startup() { + (new KnownUser(this.settings.knownUsers)).startup(); + (new UnknownUser(this.settings.unknownUsers)).startup(); + } +} + +export default AccountsLockout; diff --git a/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js b/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js new file mode 100644 index 000000000..9a885a0f7 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js @@ -0,0 +1,3 @@ +import { Meteor } from 'meteor/meteor'; + +export default new Meteor.Collection('AccountsLockout.Connections'); diff --git a/packages/wekan-accounts-lockout/src/knownUser.js b/packages/wekan-accounts-lockout/src/knownUser.js new file mode 100644 index 000000000..9365274f8 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/knownUser.js @@ -0,0 +1,326 @@ +/* eslint-disable no-underscore-dangle */ + +import { Meteor } from 'meteor/meteor'; +import { Accounts } from 'meteor/accounts-base'; + +class KnownUser { + constructor(settings) { + this.unchangedSettings = settings; + this.settings = settings; + } + + startup() { + if (!(this.unchangedSettings instanceof Function)) { + this.updateSettings(); + } + this.scheduleUnlocksForLockedAccounts(); + KnownUser.unlockAccountsIfLockoutAlreadyExpired(); + this.hookIntoAccounts(); + } + + updateSettings() { + const settings = KnownUser.knownUsers(); + if (settings) { + settings.forEach(function updateSetting({ key, value }) { + this.settings[key] = value; + }); + } + this.validateSettings(); + } + + validateSettings() { + if ( + !this.settings.failuresBeforeLockout || + this.settings.failuresBeforeLockout < 0 + ) { + throw new Error('"failuresBeforeLockout" is not positive integer'); + } + if ( + !this.settings.lockoutPeriod || + this.settings.lockoutPeriod < 0 + ) { + throw new Error('"lockoutPeriod" is not positive integer'); + } + if ( + !this.settings.failureWindow || + this.settings.failureWindow < 0 + ) { + throw new Error('"failureWindow" is not positive integer'); + } + } + + scheduleUnlocksForLockedAccounts() { + const lockedAccountsCursor = Meteor.users.find( + { + 'services.accounts-lockout.unlockTime': { + $gt: Number(new Date()), + }, + }, + { + fields: { + 'services.accounts-lockout.unlockTime': 1, + }, + }, + ); + const currentTime = Number(new Date()); + lockedAccountsCursor.forEach((user) => { + let lockDuration = KnownUser.unlockTime(user) - currentTime; + if (lockDuration >= this.settings.lockoutPeriod) { + lockDuration = this.settings.lockoutPeriod * 1000; + } + if (lockDuration <= 1) { + lockDuration = 1; + } + Meteor.setTimeout( + KnownUser.unlockAccount.bind(null, user._id), + lockDuration, + ); + }); + } + + static unlockAccountsIfLockoutAlreadyExpired() { + const currentTime = Number(new Date()); + const query = { + 'services.accounts-lockout.unlockTime': { + $lt: currentTime, + }, + }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } + + hookIntoAccounts() { + Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this)); + Accounts.onLogin(KnownUser.onLogin); + } + + + validateLoginAttempt(loginInfo) { + if ( + // don't interrupt non-password logins + loginInfo.type !== 'password' || + loginInfo.user === undefined || + // Don't handle errors unless they are due to incorrect password + (loginInfo.error !== undefined && loginInfo.error.reason !== 'Incorrect password') + ) { + return loginInfo.allowed; + } + + // If there was no login error and the account is NOT locked, don't interrupt + const unlockTime = KnownUser.unlockTime(loginInfo.user); + if (loginInfo.error === undefined && unlockTime === 0) { + return loginInfo.allowed; + } + + if (this.unchangedSettings instanceof Function) { + this.settings = this.unchangedSettings(loginInfo.user); + this.validateSettings(); + } + + const userId = loginInfo.user._id; + let failedAttempts = 1 + KnownUser.failedAttempts(loginInfo.user); + const firstFailedAttempt = KnownUser.firstFailedAttempt(loginInfo.user); + const currentTime = Number(new Date()); + + const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow); + if (canReset) { + failedAttempts = 1; + KnownUser.resetAttempts(failedAttempts, userId); + } + + const canIncrement = failedAttempts < this.settings.failuresBeforeLockout; + if (canIncrement) { + KnownUser.incrementAttempts(failedAttempts, userId); + } + + const maxAttemptsAllowed = this.settings.failuresBeforeLockout; + const attemptsRemaining = maxAttemptsAllowed - failedAttempts; + if (unlockTime > currentTime) { + let duration = unlockTime - currentTime; + duration = Math.ceil(duration / 1000); + duration = duration > 1 ? duration : 1; + KnownUser.tooManyAttempts(duration); + } + if (failedAttempts === maxAttemptsAllowed) { + this.setNewUnlockTime(failedAttempts, userId); + + let duration = this.settings.lockoutPeriod; + duration = Math.ceil(duration); + duration = duration > 1 ? duration : 1; + return KnownUser.tooManyAttempts(duration); + } + return KnownUser.incorrectPassword( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ); + } + + static resetAttempts( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.firstFailedAttempt': currentTime, + }, + }; + Meteor.users.update(query, data); + } + + static incrementAttempts( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + }, + }; + Meteor.users.update(query, data); + } + + setNewUnlockTime( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime; + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.unlockTime': newUnlockTime, + }, + }; + Meteor.users.update(query, data); + Meteor.setTimeout( + KnownUser.unlockAccount.bind(null, userId), + this.settings.lockoutPeriod * 1000, + ); + } + + static onLogin(loginInfo) { + //get the data from oidc login and remove again? + if(loginInfo.type ==='oidc'){ + Meteor.call('groupRoutineOnLogin', loginInfo.user.services.oidc, loginInfo.user._id); + return; + } + if (loginInfo.type !== 'password') { + return; + } + const userId = loginInfo.user._id; + const query = { _id: userId }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } + + static incorrectPassword( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ) { + throw new Meteor.Error( + 403, + 'Incorrect password', + JSON.stringify({ + message: 'Incorrect password', + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + }), + ); + } + + static tooManyAttempts(duration) { + throw new Meteor.Error( + 403, + 'Too many attempts', + JSON.stringify({ + message: 'Wrong passwords were submitted too many times. Account is locked for a while.', + duration, + }), + ); + } + + static knownUsers() { + let knownUsers; + try { + knownUsers = Meteor.settings['accounts-lockout'].knownUsers; + } catch (e) { + knownUsers = false; + } + return knownUsers || false; + } + + static unlockTime(user) { + let unlockTime; + try { + unlockTime = user.services['accounts-lockout'].unlockTime; + } catch (e) { + unlockTime = 0; + } + return unlockTime || 0; + } + + static failedAttempts(user) { + let failedAttempts; + try { + failedAttempts = user.services['accounts-lockout'].failedAttempts; + } catch (e) { + failedAttempts = 0; + } + return failedAttempts || 0; + } + + static lastFailedAttempt(user) { + let lastFailedAttempt; + try { + lastFailedAttempt = user.services['accounts-lockout'].lastFailedAttempt; + } catch (e) { + lastFailedAttempt = 0; + } + return lastFailedAttempt || 0; + } + + static firstFailedAttempt(user) { + let firstFailedAttempt; + try { + firstFailedAttempt = user.services['accounts-lockout'].firstFailedAttempt; + } catch (e) { + firstFailedAttempt = 0; + } + return firstFailedAttempt || 0; + } + + static unlockAccount(userId) { + const query = { _id: userId }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } +} + +export default KnownUser; diff --git a/packages/wekan-accounts-lockout/src/unknownUser.js b/packages/wekan-accounts-lockout/src/unknownUser.js new file mode 100644 index 000000000..443507c82 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/unknownUser.js @@ -0,0 +1,329 @@ +import { Meteor } from 'meteor/meteor'; +import { Accounts } from 'meteor/accounts-base'; +import _AccountsLockoutCollection from './accountsLockoutCollection'; + +class UnknownUser { + constructor( + settings, + { + AccountsLockoutCollection = _AccountsLockoutCollection, + } = {}, + ) { + this.AccountsLockoutCollection = AccountsLockoutCollection; + this.settings = settings; + } + + startup() { + if (!(this.settings instanceof Function)) { + this.updateSettings(); + } + this.scheduleUnlocksForLockedAccounts(); + this.unlockAccountsIfLockoutAlreadyExpired(); + this.hookIntoAccounts(); + } + + updateSettings() { + const settings = UnknownUser.unknownUsers(); + if (settings) { + settings.forEach(function updateSetting({ key, value }) { + this.settings[key] = value; + }); + } + this.validateSettings(); + } + + validateSettings() { + if ( + !this.settings.failuresBeforeLockout || + this.settings.failuresBeforeLockout < 0 + ) { + throw new Error('"failuresBeforeLockout" is not positive integer'); + } + if ( + !this.settings.lockoutPeriod || + this.settings.lockoutPeriod < 0 + ) { + throw new Error('"lockoutPeriod" is not positive integer'); + } + if ( + !this.settings.failureWindow || + this.settings.failureWindow < 0 + ) { + throw new Error('"failureWindow" is not positive integer'); + } + } + + scheduleUnlocksForLockedAccounts() { + const lockedAccountsCursor = this.AccountsLockoutCollection.find( + { + 'services.accounts-lockout.unlockTime': { + $gt: Number(new Date()), + }, + }, + { + fields: { + 'services.accounts-lockout.unlockTime': 1, + }, + }, + ); + const currentTime = Number(new Date()); + lockedAccountsCursor.forEach((connection) => { + let lockDuration = this.unlockTime(connection) - currentTime; + if (lockDuration >= this.settings.lockoutPeriod) { + lockDuration = this.settings.lockoutPeriod * 1000; + } + if (lockDuration <= 1) { + lockDuration = 1; + } + Meteor.setTimeout( + this.unlockAccount.bind(this, connection.clientAddress), + lockDuration, + ); + }); + } + + unlockAccountsIfLockoutAlreadyExpired() { + const currentTime = Number(new Date()); + const query = { + 'services.accounts-lockout.unlockTime': { + $lt: currentTime, + }, + }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } + + hookIntoAccounts() { + Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this)); + Accounts.onLogin(this.onLogin.bind(this)); + } + + validateLoginAttempt(loginInfo) { + // don't interrupt non-password logins + if ( + loginInfo.type !== 'password' || + loginInfo.user !== undefined || + loginInfo.error === undefined || + loginInfo.error.reason !== 'User not found' + ) { + return loginInfo.allowed; + } + + if (this.settings instanceof Function) { + this.settings = this.settings(loginInfo.connection); + this.validateSettings(); + } + + const clientAddress = loginInfo.connection.clientAddress; + const unlockTime = this.unlockTime(loginInfo.connection); + let failedAttempts = 1 + this.failedAttempts(loginInfo.connection); + const firstFailedAttempt = this.firstFailedAttempt(loginInfo.connection); + const currentTime = Number(new Date()); + + const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow); + if (canReset) { + failedAttempts = 1; + this.resetAttempts(failedAttempts, clientAddress); + } + + const canIncrement = failedAttempts < this.settings.failuresBeforeLockout; + if (canIncrement) { + this.incrementAttempts(failedAttempts, clientAddress); + } + + const maxAttemptsAllowed = this.settings.failuresBeforeLockout; + const attemptsRemaining = maxAttemptsAllowed - failedAttempts; + if (unlockTime > currentTime) { + let duration = unlockTime - currentTime; + duration = Math.ceil(duration / 1000); + duration = duration > 1 ? duration : 1; + UnknownUser.tooManyAttempts(duration); + } + if (failedAttempts === maxAttemptsAllowed) { + this.setNewUnlockTime(failedAttempts, clientAddress); + + let duration = this.settings.lockoutPeriod; + duration = Math.ceil(duration); + duration = duration > 1 ? duration : 1; + return UnknownUser.tooManyAttempts(duration); + } + return UnknownUser.userNotFound( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ); + } + + resetAttempts( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.firstFailedAttempt': currentTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + } + + incrementAttempts( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + } + + setNewUnlockTime( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime; + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.unlockTime': newUnlockTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + Meteor.setTimeout( + this.unlockAccount.bind(this, clientAddress), + this.settings.lockoutPeriod * 1000, + ); + } + + onLogin(loginInfo) { + if (loginInfo.type !== 'password') { + return; + } + const clientAddress = loginInfo.connection.clientAddress; + const query = { clientAddress }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } + + static userNotFound( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ) { + throw new Meteor.Error( + 403, + 'User not found', + JSON.stringify({ + message: 'User not found', + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + }), + ); + } + + static tooManyAttempts(duration) { + throw new Meteor.Error( + 403, + 'Too many attempts', + JSON.stringify({ + message: 'Wrong emails were submitted too many times. Account is locked for a while.', + duration, + }), + ); + } + + static unknownUsers() { + let unknownUsers; + try { + unknownUsers = Meteor.settings['accounts-lockout'].unknownUsers; + } catch (e) { + unknownUsers = false; + } + return unknownUsers || false; + } + + findOneByConnection(connection) { + return this.AccountsLockoutCollection.findOne({ + clientAddress: connection.clientAddress, + }); + } + + unlockTime(connection) { + connection = this.findOneByConnection(connection); + let unlockTime; + try { + unlockTime = connection.services['accounts-lockout'].unlockTime; + } catch (e) { + unlockTime = 0; + } + return unlockTime || 0; + } + + failedAttempts(connection) { + connection = this.findOneByConnection(connection); + let failedAttempts; + try { + failedAttempts = connection.services['accounts-lockout'].failedAttempts; + } catch (e) { + failedAttempts = 0; + } + return failedAttempts || 0; + } + + lastFailedAttempt(connection) { + connection = this.findOneByConnection(connection); + let lastFailedAttempt; + try { + lastFailedAttempt = connection.services['accounts-lockout'].lastFailedAttempt; + } catch (e) { + lastFailedAttempt = 0; + } + return lastFailedAttempt || 0; + } + + firstFailedAttempt(connection) { + connection = this.findOneByConnection(connection); + let firstFailedAttempt; + try { + firstFailedAttempt = connection.services['accounts-lockout'].firstFailedAttempt; + } catch (e) { + firstFailedAttempt = 0; + } + return firstFailedAttempt || 0; + } + + unlockAccount(clientAddress) { + const query = { clientAddress }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } +} + +export default UnknownUser; diff --git a/packages/wekan-accounts-oidc/.gitignore b/packages/wekan-accounts-oidc/.gitignore new file mode 100644 index 000000000..5379d4c38 --- /dev/null +++ b/packages/wekan-accounts-oidc/.gitignore @@ -0,0 +1 @@ +.versions diff --git a/packages/wekan-accounts-oidc/LICENSE.txt b/packages/wekan-accounts-oidc/LICENSE.txt new file mode 100644 index 000000000..c7be32647 --- /dev/null +++ b/packages/wekan-accounts-oidc/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (C) 2016 SWITCH + +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. + diff --git a/packages/wekan-accounts-oidc/README.md b/packages/wekan-accounts-oidc/README.md new file mode 100644 index 000000000..ce0b5738b --- /dev/null +++ b/packages/wekan-accounts-oidc/README.md @@ -0,0 +1,75 @@ +# salleman:accounts-oidc package + +A Meteor login service for OpenID Connect (OIDC). + +## Installation + + meteor add salleman:accounts-oidc + +## Usage + +`Meteor.loginWithOidc(options, callback)` +* `options` - object containing options, see below (optional) +* `callback` - callback function (optional) + +#### Example + +```js +Template.myTemplateName.events({ + 'click #login-button': function() { + Meteor.loginWithOidc(); + } +); +``` + + +## Options + +These options override service configuration stored in the database. + +* `loginStyle`: `redirect` or `popup` +* `redirectUrl`: Where to redirect after successful login. Only used if `loginStyle` is set to `redirect` + +## Manual Configuration Setup + +You can manually configure this package by upserting the service configuration on startup. First, add the `service-configuration` package: + + meteor add service-configuration + +### Service Configuration + +The following service configuration are available: + +* `clientId`: OIDC client identifier +* `secret`: OIDC client shared secret +* `serverUrl`: URL of the OIDC server. e.g. `https://openid.example.org:8443` +* `authorizationEndpoint`: Endpoint of the OIDC authorization service, e.g. `/oidc/authorize` +* `tokenEndpoint`: Endpoint of the OIDC token service, e.g. `/oidc/token` +* `userinfoEndpoint`: Endpoint of the OIDC userinfo service, e.g. `/oidc/userinfo` +* `idTokenWhitelistFields`: A list of fields from IDToken to be added to Meteor.user().services.oidc object + +### Project Configuration + +Then in your project: + +```js +if (Meteor.isServer) { + Meteor.startup(function () { + ServiceConfiguration.configurations.upsert( + { service: 'oidc' }, + { + $set: { + loginStyle: 'redirect', + clientId: 'my-client-id-registered-with-the-oidc-server', + secret: 'my-client-shared-secret', + serverUrl: 'https://openid.example.org', + authorizationEndpoint: '/oidc/authorize', + tokenEndpoint: '/oidc/token', + userinfoEndpoint: '/oidc/userinfo', + idTokenWhitelistFields: [] + } + } + ); + }); +} +``` diff --git a/packages/wekan-accounts-oidc/oidc.js b/packages/wekan-accounts-oidc/oidc.js new file mode 100644 index 000000000..75cd89aeb --- /dev/null +++ b/packages/wekan-accounts-oidc/oidc.js @@ -0,0 +1,22 @@ +Accounts.oauth.registerService('oidc'); + +if (Meteor.isClient) { + Meteor.loginWithOidc = function(options, callback) { + // support a callback without options + if (! callback && typeof options === "function") { + callback = options; + options = null; + } + + var credentialRequestCompleteCallback = Accounts.oauth.credentialRequestCompleteHandler(callback); + Oidc.requestCredential(options, credentialRequestCompleteCallback); + }; +} else { + Accounts.addAutopublishFields({ + // not sure whether the OIDC api can be used from the browser, + // thus not sure if we should be sending access tokens; but we do it + // for all other oauth2 providers, and it may come in handy. + forLoggedInUser: ['services.oidc'], + forOtherUsers: ['services.oidc.id'] + }); +} diff --git a/packages/wekan-accounts-oidc/oidc_login_button.css b/packages/wekan-accounts-oidc/oidc_login_button.css new file mode 100644 index 000000000..da42120b8 --- /dev/null +++ b/packages/wekan-accounts-oidc/oidc_login_button.css @@ -0,0 +1,3 @@ +#login-buttons-image-oidc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQUlEQVQ4T5WTy2taQRTGv4kSXw0IoYIihCjFmhhfhUqW9a+o0I2LInTRRbtw05V2I9KQuuimi24KXQqChIhQQcQgGGNz0YpvMCG1yL1tGqvBZsKMIIXcjQcOcznnfL+ZOecOEUVx4/Ly8mQ6neqxhKlUKmltbc1Nut2uqJ/bEnJAkiTmEhEEgVqtViiVyjuAP70j/Pj6Htbglzu52WyGdrsNUq1Wqc1mk939+9sHPP7wTVM232g0QMrlMrXb7bIFndgcbAk3ZPP1eh2kVCrRra2tRcFoNEK1WoXf78fg3Rxsfl3H3t4e3G43dnd3wWrMZjNqtRpIsVhcAFKpFPL5PBfF43H8TDj49/2XAvb393F2dgaNRgNKKaLR6ByQz+epw+HAwcEBisUijEYjgsEg1Go1pA9ODtC/+MZFDCKKIo9FIhEIggCSy+Xozs4OYrEY2ChDoRAIIVww/ujhxdrnFTSbTX6Cfr+Pi4sLhMNhnJ6egmSzWepyuZBIJGAwGBAIBLiY2ezTI74qg2UoFIqFr6ys4OrqiveKHB4eckAmk8FgMMD29jZ8Ph8XKj4/5uu/ZyXZKXBAOp2mHo+H/0isD6zDOp0Om5ubsAuvcA+/8ffpkSygUqmApFIp6vV6+b2ZsNfrodVqYTgcwqXtwul04pfhiSzg+PgYJJlMUovFwhvIbHV1lTs70c3NDSaTCa6vr+8A2FvodDr8CmwuepPJtIDIbvdfkInPz89ZRCKFQmFjNBqdjMfjpZ6jVquV1tfX3bcYegI7CyIWlgAAAABJRU5ErkJggg=='); +} diff --git a/packages/wekan-accounts-oidc/package.js b/packages/wekan-accounts-oidc/package.js new file mode 100644 index 000000000..bc3fa429f --- /dev/null +++ b/packages/wekan-accounts-oidc/package.js @@ -0,0 +1,19 @@ +Package.describe({ + summary: "OpenID Connect (OIDC) for Meteor accounts", + version: "1.0.10", + name: "wekan-accounts-oidc", + git: "https://github.com/wekan/meteor-accounts-oidc.git", + +}); + +Package.onUse(function(api) { + api.use('accounts-base', ['client', 'server']); + // Export Accounts (etc) to packages using this one. + api.imply('accounts-base', ['client', 'server']); + api.use('accounts-oauth', ['client', 'server']); + api.use('wekan-oidc', ['client', 'server']); + + api.addFiles('oidc_login_button.css', 'client'); + + api.addFiles('oidc.js'); +}); diff --git a/packages/wekan-ldap/LICENSE b/packages/wekan-ldap/LICENSE new file mode 100644 index 000000000..c2d691582 --- /dev/null +++ b/packages/wekan-ldap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 The Wekan Team + +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. diff --git a/packages/wekan-ldap/README.md b/packages/wekan-ldap/README.md new file mode 100644 index 000000000..4f41d0238 --- /dev/null +++ b/packages/wekan-ldap/README.md @@ -0,0 +1,130 @@ +# meteor-ldap + +This packages is based on the RocketChat ldap login package + +# settings definition + +LDAP_Enable: Self explanatory + +LDAP_Port: The port of the LDAP server + +LDAP_Host: The host server for the LDAP server + +LDAP_BaseDN: The base DN for the LDAP Tree + +LDAP_Login_Fallback: Fallback on the default authentication method + +LDAP_Reconnect: Reconnect to the server if the connection is lost + +LDAP_Timeout: self explanatory + +LDAP_Idle_Timeout: self explanatory + +LDAP_Connect_Timeout: self explanatory + +LDAP_Authentication: If the LDAP needs a user account to search + +LDAP_Authentication_UserDN: The search user DN + +LDAP_Authentication_Password: The password for the search user + +LDAP_Internal_Log_Level: The logging level for the module + +LDAP_Background_Sync: If the sync of the users should be done in the +background + +LDAP_Background_Sync_Interval: At which interval does the background task sync + +LDAP_Encryption: If using LDAPS, set it to 'ssl', else it will use 'ldap://' + +LDAP_CA_Cert: The certification for the LDAPS server + +LDAP_Reject_Unauthorized: Reject Unauthorized Certificate + +LDAP_User_Search_Filter: + +LDAP_User_Search_Scope: + +LDAP_User_Search_Field: Which field is used to find the user + +LDAP_Search_Page_Size: + +LDAP_Search_Size_Limit: + +LDAP_Group_Filter_Enable: enable group filtering + +LDAP_Group_Filter_ObjectClass: The object class for filtering + +LDAP_Group_Filter_Group_Id_Attribute: + +LDAP_Group_Filter_Group_Member_Attribute: + +LDAP_Group_Filter_Group_Member_Format: + +LDAP_Group_Filter_Group_Name: + +LDAP_Unique_Identifier_Field: This field is sometimes class GUID ( Globally Unique Identifier) + +UTF8_Names_Slugify: Convert the username to utf8 + +LDAP_Username_Field: Which field contains the ldap username + +LDAP_Fullname_Field: Which field contains the ldap full name + +LDAP_Email_Match_Enable: Allow existing account matching by e-mail address when username does not match + +LDAP_Email_Match_Require: Require existing account matching by e-mail address when username does match + +LDAP_Email_Match_Verified: Require existing account email address to be verified for matching + +LDAP_Email_Field: Which field contains the LDAP e-mail address + +LDAP_Sync_User_Data: + +LDAP_Sync_User_Data_FieldMap: + +Accounts_CustomFields: + +LDAP_Default_Domain: The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_Sync_User_Data_FieldMap + + + + +# example settings.json +``` +{ + "LDAP_Port": 389, + "LDAP_Host": "localhost", + "LDAP_BaseDN": "ou=user,dc=example,dc=org", + "LDAP_Login_Fallback": false, + "LDAP_Reconnect": true, + "LDAP_Timeout": 10000, + "LDAP_Idle_Timeout": 10000, + "LDAP_Connect_Timeout": 10000, + "LDAP_Authentication": true, + "LDAP_Authentication_UserDN": "cn=admin,dc=example,dc=org", + "LDAP_Authentication_Password": "admin", + "LDAP_Internal_Log_Level": "debug", + "LDAP_Background_Sync": false, + "LDAP_Background_Sync_Interval": "100", + "LDAP_Encryption": false, + "LDAP_Reject_Unauthorized": false, + "LDAP_Group_Filter_Enable": false, + "LDAP_Search_Page_Size": 0, + "LDAP_Search_Size_Limit": 0, + "LDAP_User_Search_Filter": "", + "LDAP_User_Search_Field": "uid", + "LDAP_User_Search_Scope": "", + "LDAP_Unique_Identifier_Field": "guid", + "LDAP_Username_Field": "uid", + "LDAP_Fullname_Field": "cn", + "LDAP_Email_Match_Enable": true, + "LDAP_Email_Match_Require": false, + "LDAP_Email_Match_Verified": false, + "LDAP_Email_Field": "mail", + "LDAP_Sync_User_Data": false, + "LDAP_Sync_User_Data_FieldMap": "{\"cn\":\"name\", \"mail\":\"email\"}", + "LDAP_Merge_Existing_Users": true, + "UTF8_Names_Slugify": true +} +``` diff --git a/packages/wekan-ldap/client/loginHelper.js b/packages/wekan-ldap/client/loginHelper.js new file mode 100644 index 000000000..48a290c18 --- /dev/null +++ b/packages/wekan-ldap/client/loginHelper.js @@ -0,0 +1,52 @@ +// Pass in username, password as normal +// customLdapOptions should be passed in if you want to override LDAP_DEFAULTS +// on any particular call (if you have multiple ldap servers you'd like to connect to) +// You'll likely want to set the dn value here {dn: "..."} +Meteor.loginWithLDAP = function(username, password, customLdapOptions, callback) { + // Retrieve arguments as array + const args = []; + for (let i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + // Pull username and password + username = args.shift(); + password = args.shift(); + + // Check if last argument is a function + // if it is, pop it off and set callback to it + if (typeof args[args.length-1] === 'function') { + callback = args.pop(); + } else { + callback = null; + } + + // if args still holds options item, grab it + if (args.length > 0) { + customLdapOptions = args.shift(); + } else { + customLdapOptions = {}; + } + + // Set up loginRequest object + const loginRequest = { + ldap: true, + username, + ldapPass: password, + ldapOptions: customLdapOptions, + }; + + Accounts.callLoginMethod({ + // Call login method with ldap = true + // This will hook into our login handler for ldap + methodArguments: [loginRequest], + userCallback(error/*, result*/) { + if (error) { + if (callback) { + callback(error); + } + } else if (callback) { + callback(); + } + }, + }); +}; diff --git a/packages/wekan-ldap/package.js b/packages/wekan-ldap/package.js new file mode 100644 index 000000000..b3ea7a7d9 --- /dev/null +++ b/packages/wekan-ldap/package.js @@ -0,0 +1,28 @@ +Package.describe({ + name: 'wekan-ldap', + version: '0.0.2', + // Brief, one-line summary of the package. + summary: 'Basic meteor login with ldap', + // URL to the Git repository containing the source code for this package. + git: 'https://github.com/wekan/wekan-ldap', + // By default, Meteor will default to using README.md for documentation. + // To avoid submitting documentation, set this field to null. + documentation: 'README.md' +}); + + +Package.onUse(function(api) { + api.versionsFrom('2.7'); + api.use('yasaricli:slugify'); + api.use('ecmascript'); + api.use('underscore'); + api.use('sha'); + api.use('templating', 'client'); + + api.use('accounts-base', 'server'); + api.use('accounts-password', 'server'); + api.use('percolate:synced-cron', 'server'); + api.addFiles('client/loginHelper.js', 'client'); + + api.mainModule('server/index.js', 'server'); +}); diff --git a/packages/wekan-ldap/server/index.js b/packages/wekan-ldap/server/index.js new file mode 100644 index 000000000..e3ff85a10 --- /dev/null +++ b/packages/wekan-ldap/server/index.js @@ -0,0 +1 @@ +import './loginHandler'; diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js new file mode 100644 index 000000000..11b629406 --- /dev/null +++ b/packages/wekan-ldap/server/ldap.js @@ -0,0 +1,593 @@ +import ldapjs from 'ldapjs'; +import util from 'util'; +import Bunyan from 'bunyan'; +import {log_debug, log_info, log_warn, log_error} from './logger'; + + +export default class LDAP { + constructor() { + this.ldapjs = ldapjs; + + this.connected = false; + + this.options = { + host : this.constructor.settings_get('LDAP_HOST'), + port : this.constructor.settings_get('LDAP_PORT'), + Reconnect : this.constructor.settings_get('LDAP_RECONNECT'), + timeout : this.constructor.settings_get('LDAP_TIMEOUT'), + connect_timeout : this.constructor.settings_get('LDAP_CONNECT_TIMEOUT'), + idle_timeout : this.constructor.settings_get('LDAP_IDLE_TIMEOUT'), + encryption : this.constructor.settings_get('LDAP_ENCRYPTION'), + ca_cert : this.constructor.settings_get('LDAP_CA_CERT'), + reject_unauthorized : this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') !== undefined ? this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') : true, + Authentication : this.constructor.settings_get('LDAP_AUTHENTIFICATION'), + Authentication_UserDN : this.constructor.settings_get('LDAP_AUTHENTIFICATION_USERDN'), + Authentication_Password : this.constructor.settings_get('LDAP_AUTHENTIFICATION_PASSWORD'), + Authentication_Fallback : this.constructor.settings_get('LDAP_LOGIN_FALLBACK'), + BaseDN : this.constructor.settings_get('LDAP_BASEDN'), + Internal_Log_Level : this.constructor.settings_get('INTERNAL_LOG_LEVEL'), + User_Authentication : this.constructor.settings_get('LDAP_USER_AUTHENTICATION'), + User_Authentication_Field : this.constructor.settings_get('LDAP_USER_AUTHENTICATION_FIELD'), + User_Attributes : this.constructor.settings_get('LDAP_USER_ATTRIBUTES'), + User_Search_Filter : this.constructor.settings_get('LDAP_USER_SEARCH_FILTER'), + User_Search_Scope : this.constructor.settings_get('LDAP_USER_SEARCH_SCOPE'), + User_Search_Field : this.constructor.settings_get('LDAP_USER_SEARCH_FIELD'), + Search_Page_Size : this.constructor.settings_get('LDAP_SEARCH_PAGE_SIZE'), + Search_Size_Limit : this.constructor.settings_get('LDAP_SEARCH_SIZE_LIMIT'), + group_filter_enabled : this.constructor.settings_get('LDAP_GROUP_FILTER_ENABLE'), + group_filter_object_class : this.constructor.settings_get('LDAP_GROUP_FILTER_OBJECTCLASS'), + group_filter_group_id_attribute : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE'), + group_filter_group_member_attribute: this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE'), + group_filter_group_member_format : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT'), + group_filter_group_name : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_NAME'), + AD_Simple_Auth : this.constructor.settings_get('LDAP_AD_SIMPLE_AUTH'), + Default_Domain : this.constructor.settings_get('LDAP_DEFAULT_DOMAIN'), + }; + } + + static settings_get(name, ...args) { + let value = process.env[name]; + if (value !== undefined) { + if (value === 'true' || value === 'false') { + value = JSON.parse(value); + } else if (value !== '' && !isNaN(value)) { + value = Number(value); + } + return value; + } else { + log_warn(`Lookup for unset variable: ${name}`); + } + } + + connectSync(...args) { + if (!this._connectSync) { + this._connectSync = Meteor.wrapAsync(this.connectAsync, this); + } + return this._connectSync(...args); + } + + searchAllSync(...args) { + + if (!this._searchAllSync) { + this._searchAllSync = Meteor.wrapAsync(this.searchAllAsync, this); + } + return this._searchAllSync(...args); + } + + connectAsync(callback) { + log_info('Init setup'); + + let replied = false; + + const connectionOptions = { + url : `${this.options.host}:${this.options.port}`, + timeout : this.options.timeout, + connectTimeout: this.options.connect_timeout, + idleTimeout : this.options.idle_timeout, + reconnect : this.options.Reconnect, + }; + + if (this.options.Internal_Log_Level !== 'disabled') { + connectionOptions.log = new Bunyan({ + name : 'ldapjs', + component: 'client', + stream : process.stderr, + level : this.options.Internal_Log_Level, + }); + } + + const tlsOptions = { + rejectUnauthorized: this.options.reject_unauthorized, + }; + + if (this.options.ca_cert && this.options.ca_cert !== '') { + // Split CA cert into array of strings + const chainLines = this.constructor.settings_get('LDAP_CA_CERT').replace(/\\n/g,'\n').split('\n'); + let cert = []; + const ca = []; + chainLines.forEach((line) => { + cert.push(line); + if (line.match(/-END CERTIFICATE-/)) { + ca.push(cert.join('\n')); + cert = []; + } + }); + tlsOptions.ca = ca; + } + + if (this.options.encryption === 'ssl') { + connectionOptions.url = `ldaps://${connectionOptions.url}`; + connectionOptions.tlsOptions = tlsOptions; + } else { + connectionOptions.url = `ldap://${connectionOptions.url}`; + } + + log_info('Connecting', connectionOptions.url); + log_debug(`connectionOptions${util.inspect(connectionOptions)}`); + + this.client = ldapjs.createClient(connectionOptions); + + this.bindSync = Meteor.wrapAsync(this.client.bind, this.client); + + this.client.on('error', (error) => { + log_error('connection', error); + if (replied === false) { + replied = true; + callback(error, null); + } + }); + + this.client.on('idle', () => { + log_info('Idle'); + this.disconnect(); + }); + + this.client.on('close', () => { + log_info('Closed'); + }); + + if (this.options.encryption === 'tls') { + // Set host parameter for tls.connect which is used by ldapjs starttls. This shouldn't be needed in newer nodejs versions (e.g v5.6.0). + // https://github.com/RocketChat/Rocket.Chat/issues/2035 + // https://github.com/mcavage/node-ldapjs/issues/349 + tlsOptions.host = this.options.host; + + log_info('Starting TLS'); + log_debug('tlsOptions', tlsOptions); + + this.client.starttls(tlsOptions, null, (error, response) => { + if (error) { + log_error('TLS connection', error); + if (replied === false) { + replied = true; + callback(error, null); + } + return; + } + + log_info('TLS connected'); + this.connected = true; + if (replied === false) { + replied = true; + callback(null, response); + } + }); + } else { + this.client.on('connect', (response) => { + log_info('LDAP connected'); + this.connected = true; + if (replied === false) { + replied = true; + callback(null, response); + } + }); + } + + setTimeout(() => { + if (replied === false) { + log_error('connection time out', connectionOptions.connectTimeout); + replied = true; + callback(new Error('Timeout')); + } + }, connectionOptions.connectTimeout); + } + + getUserFilter(username) { + const filter = []; + + if (this.options.User_Search_Filter !== '') { + if (this.options.User_Search_Filter[0] === '(') { + filter.push(`${this.options.User_Search_Filter}`); + } else { + filter.push(`(${this.options.User_Search_Filter})`); + } + } + + const usernameFilter = this.options.User_Search_Field.split(',').map((item) => `(${item}=${username})`); + + if (usernameFilter.length === 0) { + log_error('LDAP_LDAP_User_Search_Field not defined'); + } else if (usernameFilter.length === 1) { + filter.push(`${usernameFilter[0]}`); + } else { + filter.push(`(|${usernameFilter.join('')})`); + } + + return `(&${filter.join('')})`; + } + + bindUserIfNecessary(username, password) { + + if (this.domainBinded === true) { + return; + } + + if (!this.options.User_Authentication) { + return; + } + + /* if SimpleAuth is configured, the BaseDN is not needed */ + if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); + + var userDn = ""; + if (this.options.AD_Simple_Auth === true || this.options.AD_Simple_Auth === 'true') { + userDn = `${username}@${this.options.Default_Domain}`; + } else { + userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; + } + + log_info('Binding with User', userDn); + + this.bindSync(userDn, password); + this.domainBinded = true; + } + + bindIfNecessary() { + if (this.domainBinded === true) { + return; + } + + if (this.options.Authentication !== true) { + return; + } + + log_info('Binding UserDN', this.options.Authentication_UserDN); + + this.bindSync(this.options.Authentication_UserDN, this.options.Authentication_Password); + this.domainBinded = true; + } + + searchUsersSync(username, page) { + this.bindIfNecessary(); + const searchOptions = { + filter : this.getUserFilter(username), + scope : this.options.User_Search_Scope || 'sub', + sizeLimit: this.options.Search_Size_Limit, + }; + + if (!!this.options.User_Attributes) searchOptions.attributes = this.options.User_Attributes.split(','); + + if (this.options.Search_Page_Size > 0) { + searchOptions.paged = { + pageSize : this.options.Search_Page_Size, + pagePause: !!page, + }; + } + + log_info('Searching user', username); + log_debug('searchOptions', searchOptions); + log_debug('BaseDN', this.options.BaseDN); + + if (page) { + return this.searchAllPaged(this.options.BaseDN, searchOptions, page); + } + + return this.searchAllSync(this.options.BaseDN, searchOptions); + } + + getUserByIdSync(id, attribute) { + this.bindIfNecessary(); + + const Unique_Identifier_Field = this.constructor.settings_get('LDAP_UNIQUE_IDENTIFIER_FIELD').split(','); + + let filter; + + if (attribute) { + filter = new this.ldapjs.filters.EqualityFilter({ + attribute, + value: Buffer.from(id, 'hex'), + }); + } else { + const filters = []; + Unique_Identifier_Field.forEach((item) => { + filters.push(new this.ldapjs.filters.EqualityFilter({ + attribute: item, + value : Buffer.from(id, 'hex'), + })); + }); + + filter = new this.ldapjs.filters.OrFilter({ filters }); + } + + const searchOptions = { + filter, + scope: 'sub', + }; + + log_info('Searching by id', id); + log_debug('search filter', searchOptions.filter.toString()); + log_debug('BaseDN', this.options.BaseDN); + + const result = this.searchAllSync(this.options.BaseDN, searchOptions); + + if (!Array.isArray(result) || result.length === 0) { + return; + } + + if (result.length > 1) { + log_error('Search by id', id, 'returned', result.length, 'records'); + } + + return result[0]; + } + + getUserByUsernameSync(username) { + this.bindIfNecessary(); + + const searchOptions = { + filter: this.getUserFilter(username), + scope : this.options.User_Search_Scope || 'sub', + }; + + log_info('Searching user', username); + log_debug('searchOptions', searchOptions); + log_debug('BaseDN', this.options.BaseDN); + + const result = this.searchAllSync(this.options.BaseDN, searchOptions); + + if (!Array.isArray(result) || result.length === 0) { + return; + } + + if (result.length > 1) { + log_error('Search by username', username, 'returned', result.length, 'records'); + } + + return result[0]; + } + + getUserGroups(username, ldapUser) { + if (!this.options.group_filter_enabled) { + return true; + } + + const filter = ['(&']; + + if (this.options.group_filter_object_class !== '') { + filter.push(`(objectclass=${this.options.group_filter_object_class})`); + } + + if (this.options.group_filter_group_member_attribute !== '') { + const format_value = ldapUser[this.options.group_filter_group_member_format]; + if (format_value) { + filter.push(`(${this.options.group_filter_group_member_attribute}=${format_value})`); + } + } + + filter.push(')'); + + const searchOptions = { + filter: filter.join('').replace(/#{username}/g, username), + scope : 'sub', + }; + + log_debug('Group list filter LDAP:', searchOptions.filter); + + const result = this.searchAllSync(this.options.BaseDN, searchOptions); + + if (!Array.isArray(result) || result.length === 0) { + return []; + } + + const grp_identifier = this.options.group_filter_group_id_attribute || 'cn'; + const groups = []; + result.map((item) => { + groups.push(item[grp_identifier]); + }); + log_debug(`Groups: ${groups.join(', ')}`); + return groups; + + } + + isUserInGroup(username, ldapUser) { + if (!this.options.group_filter_enabled) { + return true; + } + + const grps = this.getUserGroups(username, ldapUser); + + const filter = ['(&']; + + if (this.options.group_filter_object_class !== '') { + filter.push(`(objectclass=${this.options.group_filter_object_class})`); + } + + if (this.options.group_filter_group_member_attribute !== '') { + const format_value = ldapUser[this.options.group_filter_group_member_format]; + if (format_value) { + filter.push(`(${this.options.group_filter_group_member_attribute}=${format_value})`); + } + } + + if (this.options.group_filter_group_id_attribute !== '') { + filter.push(`(${this.options.group_filter_group_id_attribute}=${this.options.group_filter_group_name})`); + } + filter.push(')'); + + const searchOptions = { + filter: filter.join('').replace(/#{username}/g, username), + scope : 'sub', + }; + + log_debug('Group filter LDAP:', searchOptions.filter); + + const result = this.searchAllSync(this.options.BaseDN, searchOptions); + + if (!Array.isArray(result) || result.length === 0) { + return false; + } + return true; + } + + extractLdapEntryData(entry) { + const values = { + _raw: entry.raw, + }; + + Object.keys(values._raw).forEach((key) => { + const value = values._raw[key]; + + if (!['thumbnailPhoto', 'jpegPhoto'].includes(key)) { + if (value instanceof Buffer) { + values[key] = value.toString(); + } else { + values[key] = value; + } + } + }); + + return values; + } + + searchAllPaged(BaseDN, options, page) { + this.bindIfNecessary(); + + const processPage = ({ entries, title, end, next }) => { + log_info(title); + // Force LDAP idle to wait the record processing + this.client._updateIdle(true); + page(null, entries, { + end, next: () => { + // Reset idle timer + this.client._updateIdle(); + next && next(); + } + }); + }; + + this.client.search(BaseDN, options, (error, res) => { + if (error) { + log_error(error); + page(error); + return; + } + + res.on('error', (error) => { + log_error(error); + page(error); + return; + }); + + let entries = []; + + const internalPageSize = options.paged && options.paged.pageSize > 0 ? options.paged.pageSize * 2 : 500; + + res.on('searchEntry', (entry) => { + entries.push(this.extractLdapEntryData(entry)); + + if (entries.length >= internalPageSize) { + processPage({ + entries, + title: 'Internal Page', + end : false, + }); + entries = []; + } + }); + + res.on('page', (result, next) => { + if (!next) { + this.client._updateIdle(true); + processPage({ + entries, + title: 'Final Page', + end : true, + }); + } else if (entries.length) { + log_info('Page'); + processPage({ + entries, + title: 'Page', + end : false, + next, + }); + entries = []; + } + }); + + res.on('end', () => { + if (entries.length) { + processPage({ + entries, + title: 'Final Page', + end : true, + }); + entries = []; + } + }); + }); + } + + searchAllAsync(BaseDN, options, callback) { + this.bindIfNecessary(); + + this.client.search(BaseDN, options, (error, res) => { + if (error) { + log_error(error); + callback(error); + return; + } + + res.on('error', (error) => { + log_error(error); + callback(error); + return; + }); + + const entries = []; + + res.on('searchEntry', (entry) => { + entries.push(this.extractLdapEntryData(entry)); + }); + + res.on('end', () => { + log_info('Search result count', entries.length); + callback(null, entries); + }); + }); + } + + authSync(dn, password) { + log_info('Authenticating', dn); + + try { + if (password === '') { + throw new Error('Password is not provided'); + } + this.bindSync(dn, password); + log_info('Authenticated', dn); + return true; + } catch (error) { + log_info('Not authenticated', dn); + log_debug('error', error); + return false; + } + } + + disconnect() { + this.connected = false; + this.domainBinded = false; + log_info('Disconecting'); + this.client.unbind(); + } +} diff --git a/packages/wekan-ldap/server/logger.js b/packages/wekan-ldap/server/logger.js new file mode 100644 index 000000000..afd77112e --- /dev/null +++ b/packages/wekan-ldap/server/logger.js @@ -0,0 +1,15 @@ +const isLogEnabled = (process.env.LDAP_LOG_ENABLED === 'true'); + + +function log (level, message, data) { + if (isLogEnabled) { + console.log(`[${level}] ${message} ${ data ? JSON.stringify(data, null, 2) : '' }`); + } +} + +function log_debug (...args) { log('DEBUG', ...args); } +function log_info (...args) { log('INFO', ...args); } +function log_warn (...args) { log('WARN', ...args); } +function log_error (...args) { log('ERROR', ...args); } + +export { log, log_debug, log_info, log_warn, log_error }; diff --git a/packages/wekan-ldap/server/loginHandler.js b/packages/wekan-ldap/server/loginHandler.js new file mode 100644 index 000000000..090ef9da3 --- /dev/null +++ b/packages/wekan-ldap/server/loginHandler.js @@ -0,0 +1,252 @@ +import {slug, getLdapUsername, getLdapEmail, getLdapUserUniqueID, syncUserData, addLdapUser} from './sync'; +import LDAP from './ldap'; +import { log_debug, log_info, log_warn, log_error } from './logger'; + +function fallbackDefaultAccountSystem(bind, username, password) { + if (typeof username === 'string') { + if (username.indexOf('@') === -1) { + username = {username}; + } else { + username = {email: username}; + } + } + + log_info('Fallback to default account system: ', username ); + + const loginRequest = { + user: username, + password: { + digest: SHA256(password), + algorithm: 'sha-256', + }, + }; + log_debug('Fallback options: ', loginRequest); + + return Accounts._runLoginHandlers(bind, loginRequest); +} + +Accounts.registerLoginHandler('ldap', function(loginRequest) { + if (!loginRequest.ldap || !loginRequest.ldapOptions) { + return undefined; + } + + log_info('Init LDAP login', loginRequest.username); + + if (LDAP.settings_get('LDAP_ENABLE') !== true) { + return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.ldapPass); + } + + const self = this; + const ldap = new LDAP(); + let ldapUser; + + try { + + ldap.connectSync(); + + if (!!LDAP.settings_get('LDAP_USER_AUTHENTICATION')) { + ldap.bindUserIfNecessary(loginRequest.username, loginRequest.ldapPass); + ldapUser = ldap.searchUsersSync(loginRequest.username)[0]; + } else { + + const users = ldap.searchUsersSync(loginRequest.username); + + if (users.length !== 1) { + log_info('Search returned', users.length, 'record(s) for', loginRequest.username); + throw new Error('User not Found'); + } + + if (ldap.isUserInGroup(loginRequest.username, users[0])) { + ldapUser = users[0]; + } else { + throw new Error('User not in a valid group'); + } + + if (ldap.authSync(users[0].dn, loginRequest.ldapPass) !== true) { + ldapUser = null; + log_info('Wrong password for', loginRequest.username) + } + } + + } catch (error) { + log_error(error); + } + + if (!ldapUser) { + if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') === true) { + return fallbackDefaultAccountSystem(self, loginRequest.username, loginRequest.ldapPass); + } + + throw new Meteor.Error('LDAP-login-error', `LDAP Authentication failed with provided username [${ loginRequest.username }]`); + } + + // Look to see if user already exists + + let userQuery; + + const Unique_Identifier_Field = getLdapUserUniqueID(ldapUser); + let user; + // Attempt to find user by unique identifier + + if (Unique_Identifier_Field) { + userQuery = { + 'services.ldap.id': Unique_Identifier_Field.value, + }; + + log_info('Querying user'); + log_debug('userQuery', userQuery); + + user = Meteor.users.findOne(userQuery); + } + + // Attempt to find user by username + + let username; + let email; + + if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { + username = slug(getLdapUsername(ldapUser)); + } else { + username = slug(loginRequest.username); + } + + if(LDAP.settings_get('LDAP_EMAIL_FIELD') !== '') { + email = getLdapEmail(ldapUser); + } + + + if (!user) { + if(email && LDAP.settings_get('LDAP_EMAIL_MATCH_REQUIRE') === true) { + if(LDAP.settings_get('LDAP_EMAIL_MATCH_VERIFIED') === true) { + userQuery = { + '_id' : username, + 'emails.0.address' : email, + 'emails.0.verified' : true + }; + } else { + userQuery = { + '_id' : username, + 'emails.0.address' : email + }; + } + } else { + userQuery = { + username + }; + } + + log_debug('userQuery', userQuery); + + user = Meteor.users.findOne(userQuery); + } + + // Attempt to find user by e-mail address only + + if (!user && email && LDAP.settings_get('LDAP_EMAIL_MATCH_ENABLE') === true) { + + log_info('No user exists with username', username, '- attempting to find by e-mail address instead'); + + if(LDAP.settings_get('LDAP_EMAIL_MATCH_VERIFIED') === true) { + userQuery = { + 'emails.0.address': email, + 'emails.0.verified' : true + }; + } else { + userQuery = { + 'emails.0.address' : email + }; + } + + log_debug('userQuery', userQuery); + + user = Meteor.users.findOne(userQuery); + + } + + // Login user if they exist + if (user) { + if (user.authenticationMethod !== 'ldap' && LDAP.settings_get('LDAP_MERGE_EXISTING_USERS') !== true) { + log_info('User exists without "authenticationMethod : ldap"'); + throw new Meteor.Error('LDAP-login-error', `LDAP Authentication succeded, but there's already a matching Wekan account in MongoDB`); + } + + log_info('Logging user'); + + const stampedToken = Accounts._generateStampedLoginToken(); + const update_data = { + $push: { + 'services.resume.loginTokens': Accounts._hashStampedToken(stampedToken), + }, + }; + + if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) { + log_debug('Updating admin status'); + const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(','); + const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value)); + + user.isAdmin = groups.length > 0; + Meteor.users.update({_id: user._id}, {$set: {isAdmin: user.isAdmin}}); + } + + if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) { + log_debug('Updating Groups/Roles'); + const groups = ldap.getUserGroups(username, ldapUser); + + if( groups.length > 0 ) { + Roles.setUserRoles(user._id, groups ); + log_info(`Updated roles to:${ groups.join(',')}`); + } + } + + Meteor.users.update(user._id, update_data ); + + syncUserData(user, ldapUser); + + if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') === true) { + Accounts.setPassword(user._id, loginRequest.ldapPass, {logout: false}); + } + + return { + userId: user._id, + token: stampedToken.token, + }; + } + + // Create new user + + log_info('User does not exist, creating', username); + + if (LDAP.settings_get('LDAP_USERNAME_FIELD') === '') { + username = undefined; + } + + if (LDAP.settings_get('LDAP_LOGIN_FALLBACK') !== true) { + loginRequest.ldapPass = undefined; + } + + const result = addLdapUser(ldapUser, username, loginRequest.ldapPass); + + if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) { + log_debug('Updating admin status'); + const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(','); + const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value)); + + result.isAdmin = groups.length > 0; + Meteor.users.update({_id: result.userId}, {$set: {isAdmin: result.isAdmin}}); + } + + if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) { + const groups = ldap.getUserGroups(username, ldapUser); + if( groups.length > 0 ) { + Roles.setUserRoles(result.userId, groups ); + log_info(`Set roles to:${ groups.join(',')}`); + } + } + + + if (result instanceof Error) { + throw result; + } + + return result; +}); diff --git a/packages/wekan-ldap/server/sync.js b/packages/wekan-ldap/server/sync.js new file mode 100644 index 000000000..efe7e35f3 --- /dev/null +++ b/packages/wekan-ldap/server/sync.js @@ -0,0 +1,474 @@ +import _ from 'underscore'; +import SyncedCron from 'meteor/percolate:synced-cron'; +import LDAP from './ldap'; +import { log_debug, log_info, log_warn, log_error } from './logger'; + +Object.defineProperty(Object.prototype, "getLDAPValue", { + value: function (prop) { + const self = this; + for (let key in self) { + if (key.toLowerCase() == prop.toLowerCase()) { + return self[key]; + } + } + }, + + enumerable: false +}); + +export function slug(text) { + if (LDAP.settings_get('LDAP_UTF8_NAMES_SLUGIFY') !== true) { + return text; + } + text = slugify(text, '.'); + return text.replace(/[^0-9a-z-_.]/g, ''); +} + +function templateVarHandler (variable, object) { + + const templateRegex = /#{([\w\-]+)}/gi; + let match = templateRegex.exec(variable); + let tmpVariable = variable; + + if (match == null) { + if (!object.hasOwnProperty(variable)) { + return; + } + return object[variable]; + } else { + while (match != null) { + const tmplVar = match[0]; + const tmplAttrName = match[1]; + + if (!object.hasOwnProperty(tmplAttrName)) { + return; + } + + const attrVal = object[tmplAttrName]; + tmpVariable = tmpVariable.replace(tmplVar, attrVal); + match = templateRegex.exec(variable); + } + return tmpVariable; + } +} + +export function getPropertyValue(obj, key) { + try { + return _.reduce(key.split('.'), (acc, el) => acc[el], obj); + } catch (err) { + return undefined; + } +} + +export function getLdapUsername(ldapUser) { + const usernameField = LDAP.settings_get('LDAP_USERNAME_FIELD'); + + if (usernameField.indexOf('#{') > -1) { + return usernameField.replace(/#{(.+?)}/g, function(match, field) { + return ldapUser.getLDAPValue(field); + }); + } + + return ldapUser.getLDAPValue(usernameField); +} + +export function getLdapEmail(ldapUser) { + const emailField = LDAP.settings_get('LDAP_EMAIL_FIELD'); + + if (emailField.indexOf('#{') > -1) { + return emailField.replace(/#{(.+?)}/g, function(match, field) { + return ldapUser.getLDAPValue(field); + }); + } + + const ldapMail = ldapUser.getLDAPValue(emailField); + if (typeof ldapMail === 'string') { + return ldapMail; + } else { + return ldapMail[0].toString(); + } +} + +export function getLdapFullname(ldapUser) { + const fullnameField = LDAP.settings_get('LDAP_FULLNAME_FIELD'); + if (fullnameField.indexOf('#{') > -1) { + return fullnameField.replace(/#{(.+?)}/g, function(match, field) { + return ldapUser.getLDAPValue(field); + }); + } + return ldapUser.getLDAPValue(fullnameField); +} + +export function getLdapUserUniqueID(ldapUser) { + let Unique_Identifier_Field = LDAP.settings_get('LDAP_UNIQUE_IDENTIFIER_FIELD'); + + if (Unique_Identifier_Field !== '') { + Unique_Identifier_Field = Unique_Identifier_Field.replace(/\s/g, '').split(','); + } else { + Unique_Identifier_Field = []; + } + + let User_Search_Field = LDAP.settings_get('LDAP_USER_SEARCH_FIELD'); + + if (User_Search_Field !== '') { + User_Search_Field = User_Search_Field.replace(/\s/g, '').split(','); + } else { + User_Search_Field = []; + } + + Unique_Identifier_Field = Unique_Identifier_Field.concat(User_Search_Field); + + if (Unique_Identifier_Field.length > 0) { + Unique_Identifier_Field = Unique_Identifier_Field.find((field) => { + return !_.isEmpty(ldapUser._raw.getLDAPValue(field)); + }); + if (Unique_Identifier_Field) { + log_debug(`Identifying user with: ${ Unique_Identifier_Field}`); + Unique_Identifier_Field = { + attribute: Unique_Identifier_Field, + value: ldapUser._raw.getLDAPValue(Unique_Identifier_Field).toString('hex'), + }; + } + return Unique_Identifier_Field; + } +} + +export function getDataToSyncUserData(ldapUser, user) { + const syncUserData = LDAP.settings_get('LDAP_SYNC_USER_DATA'); + const syncUserDataFieldMap = LDAP.settings_get('LDAP_SYNC_USER_DATA_FIELDMAP').trim(); + + const userData = {}; + + if (syncUserData && syncUserDataFieldMap) { + const whitelistedUserFields = ['email', 'name', 'customFields']; + const fieldMap = JSON.parse(syncUserDataFieldMap); + const emailList = []; + _.map(fieldMap, function(userField, ldapField) { + log_debug(`Mapping field ${ldapField} -> ${userField}`); + switch (userField) { + case 'email': + if (!ldapUser.hasOwnProperty(ldapField)) { + log_debug(`user does not have attribute: ${ ldapField }`); + return; + } + + if (_.isObject(ldapUser[ldapField])) { + _.map(ldapUser[ldapField], function(item) { + emailList.push({ address: item, verified: true }); + }); + } else { + emailList.push({ address: ldapUser[ldapField], verified: true }); + } + break; + + default: + const [outerKey, innerKeys] = userField.split(/\.(.+)/); + + if (!_.find(whitelistedUserFields, (el) => el === outerKey)) { + log_debug(`user attribute not whitelisted: ${ userField }`); + return; + } + + if (outerKey === 'customFields') { + let customFieldsMeta; + + try { + customFieldsMeta = JSON.parse(LDAP.settings_get('Accounts_CustomFields')); + } catch (e) { + log_debug('Invalid JSON for Custom Fields'); + return; + } + + if (!getPropertyValue(customFieldsMeta, innerKeys)) { + log_debug(`user attribute does not exist: ${ userField }`); + return; + } + } + + const tmpUserField = getPropertyValue(user, userField); + const tmpLdapField = templateVarHandler(ldapField, ldapUser); + + if (tmpLdapField && tmpUserField !== tmpLdapField) { + // creates the object structure instead of just assigning 'tmpLdapField' to + // 'userData[userField]' in order to avoid the "cannot use the part (...) + // to traverse the element" (MongoDB) error that can happen. Do not handle + // arrays. + // TODO: Find a better solution. + const dKeys = userField.split('.'); + const lastKey = _.last(dKeys); + _.reduce(dKeys, (obj, currKey) => + (currKey === lastKey) + ? obj[currKey] = tmpLdapField + : obj[currKey] = obj[currKey] || {} + , userData); + log_debug(`user.${ userField } changed to: ${ tmpLdapField }`); + } + } + }); + + if (emailList.length > 0) { + if (JSON.stringify(user.emails) !== JSON.stringify(emailList)) { + userData.emails = emailList; + } + } + } + + const uniqueId = getLdapUserUniqueID(ldapUser); + + if (uniqueId && (!user.services || !user.services.ldap || user.services.ldap.id !== uniqueId.value || user.services.ldap.idAttribute !== uniqueId.attribute)) { + userData['services.ldap.id'] = uniqueId.value; + userData['services.ldap.idAttribute'] = uniqueId.attribute; + } + + if (user.authenticationMethod !== 'ldap') { + userData.ldap = true; + } + + if (_.size(userData)) { + return userData; + } +} + + +export function syncUserData(user, ldapUser) { + log_info('Syncing user data'); + log_debug('user', {'email': user.email, '_id': user._id}); + // log_debug('ldapUser', ldapUser.object); + + if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { + const username = slug(getLdapUsername(ldapUser)); + if (user && user._id && username !== user.username) { + log_info('Syncing user username', user.username, '->', username); + Meteor.users.findOne({ _id: user._id }, { $set: { username }}); + } + } + + if (LDAP.settings_get('LDAP_FULLNAME_FIELD') !== '') { + const fullname= getLdapFullname(ldapUser); + log_debug('fullname=',fullname); + if (user && user._id && fullname !== '') { + log_info('Syncing user fullname:', fullname); + Meteor.users.update({ _id: user._id }, { $set: { 'profile.fullname' : fullname, }}); + } + } + + if (LDAP.settings_get('LDAP_EMAIL_FIELD') !== '') { + const email = getLdapEmail(ldapUser); + log_debug('email=', email); + + if (user && user._id && email !== '') { + log_info('Syncing user email:', email); + Meteor.users.update({ + _id: user._id + }, { + $set: { + 'emails.0.address': email, + } + }); + } + } + +} + +export function addLdapUser(ldapUser, username, password) { + const uniqueId = getLdapUserUniqueID(ldapUser); + + const userObject = { + }; + + if (username) { + userObject.username = username; + } + + const userData = getDataToSyncUserData(ldapUser, {}); + + if (userData && userData.emails && userData.emails[0] && userData.emails[0].address) { + if (Array.isArray(userData.emails[0].address)) { + userObject.email = userData.emails[0].address[0]; + } else { + userObject.email = userData.emails[0].address; + } + } else if (ldapUser.mail && ldapUser.mail.indexOf('@') > -1) { + userObject.email = ldapUser.mail; + } else if (LDAP.settings_get('LDAP_DEFAULT_DOMAIN') !== '') { + userObject.email = `${ username || uniqueId.value }@${ LDAP.settings_get('LDAP_DEFAULT_DOMAIN') }`; + } else { + const error = new Meteor.Error('LDAP-login-error', 'LDAP Authentication succeded, there is no email to create an account. Have you tried setting your Default Domain in LDAP Settings?'); + log_error(error); + throw error; + } + + log_debug('New user data', userObject); + + if (password) { + userObject.password = password; + } + + try { + // This creates the account with password service + userObject.ldap = true; + userObject._id = Accounts.createUser(userObject); + + // Add the services.ldap identifiers + Meteor.users.update({ _id: userObject._id }, { + $set: { + 'services.ldap': { id: uniqueId.value }, + 'emails.0.verified': true, + 'authenticationMethod': 'ldap', + }}); + } catch (error) { + log_error('Error creating user', error); + return error; + } + + syncUserData(userObject, ldapUser); + + return { + userId: userObject._id, + }; +} + +export function importNewUsers(ldap) { + if (LDAP.settings_get('LDAP_ENABLE') !== true) { + log_error('Can\'t run LDAP Import, LDAP is disabled'); + return; + } + + if (!ldap) { + ldap = new LDAP(); + ldap.connectSync(); + } + + let count = 0; + ldap.searchUsersSync('*', Meteor.bindEnvironment((error, ldapUsers, {next, end} = {}) => { + if (error) { + throw error; + } + + ldapUsers.forEach((ldapUser) => { + count++; + + const uniqueId = getLdapUserUniqueID(ldapUser); + // Look to see if user already exists + const userQuery = { + 'services.ldap.id': uniqueId.value, + }; + + log_debug('userQuery', userQuery); + + let username; + if (LDAP.settings_get('LDAP_USERNAME_FIELD') !== '') { + username = slug(getLdapUsername(ldapUser)); + } + + // Add user if it was not added before + let user = Meteor.users.findOne(userQuery); + + if (!user && username && LDAP.settings_get('LDAP_MERGE_EXISTING_USERS') === true) { + const userQuery = { + username, + }; + + log_debug('userQuery merge', userQuery); + + user = Meteor.users.findOne(userQuery); + if (user) { + syncUserData(user, ldapUser); + } + } + + if (!user) { + addLdapUser(ldapUser, username); + } + + if (count % 100 === 0) { + log_info('Import running. Users imported until now:', count); + } + }); + + if (end) { + log_info('Import finished. Users imported:', count); + } + + next(count); + })); +} + +function sync() { + if (LDAP.settings_get('LDAP_ENABLE') !== true) { + return; + } + + const ldap = new LDAP(); + + try { + ldap.connectSync(); + + let users; + if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED') === true) { + users = Meteor.users.find({ 'services.ldap': { $exists: true }}); + } + + if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS') === true) { + importNewUsers(ldap); + } + + if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED') === true) { + users.forEach(function(user) { + let ldapUser; + + if (user.services && user.services.ldap && user.services.ldap.id) { + ldapUser = ldap.getUserByIdSync(user.services.ldap.id, user.services.ldap.idAttribute); + } else { + ldapUser = ldap.getUserByUsernameSync(user.username); + } + + if (ldapUser) { + syncUserData(user, ldapUser); + } else { + log_info('Can\'t sync user', user.username); + } + }); + } + } catch (error) { + log_error(error); + return error; + } + return true; +} + +const jobName = 'LDAP_Sync'; + +const addCronJob = _.debounce(Meteor.bindEnvironment(function addCronJobDebounced() { + let sc=SyncedCron.SyncedCron; //Why ?? something must be wrong in the import + if (LDAP.settings_get('LDAP_BACKGROUND_SYNC') !== true) { + log_info('Disabling LDAP Background Sync'); + if (sc.nextScheduledAtDate(jobName)) { + sc.remove(jobName); + } + return; + } + + log_info('Enabling LDAP Background Sync'); + sc.add({ + name: jobName, + schedule: function(parser) { + if (LDAP.settings_get('LDAP_BACKGROUND_SYNC_INTERVAL')) { + return parser.text(LDAP.settings_get('LDAP_BACKGROUND_SYNC_INTERVAL')); + } + else { + return parser.recur().on(0).minute(); + }}, + job: function() { + sync(); + }, + }); + sc.start(); + +}), 500); + +Meteor.startup(() => { + Meteor.defer(() => { + if(LDAP.settings_get('LDAP_BACKGROUND_SYNC')){addCronJob();} + }); +}); diff --git a/packages/wekan-ldap/server/syncUser.js b/packages/wekan-ldap/server/syncUser.js new file mode 100644 index 000000000..763ea836d --- /dev/null +++ b/packages/wekan-ldap/server/syncUser.js @@ -0,0 +1,29 @@ +import {importNewUsers} from './sync'; +import LDAP from './ldap'; + +Meteor.methods({ + ldap_sync_now() { + const user = Meteor.user(); + if (!user) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'ldap_sync_users' }); + } + + //TODO: This needs to be fixed - security issue -> alanning:meteor-roles + //if (!RocketChat.authz.hasRole(user._id, 'admin')) { + // throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'ldap_sync_users' }); + //} + + if (LDAP.settings_get('LDAP_ENABLE') !== true) { + throw new Meteor.Error('LDAP_disabled'); + } + + this.unblock(); + + importNewUsers(); + + return { + message: 'Sync_in_progress', + params: [], + }; + }, +}); diff --git a/packages/wekan-ldap/server/testConnection.js b/packages/wekan-ldap/server/testConnection.js new file mode 100644 index 000000000..02866ce54 --- /dev/null +++ b/packages/wekan-ldap/server/testConnection.js @@ -0,0 +1,39 @@ +import LDAP from './ldap'; + +Meteor.methods({ + ldap_test_connection() { + const user = Meteor.user(); + if (!user) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'ldap_test_connection' }); + } + + //TODO: This needs to be fixed - security issue -> alanning:meteor-roles + //if (!RocketChat.authz.hasRole(user._id, 'admin')) { + // throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'ldap_test_connection' }); + //} + + if (LDAP.settings_get(LDAP_ENABLE) !== true) { + throw new Meteor.Error('LDAP_disabled'); + } + + let ldap; + try { + ldap = new LDAP(); + ldap.connectSync(); + } catch (error) { + console.log(error); + throw new Meteor.Error(error.message); + } + + try { + ldap.bindIfNecessary(); + } catch (error) { + throw new Meteor.Error(error.name || error.message); + } + + return { + message: 'Connection_success', + params: [], + }; + }, +}); diff --git a/packages/wekan-oidc/.gitignore b/packages/wekan-oidc/.gitignore new file mode 100644 index 000000000..5379d4c38 --- /dev/null +++ b/packages/wekan-oidc/.gitignore @@ -0,0 +1 @@ +.versions diff --git a/packages/wekan-oidc/LICENSE.txt b/packages/wekan-oidc/LICENSE.txt new file mode 100644 index 000000000..c7be32647 --- /dev/null +++ b/packages/wekan-oidc/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (C) 2016 SWITCH + +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. + diff --git a/packages/wekan-oidc/README.md b/packages/wekan-oidc/README.md new file mode 100644 index 000000000..2dddc206d --- /dev/null +++ b/packages/wekan-oidc/README.md @@ -0,0 +1,52 @@ +# salleman:oidc package + +A Meteor implementation of OpenID Connect Login flow + +## Usage and Documentation + +Look at the `salleman:accounts-oidc` package for the documentation about using OpenID Connect with Meteor. + +## Usage with e.g. authentik for updating users via oidc + +To use the following features set: +'export PROPAGATE_OIDC_DATA=true' + +SIMPLE: If user is assigned to 'group in authentik' it will be automatically assigned to corresponding team in wekan if exists + +ADVANCED: Users can be assigned to teams or organisations via oidc on login. Teams and organisations that do not exist in wekan, yet, will be created, when specified. Admin privileges for wekan through a specific group can be set via Oidc. +See example below: + + + 1. Specify scope in authentik for what will be delivered via userinfo["wekanGroups"] + + Possible configuration for *yourScope*: + ' + groupsDict = {"wekanGroups": []} + for group in request.user.ak_groups.all(): + groupDict = {"displayName": group.name} + groupAdmin = {"isAdmin": group.isAdmin} + groupAttributes = group.attributes + tmp_dict= groupDict | groupAttributes | groupAdmin + + groupsDict["wekanGroups"].append(tmp_dict) + return groupsDict + ' + 2. Tell provider to include *yourScope* and set + OAUTH2_REQUEST_PERMISSIONS="openid profile email *yourScope*" + + 3. In your group settings in authentik add attributes: + desc: groupDesc // default group.name + isAdmin: true // default false + website: groupWebsite // default group.name + isActive: true // default false + shortName: groupShortname // default group.name + forceCreate: true // default false + isOrganisation: true // default false + + 4. On next login user will be added to either newly created group/organization or to already existing + + NOTE: orgs & teams won't be updated if they already exist. + + 5. Manages admin rights as well. If user is in Group which has isAdmin: set to true, user will get admin + privileges in Wekan as well. + If no adjustments (e.g. 1-3) are made on oidc provider's side, user will receive his/her admin rights from before. diff --git a/packages/wekan-oidc/loginHandler.js b/packages/wekan-oidc/loginHandler.js new file mode 100644 index 000000000..3063d0bc9 --- /dev/null +++ b/packages/wekan-oidc/loginHandler.js @@ -0,0 +1,179 @@ +// creates Object if not present in collection +// initArr = [displayName, shortName, website, isActive] +// objString = ["Org","Team"] for method mapping +function createObject(initArr, objString) +{ + functionName = objString === "Org" ? 'setCreateOrgFromOidc' : 'setCreateTeamFromOidc'; + creationString = 'setCreate'+ objString + 'FromOidc'; + return Meteor.call(functionName, + initArr[0],//displayName + initArr[1],//desc + initArr[2],//shortName + initArr[3],//website + initArr[4]//xxxisActive + ); +} +function updateObject(initArr, objString) +{ + functionName = objString === "Org" ? 'setOrgAllFieldsFromOidc' : 'setTeamAllFieldsFromOidc'; + return Meteor.call(functionName, + initArr[0],//team || org Object + initArr[1],//displayName + initArr[2],//desc + initArr[3],//shortName + initArr[4],//website + initArr[5]//xxxisActive + ); +} +//checks whether obj is in collection of userObjs +//params +//e.g. userObjs = user.teams +//e.g. obj = Team.findOne... +//e.g. collection = "team" +function contains(userObjs, obj, collection) +{ + id = collection+'Id'; + + if(typeof userObjs == "undefined" || !userObjs.length) + { + return false; + } + for (const [count, hash] of Object.entries(userObjs)) + { + if (hash[id] === obj._id) + { + return true; + } + } + return false; +} +module.exports = { + +// This function adds groups as organizations or teams to users and +// creates them if not already existing +// DEFAULT after creation orgIsActive & teamIsActive: true +// PODC provider needs to send group data within "wekanGroup" scope +// PARAMS to be set for groups within your Oidc provider: +// isAdmin: [true, false] -> admin group becomes admin in wekan +// isOrganization: [true, false] -> creates org and adds to user +// displayName: "string" +addGroupsWithAttributes: function (user, groups){ + teamArray=[]; + orgArray=[]; + isAdmin = []; + teams = user.teams; + orgs = user.orgs; + for (group of groups) + { + initAttributes = [ + group.displayName, + group.desc || group.displayName, + group.shortName ||group.displayName, + group.website || group.displayName, group.isActive || false]; + + isOrg = group.isOrganisation || false; + forceCreate = group.forceCreate|| false; + isAdmin.push(group.isAdmin || false); + if (isOrg) + { + org = Org.findOne({"orgDisplayName": group.displayName}); + if(org) + { + if(contains(orgs, org, "org")) + { + initAttributes.unshift(org); + updateObject(initAttributes, "Org"); + continue; + } + } + else if(forceCreate) + { + createObject(initAttributes, "Org"); + org = Org.findOne({'orgDisplayName': group.displayName}); + } + else + { + continue; + } + orgHash = {'orgId': org._id, 'orgDisplayName': group.displayName}; + orgArray.push(orgHash); + } + + else + { + //start team routine + team = Team.findOne({"teamDisplayName": group.displayName}); + if (team) + { + if(contains(teams, team, "team")) + { + initAttributes.unshift(team); + updateObject(initAttributes, "Team"); + continue; + } + } + else if(forceCreate) + { + createObject(initAttributes, "Team"); + team = Team.findOne({'teamDisplayName': group.displayName}); + } + else + { + continue; + } + teamHash = {'teamId': team._id, 'teamDisplayName': group.displayName}; + teamArray.push(teamHash); + } + } + // user is assigned to team/org which has set isAdmin: true in oidc data + // hence user will get admin privileges in wekan + // E.g. Admin rights will be withdrawn if no group in oidc provider has isAdmin set to true + + users.update({ _id: user._id }, { $set: {isAdmin: isAdmin.some(i => (i === true))}}); + teams = {'teams': {'$each': teamArray}}; + orgs = {'orgs': {'$each': orgArray}}; + users.update({ _id: user._id }, { $push: teams}); + users.update({ _id: user._id }, { $push: orgs}); + // remove temporary oidc data from user collection + users.update({ _id: user._id }, { $unset: {"services.oidc.groups": []}}); + + return; +}, + +changeUsername: function(user, name) +{ + username = {'username': name}; + if (user.username != username) users.update({ _id: user._id }, { $set: username}); +}, +changeFullname: function(user, name) +{ + username = {'profile.fullname': name}; + if (user.username != username) users.update({ _id: user._id }, { $set: username}); +}, +addEmail: function(user, email) +{ + user_email = user.emails || []; + var contained = false; + position = 0; + for (const [count, mail_hash] of Object.entries(user_email)) + { + if (mail_hash['address'] === email) + { + contained = true; + position = count; + break; + } + } + if(contained && position != 0) + { + user_email.splice(position,1); + contained = false; + } + if(!contained) + { + user_email.unshift({'address': email, 'verified': true}); + user_email = {'emails': user_email}; + users.update({ _id: user._id }, { $set: user_email}); + } +} +} diff --git a/packages/wekan-oidc/oidc_client.js b/packages/wekan-oidc/oidc_client.js new file mode 100644 index 000000000..6da9d9f0e --- /dev/null +++ b/packages/wekan-oidc/oidc_client.js @@ -0,0 +1,67 @@ +Oidc = {}; + +// Request OpenID Connect credentials for the user +// @param options {optional} +// @param credentialRequestCompleteCallback {Function} Callback function to call on +// completion. Takes one argument, credentialToken on success, or Error on +// error. +Oidc.requestCredential = function (options, credentialRequestCompleteCallback) { + // support both (options, callback) and (callback). + if (!credentialRequestCompleteCallback && typeof options === 'function') { + credentialRequestCompleteCallback = options; + options = {}; + } + + var config = ServiceConfiguration.configurations.findOne({service: 'oidc'}); + if (!config) { + credentialRequestCompleteCallback && credentialRequestCompleteCallback( + new ServiceConfiguration.ConfigError('Service oidc not configured.')); + return; + } + + var credentialToken = Random.secret(); + var loginStyle = OAuth._loginStyle('oidc', config, options); + + // options + options = options || {}; + options.client_id = config.clientId; + options.response_type = options.response_type || 'code'; + options.redirect_uri = OAuth._redirectUri('oidc', config); + options.state = OAuth._stateParam(loginStyle, credentialToken, options.redirectUrl); + options.scope = config.requestPermissions || 'openid profile email'; + + if (config.loginStyle && config.loginStyle == 'popup') { + options.display = 'popup'; + } + + var loginUrl = config.serverUrl + config.authorizationEndpoint; + // check if the loginUrl already contains a "?" + var first = loginUrl.indexOf('?') === -1; + for (var k in options) { + if (first) { + loginUrl += '?'; + first = false; + } + else { + loginUrl += '&' + } + loginUrl += encodeURIComponent(k) + '=' + encodeURIComponent(options[k]); + } + + //console.log('XXX: loginURL: ' + loginUrl) + + options.popupOptions = options.popupOptions || {}; + var popupOptions = { + width: options.popupOptions.width || 320, + height: options.popupOptions.height || 450 + }; + + OAuth.launchLogin({ + loginService: 'oidc', + loginStyle: loginStyle, + loginUrl: loginUrl, + credentialRequestCompleteCallback: credentialRequestCompleteCallback, + credentialToken: credentialToken, + popupOptions: popupOptions, + }); +}; diff --git a/packages/wekan-oidc/oidc_configure.html b/packages/wekan-oidc/oidc_configure.html new file mode 100644 index 000000000..49282fc18 --- /dev/null +++ b/packages/wekan-oidc/oidc_configure.html @@ -0,0 +1,6 @@ + diff --git a/packages/wekan-oidc/oidc_configure.js b/packages/wekan-oidc/oidc_configure.js new file mode 100644 index 000000000..5eedaa041 --- /dev/null +++ b/packages/wekan-oidc/oidc_configure.js @@ -0,0 +1,17 @@ +Template.configureLoginServiceDialogForOidc.helpers({ + siteUrl: function () { + return Meteor.absoluteUrl(); + } +}); + +Template.configureLoginServiceDialogForOidc.fields = function () { + return [ + { property: 'clientId', label: 'Client ID'}, + { property: 'secret', label: 'Client Secret'}, + { property: 'serverUrl', label: 'OIDC Server URL'}, + { property: 'authorizationEndpoint', label: 'Authorization Endpoint'}, + { property: 'tokenEndpoint', label: 'Token Endpoint'}, + { property: 'userinfoEndpoint', label: 'Userinfo Endpoint'}, + { property: 'idTokenWhitelistFields', label: 'Id Token Fields'} + ]; +}; diff --git a/packages/wekan-oidc/oidc_server.js b/packages/wekan-oidc/oidc_server.js new file mode 100644 index 000000000..0ce17dc3d --- /dev/null +++ b/packages/wekan-oidc/oidc_server.js @@ -0,0 +1,306 @@ +import {addGroupsWithAttributes, addEmail, changeFullname, changeUsername} from './loginHandler'; + +Oidc = {}; +httpCa = false; + +if (process.env.OAUTH2_CA_CERT !== undefined) { + try { + const fs = Npm.require('fs'); + if (fs.existsSync(process.env.OAUTH2_CA_CERT)) { + httpCa = fs.readFileSync(process.env.OAUTH2_CA_CERT); + } + } catch(e) { + console.log('WARNING: failed loading: ' + process.env.OAUTH2_CA_CERT); + console.log(e); + } +} +var profile = {}; +var serviceData = {}; +var userinfo = {}; + +OAuth.registerService('oidc', 2, null, function (query) { + + var debug = process.env.DEBUG || false; + + var token = getToken(query); + if (debug) console.log('XXX: register token:', token); + + var accessToken = token.access_token || token.id_token; + var expiresAt = (+new Date) + (1000 * parseInt(token.expires_in, 10)); + + var claimsInAccessToken = (process.env.OAUTH2_ADFS_ENABLED === 'true' || process.env.OAUTH2_ADFS_ENABLED === true) || false; + + if(claimsInAccessToken) + { + // hack when using custom claims in the accessToken. On premise ADFS + userinfo = getTokenContent(accessToken); + } + else + { + // normal behaviour, getting the claims from UserInfo endpoint. + userinfo = getUserInfo(accessToken); + } + + if (userinfo.ocs) userinfo = userinfo.ocs.data; // Nextcloud hack + if (userinfo.metadata) userinfo = userinfo.metadata // Openshift hack + if (debug) console.log('XXX: userinfo:', userinfo); + + serviceData.id = userinfo[process.env.OAUTH2_ID_MAP]; // || userinfo["id"]; + serviceData.username = userinfo[process.env.OAUTH2_USERNAME_MAP]; // || userinfo["uid"]; + serviceData.fullname = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"]; + serviceData.accessToken = accessToken; + serviceData.expiresAt = expiresAt; + + + // If on Oracle OIM email is empty or null, get info from username + if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED === true) { + if (userinfo[process.env.OAUTH2_EMAIL_MAP]) { + serviceData.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; + } else { + serviceData.email = userinfo[process.env.OAUTH2_USERNAME_MAP]; + } + } + + if (process.env.ORACLE_OIM_ENABLED !== 'true' && process.env.ORACLE_OIM_ENABLED !== true) { + serviceData.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; // || userinfo["email"]; + } + + if (accessToken) { + var tokenContent = getTokenContent(accessToken); + var fields = _.pick(tokenContent, getConfiguration().idTokenWhitelistFields); + _.extend(serviceData, fields); + } + + if (token.refresh_token) + serviceData.refreshToken = token.refresh_token; + if (debug) console.log('XXX: serviceData:', serviceData); + + profile.name = userinfo[process.env.OAUTH2_FULLNAME_MAP]; // || userinfo["displayName"]; + profile.email = userinfo[process.env.OAUTH2_EMAIL_MAP]; // || userinfo["email"]; + if (debug) console.log('XXX: profile:', profile); + + + //temporarily store data from oidc in user.services.oidc.groups to update groups + serviceData.groups = (userinfo["groups"] && userinfo["wekanGroups"]) ? userinfo["wekanGroups"] : userinfo["groups"]; + + // groups arriving as array of strings indicate there is no scope set in oidc privider + // to assign teams and keep admin privileges + // data needs to be treated differently. + // use case: in oidc provider no scope is set, hence no group attributes. + // therefore: keep admin privileges for wekan as before + if(Array.isArray(serviceData.groups) && serviceData.groups.length && typeof serviceData.groups[0] === "string" ) + { + user = Meteor.users.findOne({'_id': serviceData.id}); + + serviceData.groups.forEach(function(groupName, i) + { + if(user?.isAdmin && i == 0) + { + // keep information of user.isAdmin since in loginHandler the user will // be updated regarding group admin privileges provided via oidc + serviceData.groups[i] = {"isAdmin": true}; + serviceData.groups[i]["displayName"]= groupName; + } + else + { + serviceData.groups[i] = {"displayName": groupName}; + } + }); + } + return { + serviceData: serviceData, + options: { profile: profile } + }; +}); + +var userAgent = "Meteor"; +if (Meteor.release) { + userAgent += "/" + Meteor.release; +} + +if (process.env.ORACLE_OIM_ENABLED !== 'true' && process.env.ORACLE_OIM_ENABLED !== true) { + var getToken = function (query) { + var debug = process.env.DEBUG || false; + var config = getConfiguration(); + if(config.tokenEndpoint.includes('https://')){ + var serverTokenEndpoint = config.tokenEndpoint; + }else{ + var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint; + } + var requestPermissions = config.requestPermissions; + var response; + + try { + var postOptions = { + headers: { + Accept: 'application/json', + "User-Agent": userAgent + }, + params: { + code: query.code, + client_id: config.clientId, + client_secret: OAuth.openSecret(config.secret), + redirect_uri: OAuth._redirectUri('oidc', config), + grant_type: 'authorization_code', + state: query.state + } + }; + if (httpCa) { + postOptions['npmRequestOptions'] = { ca: httpCa }; + } + response = HTTP.post(serverTokenEndpoint, postOptions); + } catch (err) { + throw _.extend(new Error("Failed to get token from OIDC " + serverTokenEndpoint + ": " + err.message), + { response: err.response }); + } + if (response.data.error) { + // if the http response was a json object with an error attribute + throw new Error("Failed to complete handshake with OIDC " + serverTokenEndpoint + ": " + response.data.error); + } else { + if (debug) console.log('XXX: getToken response: ', response.data); + return response.data; + } + }; +} + +if (process.env.ORACLE_OIM_ENABLED === 'true' || process.env.ORACLE_OIM_ENABLED === true) { + + var getToken = function (query) { + var debug = (process.env.DEBUG === 'true' || process.env.DEBUG === true) || false; + var config = getConfiguration(); + if(config.tokenEndpoint.includes('https://')){ + var serverTokenEndpoint = config.tokenEndpoint; + }else{ + var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint; + } + var requestPermissions = config.requestPermissions; + var response; + + // OIM needs basic Authentication token in the header - ClientID + SECRET in base64 + var dataToken=null; + var strBasicToken=null; + var strBasicToken64=null; + + dataToken = process.env.OAUTH2_CLIENT_ID + ':' + process.env.OAUTH2_SECRET; + strBasicToken = new Buffer(dataToken); + strBasicToken64 = strBasicToken.toString('base64'); + + // eslint-disable-next-line no-console + if (debug) console.log('Basic Token: ', strBasicToken64); + + try { + var postOptions = { + headers: { + Accept: 'application/json', + "User-Agent": userAgent, + "Authorization": "Basic " + strBasicToken64 + }, + params: { + code: query.code, + client_id: config.clientId, + client_secret: OAuth.openSecret(config.secret), + redirect_uri: OAuth._redirectUri('oidc', config), + grant_type: 'authorization_code', + state: query.state + } + }; + if (httpCa) { + postOptions['npmRequestOptions'] = { ca: httpCa }; + } + response = HTTP.post(serverTokenEndpoint, postOptions); + } catch (err) { + throw _.extend(new Error("Failed to get token from OIDC " + serverTokenEndpoint + ": " + err.message), + { response: err.response }); + } + if (response.data.error) { + // if the http response was a json object with an error attribute + throw new Error("Failed to complete handshake with OIDC " + serverTokenEndpoint + ": " + response.data.error); + } else { + // eslint-disable-next-line no-console + if (debug) console.log('XXX: getToken response: ', response.data); + return response.data; + } + }; +} + + +var getUserInfo = function (accessToken) { + var debug = process.env.DEBUG || false; + var config = getConfiguration(); + // Some userinfo endpoints use a different base URL than the authorization or token endpoints. + // This logic allows the end user to override the setting by providing the full URL to userinfo in their config. + if (config.userinfoEndpoint.includes("https://")) { + var serverUserinfoEndpoint = config.userinfoEndpoint; + } else { + var serverUserinfoEndpoint = config.serverUrl + config.userinfoEndpoint; + } + var response; + try { + var getOptions = { + headers: { + "User-Agent": userAgent, + "Authorization": "Bearer " + accessToken + } + }; + if (httpCa) { + getOptions['npmRequestOptions'] = { ca: httpCa }; + } + response = HTTP.get(serverUserinfoEndpoint, getOptions); + } catch (err) { + throw _.extend(new Error("Failed to fetch userinfo from OIDC " + serverUserinfoEndpoint + ": " + err.message), + {response: err.response}); + } + if (debug) console.log('XXX: getUserInfo response: ', response.data); + return response.data; +}; + +var getConfiguration = function () { + var config = ServiceConfiguration.configurations.findOne({ service: 'oidc' }); + if (!config) { + throw new ServiceConfiguration.ConfigError('Service oidc not configured.'); + } + return config; +}; + +var getTokenContent = function (token) { + var content = null; + if (token) { + try { + var parts = token.split('.'); + var header = JSON.parse(Buffer.from(parts[0], 'base64').toString()); + content = JSON.parse(Buffer.from(parts[1], 'base64').toString()); + var signature = Buffer.from(parts[2], 'base64'); + var signed = parts[0] + '.' + parts[1]; + } catch (err) { + this.content = { + exp: 0 + }; + } + } + return content; +} +Meteor.methods({ + 'groupRoutineOnLogin': function(info, userId) + { + check(info, Object); + check(userId, String); + var propagateOidcData = process.env.PROPAGATE_OIDC_DATA || false; + if (propagateOidcData) + { + + users= Meteor.users; + user = users.findOne({'_id': userId}); + if(user) + { + //updates/creates Groups and user admin privileges accordingly + addGroupsWithAttributes(user, info.groups); + if(info.email) addEmail(user, info.email); + if(info.fullname) changeFullname(user, info.fullname); + if(info.username) changeUsername(user, info.username); + } + } + } +}); + +Oidc.retrieveCredential = function (credentialToken, credentialSecret) { + return OAuth.retrieveCredential(credentialToken, credentialSecret); +}; diff --git a/packages/wekan-oidc/package.js b/packages/wekan-oidc/package.js new file mode 100644 index 000000000..fee31e566 --- /dev/null +++ b/packages/wekan-oidc/package.js @@ -0,0 +1,24 @@ +Package.describe({ + summary: "OpenID Connect (OIDC) flow for Meteor", + version: "1.0.12", + name: "wekan-oidc", + git: "https://github.com/wekan/wekan-oidc.git", +}); + +Package.onUse(function(api) { + api.use('oauth2', ['client', 'server']); + api.use('oauth', ['client', 'server']); + api.use('http', ['server']); + api.use('underscore', 'client'); + api.use('ecmascript'); + api.use('templating', 'client'); + api.use('random', 'client'); + api.use('service-configuration', ['client', 'server']); + + api.export('Oidc'); + + api.addFiles(['oidc_configure.html', 'oidc_configure.js'], 'client'); + + api.addFiles('oidc_server.js', 'server'); + api.addFiles('oidc_client.js', 'client'); +}); From 907013228d00f1190933bf7fc402957b1a973131 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 16 May 2022 21:22:16 +0300 Subject: [PATCH 127/246] Updated to Node.js v14.19.2. Thanks to Node.js developers. --- .devcontainer/Dockerfile | 2 +- .future-snap/broken-snapcraft.yaml | 2 +- .travis.yml | 2 +- Dockerfile | 2 +- Dockerfile.arm64v8 | 4 ++-- rebuild-wekan.bat | 4 ++-- rebuild-wekan.sh | 2 +- snapcraft.yaml | 2 +- stacksmith/user-scripts/build.sh | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index cd8f1f6c5..0491b039e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -10,7 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive ENV \ DEBUG=false \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/.future-snap/broken-snapcraft.yaml b/.future-snap/broken-snapcraft.yaml index b8ea68778..9df91c51c 100644 --- a/.future-snap/broken-snapcraft.yaml +++ b/.future-snap/broken-snapcraft.yaml @@ -81,7 +81,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.1 + node-engine: 14.19.2 node-packages: - node-gyp - node-pre-gyp diff --git a/.travis.yml b/.travis.yml index d689fd195..f9d6758d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: required env: TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0 - TRAVIS_NODE_VERSION: 14.19.1 + TRAVIS_NODE_VERSION: 14.19.2 TRAVIS_NPM_VERSION: latest before_install: diff --git a/Dockerfile b/Dockerfile index 7506deab6..d3a76b8ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ ARG DEBIAN_FRONTEND=noninteractive ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/Dockerfile.arm64v8 b/Dockerfile.arm64v8 index 3b3fb2cd9..40424f5cc 100644 --- a/Dockerfile.arm64v8 +++ b/Dockerfile.arm64v8 @@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder ENV QEMU_VERSION=v4.2.0-6 \ QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ WEKAN_VERSION=latest \ WEKAN_ARCHITECTURE=arm64 \ NODE_OPTIONS="--max_old_space_size=4096" @@ -49,7 +49,7 @@ LABEL maintainer="wekan" # Set the environment variables (defaults where required) ENV QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.1 \ + NODE_VERSION=v14.19.2 \ NODE_ENV=production \ NPM_VERSION=latest \ WITH_API=true \ diff --git a/rebuild-wekan.bat b/rebuild-wekan.bat index 21f8eb2bb..32058587d 100644 --- a/rebuild-wekan.bat +++ b/rebuild-wekan.bat @@ -15,8 +15,8 @@ REM Install chocolatey choco install -y git curl python2 dotnet4.5.2 nano mongodb-4 mongoclient -curl -O https://nodejs.org/dist/v14.19.1/node-v14.19.1-x64.msi -call node-v14.19.1-x64.msi +curl -O https://nodejs.org/dist/v14.19.2/node-v14.19.2-x64.msi +call node-v14.19.2-x64.msi call npm config -g set msvs_version 2015 call meteor npm config -g set msvs_version 2015 diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index e3b6fb5c2..ac143e65e 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -39,7 +39,7 @@ do #curl -0 -L https://npmjs.org/install.sh | sudo sh #sudo chown -R $(id -u):$(id -g) $HOME/.npm sudo npm -g install n - sudo n 14.19.1 + sudo n 14.19.2 #sudo npm -g install npm ## Latest npm with Meteor 2.2 sudo npm -g install node-gyp diff --git a/snapcraft.yaml b/snapcraft.yaml index d3e9e7323..8c6b92850 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -80,7 +80,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.1 + node-engine: 14.19.2 node-packages: - node-gyp - node-pre-gyp diff --git a/stacksmith/user-scripts/build.sh b/stacksmith/user-scripts/build.sh index 396b5e9ad..b7eafbe59 100755 --- a/stacksmith/user-scripts/build.sh +++ b/stacksmith/user-scripts/build.sh @@ -2,7 +2,7 @@ set -euxo pipefail BUILD_DEPS="bsdtar gnupg wget curl bzip2 python git ca-certificates perl-Digest-SHA" -NODE_VERSION=v14.19.1 +NODE_VERSION=v14.19.2 #METEOR_RELEASE=1.6.0.1 - for Stacksmith, meteor-1.8 branch that could have METEOR@1.8.1-beta.8 or newer USE_EDGE=false METEOR_EDGE=1.5-beta.17 From 01a1a2cdce5c131b54c972abc31c61566f88e5aa Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 16 May 2022 23:40:10 +0300 Subject: [PATCH 128/246] Updated ChangeLog. --- CHANGELOG.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e7b8dd0a..b6f25c0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,63 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release adds the following updates: + +- [Merged branch upgrade-meteor 2.7.2 to master](https://github.com/wekan/wekan/commit/7e43a6f4fb6ac3346729d3bb091e2019591fb323). + Thanks to xet7. +- [Upgrade to Meteor 2.7.2](https://github.com/wekan/wekan/commit/963a4711dbad325a1618abf2f76541d94570ca89). + Thanks to Meteor developers. +- [When developing with Meteor on macOS, get current IP address](https://github.com/wekan/wekan/commit/a73a4c1e5b1971ff32643fb39a37e285a240a77a). + Thanks to xet7. +- [Updated meteor-upgrade branch to Node.js v14.19.2](https://github.com/wekan/wekan/commit/907013228d00f1190933bf7fc402957b1a973131). + Thanks to Node.js developers. +- [Added back to meteor-upgrade branch packages WeKan lockout, ldap, oidc, cas](https://github.com/wekan/wekan/commit/00768b4392109dec62a4dcf44dbceb295990d785). + Thanks to xet7. +- [Added fixes to meteor-upgrade branch Sandstorm accounts](https://github.com/wekan/wekan/pulls/4500). + Thanks to mfilser. +- [Added backup to meteor-upgrade branch Sandstorm Accounts](https://github.com/wekan/wekan/commit/f260b7ba889c39a2db4a5f3057439a9b78dd7cf1). + Thanks to xet7. +- [Improvements to future WeKan Snap core20. Does not work yet. In Progress](https://github.com/wekan/wekan/commit/38d26fa7e32c705a0cad34c199e1190c5226b968). + Thanks to xet7. +- [Updated MongoDB 5 rawCollection deprecated update to updateMany (or updateOne)](https://github.com/wekan/wekan/commit/a196a5ed63cba2b812b9e825172f3a97d9756daa). + Thanks to xet7. +- [Added --trace-warnings to start-wekan.sh](https://github.com/wekan/wekan/commit/50ce0ce442d804bf1d9eacacba3b493761ca6773). + Thanks to xet7. +- [Meteor-upgrade: Fix language auto-detection](https://github.com/wekan/wekan/commit/8f43b74bbca78fa03162985fc7b2192782549c1f). + Thanks to imajus. +- [Meteor-upgrade: Fix broken useraccounts UI i18n](https://github.com/wekan/wekan/commit/566527dfad9b11d730c84f7b62bac9c4d60518bd). + Thanks to imajus. +- [Meteor-upgrade: Rename isoCode to tag (cause they are IETF tags actually)](https://github.com/wekan/wekan/commit/c858e0b7965847587c5e16b775c4cd44cbefbee0). + Thanks to imajus. +- [Meteor-upgrade: Add missing language names](https://github.com/wekan/wekan/commit/f40b0d495db12824e46a60d9676e94464cc9897a). + Thanks to imajus. +- [Added 30 new languages, now about 105 total](https://github.com/wekan/wekan/commit/28317c7cf3fea7f1c7cf0860ccebb7322000d132). + Thanks to translators and xet7. + +and fixes the following bugs: + +- [Fix Copy Board](https://github.com/wekan/wekan/pulls/4496). + Thanks to mfilser. +- [Fix FileStoreStrategy, moveToStorage, wrong variable in error handling](https://github.com/wekan/wekan/commit/58d760a615834f989633efcd5e1577265219af19). + Thanks to mfilser. +- [Multi-File Storage code was missing after merge](https://github.com/wekan/wekan/commit/3fad014e919be29fc85af754f89b708888d8a98e). + Thanks to mfilser. +- Card Details dates in user language format. + [Part 1](https://github.com/wekan/wekan/commit/d1714abc6a13783600c68526c259967886dbe80d), + [Part 2](https://github.com/wekan/wekan/commit/2e5ec0308f2ac8059af6219693177e294197776a), + [Part 3](https://github.com/wekan/wekan/commit/441b3e9c0a50b21da2c875946ff1059a14ce04e4). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v6.22 2022-05-09 WeKan ® release + +- [Updated to Node.js v14.19.2](https://github.com/wekan/wekan/commit/bfef7844ba15a28bce63a577ed499ed899aaff79). + Thanks to Node.js developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.21 2022-04-28 WeKan ® release This release fixes the following bugs: From 072778b9aaefd7fcaa7519b1ce1cafc1704d646d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 12:36:10 +0300 Subject: [PATCH 129/246] Converted Stylus to CSS. Removed Stylus. This change removed many error messages. Thanks to xet7 ! --- .meteor/packages | 1 - .meteor/versions | 1 - client/components/activities/activities.css | 101 + client/components/activities/activities.styl | 105 - client/components/activities/comments.css | 65 + client/components/activities/comments.styl | 67 - client/components/boards/boardBody.css | 169 ++ client/components/boards/boardBody.styl | 133 - client/components/boards/boardColors.css | 2176 +++++++++++++++++ client/components/boards/boardColors.styl | 1232 ---------- client/components/boards/boardHeader.css | 23 + client/components/boards/boardHeader.styl | 22 - client/components/boards/boardsList.css | 280 +++ client/components/boards/boardsList.styl | 276 --- client/components/cards/attachments.css | 81 + client/components/cards/attachments.styl | 83 - client/components/cards/cardDate.css | 67 + client/components/cards/cardDate.styl | 63 - client/components/cards/cardDescription.css | 56 + client/components/cards/cardDescription.styl | 59 - client/components/cards/cardDetails.css | 588 +++++ client/components/cards/cardDetails.styl | 564 ----- client/components/cards/cardTime.css | 18 + client/components/cards/cardTime.styl | 17 - client/components/cards/checklists.css | 173 ++ client/components/cards/checklists.styl | 168 -- client/components/cards/labels.css | 230 ++ client/components/cards/labels.styl | 231 -- client/components/cards/minicard.css | 550 +++++ client/components/cards/minicard.styl | 335 --- client/components/cards/resultCard.css | 25 + client/components/cards/resultCard.styl | 24 - client/components/cards/subtasks.css | 152 ++ client/components/cards/subtasks.styl | 146 -- client/components/forms/datepicker.css | 22 + client/components/forms/datepicker.styl | 17 - client/components/forms/forms.css | 736 ++++++ client/components/forms/forms.styl | 695 ------ client/components/import/import.css | 51 + client/components/import/import.styl | 53 - client/components/lists/list.css | 345 +++ client/components/lists/list.styl | 341 --- client/components/main/brokenCards.css | 28 + client/components/main/brokenCards.styl | 31 - client/components/main/dueCards.css | 5 + client/components/main/dueCards.styl | 4 - client/components/main/editor.css | 7 + client/components/main/editor.styl | 7 - client/components/main/fonts.css | 30 + client/components/main/fonts.styl | 41 - client/components/main/globalSearch.css | 117 + client/components/main/globalSearch.styl | 121 - client/components/main/header.css | 266 ++ client/components/main/header.styl | 258 -- client/components/main/keyboardShortcuts.css | 20 + client/components/main/keyboardShortcuts.styl | 20 - client/components/main/layouts.css | 624 +++++ client/components/main/layouts.styl | 552 ----- client/components/main/myCards.css | 73 + client/components/main/myCards.styl | 77 - client/components/main/popup.css | 346 +++ client/components/main/popup.styl | 324 --- client/components/main/spinner_bounce.css | 70 + client/components/main/spinner_bounce.styl | 44 - client/components/main/spinner_cube.css | 123 + client/components/main/spinner_cube.styl | 52 - ...r_cube_grid.styl => spinner_cube_grid.css} | 79 +- client/components/main/spinner_dot.css | 104 + client/components/main/spinner_dot.styl | 51 - .../components/main/spinner_double_bounce.css | 71 + .../main/spinner_double_bounce.styl | 44 - .../components/main/spinner_rotateplane.css | 81 + .../components/main/spinner_rotateplane.styl | 38 - client/components/main/spinner_scaleout.css | 68 + client/components/main/spinner_scaleout.styl | 40 - client/components/main/spinner_wave.css | 58 + client/components/main/spinner_wave.styl | 29 - .../components/notifications/notification.css | 67 + .../notifications/notification.styl | 72 - .../notifications/notifications.css | 17 + .../notifications/notifications.styl | 17 - .../notifications/notificationsDrawer.css | 67 + .../notifications/notificationsDrawer.styl | 69 - client/components/rules/rules.css | 217 ++ client/components/rules/rules.styl | 192 -- client/components/settings/attachments.css | 8 + client/components/settings/attachments.styl | 8 - client/components/settings/peopleBody.css | 91 + client/components/settings/peopleBody.styl | 83 - client/components/settings/settingBody.css | 128 + client/components/settings/settingBody.styl | 121 - client/components/settings/settingHeader.css | 27 + client/components/settings/settingHeader.styl | 25 - client/components/sidebar/sidebar.css | 252 ++ client/components/sidebar/sidebar.styl | 247 -- client/components/sidebar/sidebarSearches.css | 3 + .../components/sidebar/sidebarSearches.styl | 2 - client/components/swimlanes/swimlanes.css | 220 ++ client/components/swimlanes/swimlanes.styl | 205 -- client/components/users/userAvatar.css | 116 + client/components/users/userAvatar.styl | 118 - client/components/users/userForm.css | 94 + client/components/users/userForm.styl | 95 - releases/stylus-to-css.sh | 7 + 104 files changed, 9370 insertions(+), 7642 deletions(-) create mode 100644 client/components/activities/activities.css delete mode 100644 client/components/activities/activities.styl create mode 100644 client/components/activities/comments.css delete mode 100644 client/components/activities/comments.styl create mode 100644 client/components/boards/boardBody.css delete mode 100644 client/components/boards/boardBody.styl create mode 100644 client/components/boards/boardColors.css delete mode 100644 client/components/boards/boardColors.styl create mode 100644 client/components/boards/boardHeader.css delete mode 100644 client/components/boards/boardHeader.styl create mode 100644 client/components/boards/boardsList.css delete mode 100644 client/components/boards/boardsList.styl create mode 100644 client/components/cards/attachments.css delete mode 100644 client/components/cards/attachments.styl create mode 100644 client/components/cards/cardDate.css delete mode 100644 client/components/cards/cardDate.styl create mode 100644 client/components/cards/cardDescription.css delete mode 100644 client/components/cards/cardDescription.styl create mode 100644 client/components/cards/cardDetails.css delete mode 100644 client/components/cards/cardDetails.styl create mode 100644 client/components/cards/cardTime.css delete mode 100644 client/components/cards/cardTime.styl create mode 100644 client/components/cards/checklists.css delete mode 100644 client/components/cards/checklists.styl create mode 100644 client/components/cards/labels.css delete mode 100644 client/components/cards/labels.styl create mode 100644 client/components/cards/minicard.css delete mode 100644 client/components/cards/minicard.styl create mode 100644 client/components/cards/resultCard.css delete mode 100644 client/components/cards/resultCard.styl create mode 100644 client/components/cards/subtasks.css delete mode 100644 client/components/cards/subtasks.styl create mode 100644 client/components/forms/datepicker.css delete mode 100644 client/components/forms/datepicker.styl create mode 100644 client/components/forms/forms.css delete mode 100644 client/components/forms/forms.styl create mode 100644 client/components/import/import.css delete mode 100644 client/components/import/import.styl create mode 100644 client/components/lists/list.css delete mode 100644 client/components/lists/list.styl create mode 100644 client/components/main/brokenCards.css delete mode 100644 client/components/main/brokenCards.styl create mode 100644 client/components/main/dueCards.css delete mode 100644 client/components/main/dueCards.styl create mode 100644 client/components/main/editor.css delete mode 100644 client/components/main/editor.styl create mode 100644 client/components/main/fonts.css delete mode 100644 client/components/main/fonts.styl create mode 100644 client/components/main/globalSearch.css delete mode 100644 client/components/main/globalSearch.styl create mode 100644 client/components/main/header.css delete mode 100644 client/components/main/header.styl create mode 100644 client/components/main/keyboardShortcuts.css delete mode 100644 client/components/main/keyboardShortcuts.styl create mode 100644 client/components/main/layouts.css delete mode 100644 client/components/main/layouts.styl create mode 100644 client/components/main/myCards.css delete mode 100644 client/components/main/myCards.styl create mode 100644 client/components/main/popup.css delete mode 100644 client/components/main/popup.styl create mode 100644 client/components/main/spinner_bounce.css delete mode 100644 client/components/main/spinner_bounce.styl create mode 100644 client/components/main/spinner_cube.css delete mode 100644 client/components/main/spinner_cube.styl rename client/components/main/{spinner_cube_grid.styl => spinner_cube_grid.css} (51%) create mode 100644 client/components/main/spinner_dot.css delete mode 100644 client/components/main/spinner_dot.styl create mode 100644 client/components/main/spinner_double_bounce.css delete mode 100644 client/components/main/spinner_double_bounce.styl create mode 100644 client/components/main/spinner_rotateplane.css delete mode 100644 client/components/main/spinner_rotateplane.styl create mode 100644 client/components/main/spinner_scaleout.css delete mode 100644 client/components/main/spinner_scaleout.styl create mode 100644 client/components/main/spinner_wave.css delete mode 100644 client/components/main/spinner_wave.styl create mode 100644 client/components/notifications/notification.css delete mode 100644 client/components/notifications/notification.styl create mode 100644 client/components/notifications/notifications.css delete mode 100644 client/components/notifications/notifications.styl create mode 100644 client/components/notifications/notificationsDrawer.css delete mode 100644 client/components/notifications/notificationsDrawer.styl create mode 100644 client/components/rules/rules.css delete mode 100644 client/components/rules/rules.styl create mode 100644 client/components/settings/attachments.css delete mode 100644 client/components/settings/attachments.styl create mode 100644 client/components/settings/peopleBody.css delete mode 100644 client/components/settings/peopleBody.styl create mode 100644 client/components/settings/settingBody.css delete mode 100644 client/components/settings/settingBody.styl create mode 100644 client/components/settings/settingHeader.css delete mode 100644 client/components/settings/settingHeader.styl create mode 100644 client/components/sidebar/sidebar.css delete mode 100644 client/components/sidebar/sidebar.styl create mode 100644 client/components/sidebar/sidebarSearches.css delete mode 100644 client/components/sidebar/sidebarSearches.styl create mode 100644 client/components/swimlanes/swimlanes.css delete mode 100644 client/components/swimlanes/swimlanes.styl create mode 100644 client/components/users/userAvatar.css delete mode 100644 client/components/users/userAvatar.styl create mode 100644 client/components/users/userForm.css delete mode 100644 client/components/users/userForm.styl create mode 100755 releases/stylus-to-css.sh diff --git a/.meteor/packages b/.meteor/packages index 624cc9e16..5d362279a 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -68,7 +68,6 @@ cfs:gridfs rzymek:fullcalendar msavin:usercache # Keep stylus in 1.1.0, because building v2 takes extra 52 minutes. -coagmano:stylus@1.1.0! meteorhacks:subs-manager meteorhacks:aggregate@1.3.0 wekan-markdown diff --git a/.meteor/versions b/.meteor/versions index ad5bead11..5d9edd520 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -39,7 +39,6 @@ cfs:tempstore@0.1.6 cfs:upload-http@0.0.20 cfs:worker@0.1.5 check@1.3.1 -coagmano:stylus@1.1.0 coffeescript@2.4.1 coffeescript-compiler@2.4.1 communitypackages:picker@1.1.0 diff --git a/client/components/activities/activities.css b/client/components/activities/activities.css new file mode 100644 index 000000000..4d630d098 --- /dev/null +++ b/client/components/activities/activities.css @@ -0,0 +1,101 @@ +.activity-title { + margin: 0 0.5em 0.8em; + display: flex; + justify-content: space-between; +} +.reactions-popup .add-comment-reaction { + display: inline-block; + cursor: pointer; + border-radius: 5px; + font-size: 22px; + text-align: center; + line-height: 30px; + width: 40px; +} +.reactions-popup .add-comment-reaction:hover { + background-color: #b0c4de; +} +.activities { + clear: both; +} +.activities .activity { + margin: 0.5px 0; + padding: 6px 0; + display: flex; +} +.activities .activity .member { + width: 32px; + height: 32px; +} +.activities .activity .activity-member { + font-weight: 700; +} +.activities .activity .activity-desc { + word-wrap: break-word; + overflow: hidden; + flex: 1; + align-self: center; + margin: 0; + margin-left: 3px; + overflow: hidden; + word-break: break-word; +} +.activities .activity .activity-desc .activity-comment { + display: block; + border-radius: 3px; + background: #fff; + text-decoration: none; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + margin-top: 5px; + padding: 5px; +} +.activities .activity .activity-desc .reactions { + display: flex; + margin-top: 5px; + gap: 5px; +} +.activities .activity .activity-desc .reactions .open-comment-reaction-popup { + display: flex; + align-items: center; + text-decoration: none; + height: 24px; +} +.activities .activity .activity-desc .reactions .open-comment-reaction-popup i.fa.fa-smile-o { + font-size: 17px; + font-weight: 500; + margin-left: 2px; +} +.activities .activity .activity-desc .reactions .open-comment-reaction-popup i.fa.fa-plus { + font-size: 8px; + margin-top: -7px; + margin-left: 1px; +} +.activities .activity .activity-desc .reactions .reaction { + cursor: pointer; + border: 1px solid #808080; + border-radius: 15px; + display: flex; + padding: 2px 5px; +} +.activities .activity .activity-desc .reactions .reaction.selected { + background-color: #b0c4de; +} +.activities .activity .activity-desc .reactions .reaction:hover { + background-color: #b0c4de; +} +.activities .activity .activity-desc .reactions .reaction .reaction-count { + font-size: 12px; +} +.activities .activity .activity-desc .activity-checklist { + display: block; + border-radius: 3px; + background: #fff; + text-decoration: none; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + margin-top: 5px; + padding: 5px; +} +.activities .activity .activity-desc .activity-meta { + font-size: 0.8em; + color: #999; +} diff --git a/client/components/activities/activities.styl b/client/components/activities/activities.styl deleted file mode 100644 index 48b5f8024..000000000 --- a/client/components/activities/activities.styl +++ /dev/null @@ -1,105 +0,0 @@ -@import 'nib' - -.activity-title - margin: 0 0.5em 0.8em - display: flex - justify-content:space-between - -.reactions-popup - .add-comment-reaction - display: inline-block - cursor: pointer - border-radius: 5px - font-size: 22px - text-align: center - line-height: 30px - width: 40px - - &:hover { - background-color: #b0c4de - } - -.activities - clear: both - - .activity - margin: 0.5px 0 - padding: 6px 0; - display: flex - - .member - width: 32px - height: @width - - .activity-member - font-weight: 700 - - .activity-desc - word-wrap: break-word - overflow: hidden - flex: 1 - align-self: center - margin: 0 - margin-left: 3px - overflow: hidden; - word-break: break-word; - - .activity-comment - display: block - border-radius: 3px - background: white - text-decoration: none - box-shadow: 0 1px 2px rgba(0,0,0,.2) - margin-top: 5px - padding: 5px - - .reactions - display: flex - margin-top: 5px - gap: 5px - - .open-comment-reaction-popup - display: flex - align-items: center - text-decoration: none - height: 24px; - - i.fa.fa-smile-o - font-size: 17px - font-weight: 500 - margin-left: 2px - - i.fa.fa-plus - font-size: 8px; - margin-top: -7px; - margin-left: 1px; - - .reaction - cursor: pointer - border: 1px solid grey - border-radius: 15px - display: flex - padding: 2px 5px - - &.selected { - background-color: #b0c4de - } - - &:hover { - background-color: #b0c4de - } - - .reaction-count - font-size: 12px - - .activity-checklist - display: block - border-radius: 3px - background: white - text-decoration: none - box-shadow: 0 1px 2px rgba(0,0,0,.2) - margin-top: 5px - padding: 5px - .activity-meta - font-size: 0.8em - color: darken(white, 40%) diff --git a/client/components/activities/comments.css b/client/components/activities/comments.css new file mode 100644 index 000000000..4fbfdf8ba --- /dev/null +++ b/client/components/activities/comments.css @@ -0,0 +1,65 @@ +.new-comment { + position: relative; + margin: 0 0 20px 38px; +} +.new-comment .member { + opacity: 0.7; + position: absolute; + top: 1px; + left: -38px; +} +.new-comment.is-open .member { + opacity: 1; +} +.new-comment.is-open .helper { + display: inline-block; +} +.new-comment.is-open textarea { + min-height: 100px; + color: #4d4d4d; + cursor: auto; + overflow: hidden; + word-wrap: break-word; +} +.new-comment .too-long { + margin-top: 8px; +} +.new-comment textarea { + background-color: #fff; + border: 0; + box-shadow: 0 1px 2px rgba(0,0,0,0.23); + height: 36px; + margin: 4px 4px 6px 0; + padding: 9px 11px; + width: 100%; +} +.new-comment textarea:hover, +.new-comment textarea:is-open { + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,0.33); + border: 0; + cursor: pointer; +} +.new-comment textarea:is-open { + cursor: auto; +} +.comment-item { + background-color: #fff; + border: 0; + box-shadow: 0 1px 2px rgba(0,0,0,0.23); + color: #8c8c8c; + height: 36px; + margin: 4px 4px 6px 0; + width: 92%; +} +.comment-item:hover { + background: #e0e0e0; +} +.comment-item.add-comment { + display: flex; + margin: 5px; +} +.comment-item.add-comment a { + display: block; + margin: auto; +} diff --git a/client/components/activities/comments.styl b/client/components/activities/comments.styl deleted file mode 100644 index d7492b767..000000000 --- a/client/components/activities/comments.styl +++ /dev/null @@ -1,67 +0,0 @@ -@import 'nib' - -.new-comment - position: relative - margin: 0 0 20px 38px - - .member - opacity: .7 - position: absolute - top: 1px - left: -38px - - &.is-open - .member - opacity: 1 - - .helper - display: inline-block - - textarea - min-height: 100px - color: #4d4d4d - cursor: auto - overflow: hidden - word-wrap: break-word - - .too-long - margin-top: 8px - - textarea - background-color: #fff - border: 0 - box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - height: 36px - margin: 4px 4px 6px 0 - padding: 9px 11px - width: 100% - - &:hover, - &:is-open - background-color: #fff - box-shadow: 0 1px 3px rgba(0, 0, 0, .33) - border: 0 - cursor: pointer - - &:is-open - cursor: auto - -.comment-item - background-color: #fff - border: 0 - box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - color: #8c8c8c - height: 36px - margin: 4px 4px 6px 0 - width: 92% - - &:hover - background: darken(white, 12%) - - &.add-comment - display: flex - margin: 5px - - a - display: block - margin: auto diff --git a/client/components/boards/boardBody.css b/client/components/boards/boardBody.css new file mode 100644 index 000000000..b4db4765b --- /dev/null +++ b/client/components/boards/boardBody.css @@ -0,0 +1,169 @@ +.board-wrapper { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: hidden; +} +.board-wrapper .board-canvas { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + transition: margin 0.1s; + overflow-y: auto; +} +.board-wrapper .board-canvas.is-sibling-sidebar-open { + margin-right: 248px; +} +.board-wrapper .board-canvas .board-overlay { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + top: -100px; + right: -400px; + background: #000; + opacity: 0.33; + animation: fadeIn 0.2s; + z-index: 16; +} +.board-wrapper .board-canvas.is-dragging-active .open-minicard-composer, +.board-wrapper .board-canvas.is-dragging-active .minicard-wrapper.is-checked { + display: none; +} +@media screen and (max-width: 800px) { + .board-wrapper .board-canvas .swimlane { + border-bottom: 1px solid #ccc; + display: flex; + flex-direction: column; + margin: 0; + padding: 0 0px 0px 0; + overflow-x: hidden; + overflow-y: auto; + } +} +.calendar-event-green { + background: #3cb500 !important; + border-color: #2a8000; + color: #fff !important; +} +.calendar-event-yellow { + background: #fad900 !important; + border-color: #c7ac00; + color: #000 !important; +} +.calendar-event-orange { + background: #ff9f19 !important; + border-color: #cc7c14; + color: #000 !important; +} +.calendar-event-red { + background: #eb4646 !important; + border-color: #b83737; + color: #fff !important; +} +.calendar-event-purple { + background: #a632db !important; + border-color: #7d26a6; + color: #fff !important; +} +.calendar-event-blue { + background: #0079bf !important; + border-color: #005a8a; + color: #fff !important; +} +.calendar-event-pink { + background: #ff78cb !important; + border-color: #cc62a3; + color: #000 !important; +} +.calendar-event-sky { + background: #00c2e0 !important; + border-color: #0094ab; + color: #fff !important; +} +.calendar-event-black { + background: #4d4d4d !important; + border-color: #1a1a1a; + color: #fff !important; +} +.calendar-event-lime { + background: #51e898 !important; + border-color: #3eb375; + color: #000 !important; +} +.calendar-event-silver { + background: #c0c0c0 !important; + border-color: #8c8c8c; + color: #000 !important; +} +.calendar-event-peachpuff { + background: #ffdab9 !important; + border-color: #ccaf95; + color: #000 !important; +} +.calendar-event-crimson { + background: #dc143c !important; + border-color: #a8112f; + color: #fff !important; +} +.calendar-event-plum { + background: #dda0dd !important; + border-color: #a87ba8; + color: #000 !important; +} +.calendar-event-darkgreen { + background: #006400 !important; + border-color: #003000; + color: #fff !important; +} +.calendar-event-slateblue { + background: #6a5acd !important; + border-color: #4f4399; + color: #fff !important; +} +.calendar-event-magenta { + background: #f0f !important; + border-color: #c0c; + color: #fff !important; +} +.calendar-event-gold { + background: #ffd700 !important; + border-color: #ca0; + color: #000 !important; +} +.calendar-event-navy { + background: #000080 !important; + border-color: #003; + color: #fff !important; +} +.calendar-event-gray { + background: #808080 !important; + border-color: #333; + color: #fff !important; +} +.calendar-event-saddlebrown { + background: #8b4513 !important; + border-color: #572b0c; + color: #fff !important; +} +.calendar-event-paleturquoise { + background: #afeeee !important; + border-color: #8ababa; + color: #000 !important; +} +.calendar-event-mistyrose { + background: #ffe4e1 !important; + border-color: #ccb8b6; + color: #000 !important; +} +.calendar-event-indigo { + background: #4b0082 !important; + border-color: #2b004d; + color: #fff !important; +} diff --git a/client/components/boards/boardBody.styl b/client/components/boards/boardBody.styl deleted file mode 100644 index 32207d820..000000000 --- a/client/components/boards/boardBody.styl +++ /dev/null @@ -1,133 +0,0 @@ -@import 'nib' - -position() - if arguments[0] == cover || arguments[0] == fixed-cover - if arguments[0] == cover - position: absolute - else - position: fixed - left: 0 - right: 0 - top: 0 - bottom: 0 - else - position: arguments - -.board-wrapper - position: cover - overflow-x: hidden - overflow-y: hidden - - .board-canvas - position: cover - transition: margin .1s - overflow-y: auto - - &.is-sibling-sidebar-open - margin-right: 248px - - .board-overlay - position: fixed-cover - top: -100px - right: -400px - background: black - opacity: 0.33 - animation: fadeIn 0.2s - z-index: 16 - - &.is-dragging-active - .open-minicard-composer, - .minicard-wrapper.is-checked - display: none - -@media screen and (max-width: 800px) - .board-wrapper - - .board-canvas - - .swimlane - border-bottom: 1px solid #CCC - display: flex - flex-direction: column - margin: 0 - padding: 0 0px 0px 0 - overflow-x: hidden - overflow-y: auto - -calendar-event-color(background, borderColor, color...) - background: background !important - border-color: borderColor - if color - color: color !important //overwrite text for better visibility - -.calendar-event-green - calendar-event-color(#3cb500, #2a8000, #ffffff) //White text for better visibility - -.calendar-event-yellow - calendar-event-color(#fad900, #c7ac00, #000) //Black text for better visibility - -.calendar-event-orange - calendar-event-color(#ff9f19, #cc7c14, #000) //Black text for better visibility - -.calendar-event-red - calendar-event-color(#eb4646, #b83737, #ffffff) //White text for better visibility - -.calendar-event-purple - calendar-event-color(#a632db, #7d26a6, #ffffff) //White text for better visibility - -.calendar-event-blue - calendar-event-color(#0079bf, #005a8a, #ffffff) //White text for better visibility - -.calendar-event-pink - calendar-event-color(#ff78cb, #cc62a3, #000) //Black text for better visibility - -.calendar-event-sky - calendar-event-color(#00c2e0, #0094ab, #ffffff) //White text for better visibility - -.calendar-event-black - calendar-event-color(#4d4d4d, #1a1a1a, #ffffff) //White text for better visibility - -.calendar-event-lime - calendar-event-color(#51e898, #3eb375, #000) //Black text for better visibility - -.calendar-event-silver - calendar-event-color(#c0c0c0, #8c8c8c, #000) //Black text for better visibility - -.calendar-event-peachpuff - calendar-event-color(#ffdab9, #ccaf95, #000) //Black text for better visibility - -.calendar-event-crimson - calendar-event-color(#dc143c, #a8112f, #ffffff) //White text for better visibility - -.calendar-event-plum - calendar-event-color(#dda0dd, #a87ba8, #000) //Black text for better visibility - -.calendar-event-darkgreen - calendar-event-color(#006400, #003000, #ffffff) //White text for better visibility - -.calendar-event-slateblue - calendar-event-color(#6a5acd, #4f4399, #ffffff) //White text for better visibility - -.calendar-event-magenta - calendar-event-color(#ff00ff, #cc00cc, #ffffff) //White text for better visibility - -.calendar-event-gold - calendar-event-color(#ffd700, #ccaa00, #000) //Black text for better visibility - -.calendar-event-navy - calendar-event-color(#000080, #000033, #ffffff) //White text for better visibility - -.calendar-event-gray - calendar-event-color(#808080, #333333, #ffffff) //White text for better visibility - -.calendar-event-saddlebrown - calendar-event-color(#8b4513, #572b0c, #ffffff) //White text for better visibility - -.calendar-event-paleturquoise - calendar-event-color(#afeeee, #8ababa, #000) //Black text for better visibility - -.calendar-event-mistyrose - calendar-event-color(#ffe4e1, #ccb8b6, #000) //Black text for better visibility - -.calendar-event-indigo - calendar-event-color(#4b0082, #2b004d, #ffffff) //White text for better visibility diff --git a/client/components/boards/boardColors.css b/client/components/boards/boardColors.css new file mode 100644 index 000000000..f9a641799 --- /dev/null +++ b/client/components/boards/boardColors.css @@ -0,0 +1,2176 @@ +.board-color-nephritis#header, +.board-color-nephritis.sk-spinner div, +.board-backgrounds-list .board-color-nephritis.background-box, +.board-list .board-color-nephritis a { + background-color: #27ae60; +} +.board-color-nephritis .is-selected .minicard { + border-left: 3px solid #27ae60; +} +.board-color-nephritis .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-nephritis button[type=submit].primary, +.board-color-nephritis input[type=submit].primary, +.board-color-nephritis .sidebar .sidebar-content .sidebar-btn { + background-color: #1f8b4d; + border-radius: 7px; +} +.board-color-nephritis.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-nephritis .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-nephritis .sidebar-list li a:hover { + background-color: #2cc66d; +} +.board-color-nephritis#header ul li.current, +.board-color-nephritis#header-quick-access ul li.current { + border-bottom: 2px solid #2cc66d; +} +.board-color-nephritis#header-quick-access { + background: #239d56; + color: #fff; +} +.board-color-nephritis#header #header-main-bar .board-header-btn.emphasis { + background: #ae2775; +} +.board-color-nephritis#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-nephritis#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #9d2369; +} +.board-color-nephritis#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #8b1f5e; +} +.board-color-nephritis .materialCheckBox.is-checked { + border-bottom: 2px solid #27ae60; + border-right: 2px solid #27ae60; +} +.board-color-nephritis .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e7faef; +} +.board-color-nephritis .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8fdfa; +} +.board-color-nephritis .toggle-label:after { + background-color: #1f8b4d; +} +.board-color-nephritis .toggle-switch:checked ~ .toggle-label { + background-color: #3dd37c; +} +.board-color-nephritis .toggle-switch:checked ~ .toggle-label:after { + background-color: #1f8b4d; +} +@media screen and (max-width: 800px) { + .board-color-nephritis.pop-over .header { + background: #27ae60; + color: #fff; + } +} +.board-color-nephritis#header ul li.current, +.board-color-nephritis#header-quick-access ul li.current { + border-bottom: 4px solid #3dd37c; +} +.board-color-pomegranate#header, +.board-color-pomegranate.sk-spinner div, +.board-backgrounds-list .board-color-pomegranate.background-box, +.board-list .board-color-pomegranate a { + background-color: #c0392b; +} +.board-color-pomegranate .is-selected .minicard { + border-left: 3px solid #c0392b; +} +.board-color-pomegranate .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-pomegranate button[type=submit].primary, +.board-color-pomegranate input[type=submit].primary, +.board-color-pomegranate .sidebar .sidebar-content .sidebar-btn { + background-color: #9a2e22; + border-radius: 7px; +} +.board-color-pomegranate.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-pomegranate .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-pomegranate .sidebar-list li a:hover { + background-color: #d24435; +} +.board-color-pomegranate#header ul li.current, +.board-color-pomegranate#header-quick-access ul li.current { + border-bottom: 2px solid #d24435; +} +.board-color-pomegranate#header-quick-access { + background: #ad3327; + color: #fff; +} +.board-color-pomegranate#header #header-main-bar .board-header-btn.emphasis { + background: #2bb2c0; +} +.board-color-pomegranate#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-pomegranate#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #27a0ad; +} +.board-color-pomegranate#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #228e9a; +} +.board-color-pomegranate .materialCheckBox.is-checked { + border-bottom: 2px solid #c0392b; + border-right: 2px solid #c0392b; +} +.board-color-pomegranate .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #faeae9; +} +.board-color-pomegranate .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fdf9f8; +} +.board-color-pomegranate .toggle-label:after { + background-color: #9a2e22; +} +.board-color-pomegranate .toggle-switch:checked ~ .toggle-label { + background-color: #d7584b; +} +.board-color-pomegranate .toggle-switch:checked ~ .toggle-label:after { + background-color: #9a2e22; +} +@media screen and (max-width: 800px) { + .board-color-pomegranate.pop-over .header { + background: #c0392b; + color: #fff; + } +} +.board-color-pomegranate#header ul li.current, +.board-color-pomegranate#header-quick-access ul li.current { + border-bottom: 4px solid #d7584b; +} +.board-color-belize#header, +.board-color-belize.sk-spinner div, +.board-backgrounds-list .board-color-belize.background-box, +.board-list .board-color-belize a { + background-color: #2980b9; +} +.board-color-belize .is-selected .minicard { + border-left: 3px solid #2980b9; +} +.board-color-belize .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-belize button[type=submit].primary, +.board-color-belize input[type=submit].primary, +.board-color-belize .sidebar .sidebar-content .sidebar-btn { + background-color: #216694; + border-radius: 7px; +} +.board-color-belize.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-belize .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-belize .sidebar-list li a:hover { + background-color: #2e90d0; +} +.board-color-belize#header ul li.current, +.board-color-belize#header-quick-access ul li.current { + border-bottom: 2px solid #2e90d0; +} +.board-color-belize#header-quick-access { + background: #2573a7; + color: #fff; +} +.board-color-belize#header #header-main-bar .board-header-btn.emphasis { + background: #b96229; +} +.board-color-belize#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-belize#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #a75825; +} +.board-color-belize#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #944e21; +} +.board-color-belize .materialCheckBox.is-checked { + border-bottom: 2px solid #2980b9; + border-right: 2px solid #2980b9; +} +.board-color-belize .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e8f3fa; +} +.board-color-belize .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8fbfd; +} +.board-color-belize .toggle-label:after { + background-color: #216694; +} +.board-color-belize .toggle-switch:checked ~ .toggle-label { + background-color: #459cd6; +} +.board-color-belize .toggle-switch:checked ~ .toggle-label:after { + background-color: #216694; +} +@media screen and (max-width: 800px) { + .board-color-belize.pop-over .header { + background: #2980b9; + color: #fff; + } +} +.board-color-belize#header ul li.current, +.board-color-belize#header-quick-access ul li.current { + border-bottom: 4px solid #459cd6; +} +.board-color-wisteria#header, +.board-color-wisteria.sk-spinner div, +.board-backgrounds-list .board-color-wisteria.background-box, +.board-list .board-color-wisteria a { + background-color: #8e44ad; +} +.board-color-wisteria .is-selected .minicard { + border-left: 3px solid #8e44ad; +} +.board-color-wisteria .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-wisteria button[type=submit].primary, +.board-color-wisteria input[type=submit].primary, +.board-color-wisteria .sidebar .sidebar-content .sidebar-btn { + background-color: #72368a; + border-radius: 7px; +} +.board-color-wisteria.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-wisteria .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-wisteria .sidebar-list li a:hover { + background-color: #9c51bb; +} +.board-color-wisteria#header ul li.current, +.board-color-wisteria#header-quick-access ul li.current { + border-bottom: 2px solid #9c51bb; +} +.board-color-wisteria#header-quick-access { + background: #803d9c; + color: #fff; +} +.board-color-wisteria#header #header-main-bar .board-header-btn.emphasis { + background: #63ad44; +} +.board-color-wisteria#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-wisteria#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #599c3d; +} +.board-color-wisteria#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #4f8a36; +} +.board-color-wisteria .materialCheckBox.is-checked { + border-bottom: 2px solid #8e44ad; + border-right: 2px solid #8e44ad; +} +.board-color-wisteria .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #f4ecf7; +} +.board-color-wisteria .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fcf9fd; +} +.board-color-wisteria .toggle-label:after { + background-color: #72368a; +} +.board-color-wisteria .toggle-switch:checked ~ .toggle-label { + background-color: #a765c2; +} +.board-color-wisteria .toggle-switch:checked ~ .toggle-label:after { + background-color: #72368a; +} +@media screen and (max-width: 800px) { + .board-color-wisteria.pop-over .header { + background: #8e44ad; + color: #fff; + } +} +.board-color-wisteria#header ul li.current, +.board-color-wisteria#header-quick-access ul li.current { + border-bottom: 4px solid #a765c2; +} +.board-color-midnight#header, +.board-color-midnight.sk-spinner div, +.board-backgrounds-list .board-color-midnight.background-box, +.board-list .board-color-midnight a { + background-color: #2c3e50; +} +.board-color-midnight .is-selected .minicard { + border-left: 3px solid #2c3e50; +} +.board-color-midnight .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-midnight button[type=submit].primary, +.board-color-midnight input[type=submit].primary, +.board-color-midnight .sidebar .sidebar-content .sidebar-btn { + background-color: #233240; + border-radius: 7px; +} +.board-color-midnight.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-midnight .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-midnight .sidebar-list li a:hover { + background-color: #3a5169; +} +.board-color-midnight#header ul li.current, +.board-color-midnight#header-quick-access ul li.current { + border-bottom: 2px solid #3a5169; +} +.board-color-midnight#header-quick-access { + background: #283848; + color: #fff; +} +.board-color-midnight#header #header-main-bar .board-header-btn.emphasis { + background: #503e2c; +} +.board-color-midnight#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-midnight#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #483828; +} +.board-color-midnight#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #403223; +} +.board-color-midnight .materialCheckBox.is-checked { + border-bottom: 2px solid #2c3e50; + border-right: 2px solid #2c3e50; +} +.board-color-midnight .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e6ecf1; +} +.board-color-midnight .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8f9fb; +} +.board-color-midnight .toggle-label:after { + background-color: #233240; +} +.board-color-midnight .toggle-switch:checked ~ .toggle-label { + background-color: #476582; +} +.board-color-midnight .toggle-switch:checked ~ .toggle-label:after { + background-color: #233240; +} +@media screen and (max-width: 800px) { + .board-color-midnight.pop-over .header { + background: #2c3e50; + color: #fff; + } +} +.board-color-midnight#header ul li.current, +.board-color-midnight#header-quick-access ul li.current { + border-bottom: 4px solid #476582; +} +.board-color-pumpkin#header, +.board-color-pumpkin.sk-spinner div, +.board-backgrounds-list .board-color-pumpkin.background-box, +.board-list .board-color-pumpkin a { + background-color: #e67e22; +} +.board-color-pumpkin .is-selected .minicard { + border-left: 3px solid #e67e22; +} +.board-color-pumpkin .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-pumpkin button[type=submit].primary, +.board-color-pumpkin input[type=submit].primary, +.board-color-pumpkin .sidebar .sidebar-content .sidebar-btn { + background-color: #be6415; + border-radius: 7px; +} +.board-color-pumpkin.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-pumpkin .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-pumpkin .sidebar-list li a:hover { + background-color: #e98b38; +} +.board-color-pumpkin#header ul li.current, +.board-color-pumpkin#header-quick-access ul li.current { + border-bottom: 2px solid #e98b38; +} +.board-color-pumpkin#header-quick-access { + background: #d57118; + color: #fff; +} +.board-color-pumpkin#header #header-main-bar .board-header-btn.emphasis { + background: #228ae6; +} +.board-color-pumpkin#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-pumpkin#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #187dd5; +} +.board-color-pumpkin#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #156fbe; +} +.board-color-pumpkin .materialCheckBox.is-checked { + border-bottom: 2px solid #e67e22; + border-right: 2px solid #e67e22; +} +.board-color-pumpkin .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #fdf2e9; +} +.board-color-pumpkin .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fefbf8; +} +.board-color-pumpkin .toggle-label:after { + background-color: #be6415; +} +.board-color-pumpkin .toggle-switch:checked ~ .toggle-label { + background-color: #eb984e; +} +.board-color-pumpkin .toggle-switch:checked ~ .toggle-label:after { + background-color: #be6415; +} +@media screen and (max-width: 800px) { + .board-color-pumpkin.pop-over .header { + background: #e67e22; + color: #fff; + } +} +.board-color-pumpkin#header ul li.current, +.board-color-pumpkin#header-quick-access ul li.current { + border-bottom: 4px solid #eb984e; +} +.board-color-moderatepink#header, +.board-color-moderatepink.sk-spinner div, +.board-backgrounds-list .board-color-moderatepink.background-box, +.board-list .board-color-moderatepink a { + background-color: #cd5a91; +} +.board-color-moderatepink .is-selected .minicard { + border-left: 3px solid #cd5a91; +} +.board-color-moderatepink .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-moderatepink button[type=submit].primary, +.board-color-moderatepink input[type=submit].primary, +.board-color-moderatepink .sidebar .sidebar-content .sidebar-btn { + background-color: #b53773; + border-radius: 7px; +} +.board-color-moderatepink.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-moderatepink .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-moderatepink .sidebar-list li a:hover { + background-color: #d26b9c; +} +.board-color-moderatepink#header ul li.current, +.board-color-moderatepink#header-quick-access ul li.current { + border-bottom: 2px solid #d26b9c; +} +.board-color-moderatepink#header-quick-access { + background: #c64382; + color: #fff; +} +.board-color-moderatepink#header #header-main-bar .board-header-btn.emphasis { + background: #5acd96; +} +.board-color-moderatepink#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-moderatepink#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #43c688; +} +.board-color-moderatepink#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #37b579; +} +.board-color-moderatepink .materialCheckBox.is-checked { + border-bottom: 2px solid #cd5a91; + border-right: 2px solid #cd5a91; +} +.board-color-moderatepink .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #faeef4; +} +.board-color-moderatepink .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fefafc; +} +.board-color-moderatepink .toggle-label:after { + background-color: #b53773; +} +.board-color-moderatepink .toggle-switch:checked ~ .toggle-label { + background-color: #d77ba7; +} +.board-color-moderatepink .toggle-switch:checked ~ .toggle-label:after { + background-color: #b53773; +} +@media screen and (max-width: 800px) { + .board-color-moderatepink.pop-over .header { + background: #cd5a91; + color: #fff; + } +} +.board-color-moderatepink#header ul li.current, +.board-color-moderatepink#header-quick-access ul li.current { + border-bottom: 4px solid #d77ba7; +} +.board-color-strongcyan#header, +.board-color-strongcyan.sk-spinner div, +.board-backgrounds-list .board-color-strongcyan.background-box, +.board-list .board-color-strongcyan a { + background-color: #00aecc; +} +.board-color-strongcyan .is-selected .minicard { + border-left: 3px solid #00aecc; +} +.board-color-strongcyan .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-strongcyan button[type=submit].primary, +.board-color-strongcyan input[type=submit].primary, +.board-color-strongcyan .sidebar .sidebar-content .sidebar-btn { + background-color: #008ba3; + border-radius: 7px; +} +.board-color-strongcyan.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-strongcyan .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-strongcyan .sidebar-list li a:hover { + background-color: #00c8eb; +} +.board-color-strongcyan#header ul li.current, +.board-color-strongcyan#header-quick-access ul li.current { + border-bottom: 2px solid #00c8eb; +} +.board-color-strongcyan#header-quick-access { + background: #009db8; + color: #fff; +} +.board-color-strongcyan#header #header-main-bar .board-header-btn.emphasis { + background: #cc1e00; +} +.board-color-strongcyan#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-strongcyan#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #b81b00; +} +.board-color-strongcyan#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #a31800; +} +.board-color-strongcyan .materialCheckBox.is-checked { + border-bottom: 2px solid #00aecc; + border-right: 2px solid #00aecc; +} +.board-color-strongcyan .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e0fbff; +} +.board-color-strongcyan .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f6feff; +} +.board-color-strongcyan .toggle-label:after { + background-color: #008ba3; +} +.board-color-strongcyan .toggle-switch:checked ~ .toggle-label { + background-color: #0adbff; +} +.board-color-strongcyan .toggle-switch:checked ~ .toggle-label:after { + background-color: #008ba3; +} +@media screen and (max-width: 800px) { + .board-color-strongcyan.pop-over .header { + background: #00aecc; + color: #fff; + } +} +.board-color-strongcyan#header ul li.current, +.board-color-strongcyan#header-quick-access ul li.current { + border-bottom: 4px solid #0adbff; +} +.board-color-limegreen#header, +.board-color-limegreen.sk-spinner div, +.board-backgrounds-list .board-color-limegreen.background-box, +.board-list .board-color-limegreen a { + background-color: #4bbf6b; +} +.board-color-limegreen .is-selected .minicard { + border-left: 3px solid #4bbf6b; +} +.board-color-limegreen .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-limegreen button[type=submit].primary, +.board-color-limegreen input[type=submit].primary, +.board-color-limegreen .sidebar .sidebar-content .sidebar-btn { + background-color: #389d54; + border-radius: 7px; +} +.board-color-limegreen.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-limegreen .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-limegreen .sidebar-list li a:hover { + background-color: #5dc57a; +} +.board-color-limegreen#header ul li.current, +.board-color-limegreen#header-quick-access ul li.current { + border-bottom: 2px solid #5dc57a; +} +.board-color-limegreen#header-quick-access { + background: #3fb15e; + color: #fff; +} +.board-color-limegreen#header #header-main-bar .board-header-btn.emphasis { + background: #bf4b9f; +} +.board-color-limegreen#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-limegreen#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #b13f91; +} +.board-color-limegreen#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #9d3881; +} +.board-color-limegreen .materialCheckBox.is-checked { + border-bottom: 2px solid #4bbf6b; + border-right: 2px solid #4bbf6b; +} +.board-color-limegreen .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #edf9f0; +} +.board-color-limegreen .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fafdfb; +} +.board-color-limegreen .toggle-label:after { + background-color: #389d54; +} +.board-color-limegreen .toggle-switch:checked ~ .toggle-label { + background-color: #6fcc89; +} +.board-color-limegreen .toggle-switch:checked ~ .toggle-label:after { + background-color: #389d54; +} +@media screen and (max-width: 800px) { + .board-color-limegreen.pop-over .header { + background: #4bbf6b; + color: #fff; + } +} +.board-color-limegreen#header ul li.current, +.board-color-limegreen#header-quick-access ul li.current { + border-bottom: 4px solid #6fcc89; +} +.board-color-dark#header, +.board-color-dark.sk-spinner div, +.board-backgrounds-list .board-color-dark.background-box, +.board-list .board-color-dark a { + background-color: #2c3e51; +} +.board-color-dark .is-selected .minicard { + border-left: 3px solid #2c3e51; +} +.board-color-dark .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-dark button[type=submit].primary, +.board-color-dark input[type=submit].primary, +.board-color-dark .sidebar .sidebar-content .sidebar-btn { + background-color: #233241; + border-radius: 7px; +} +.board-color-dark.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-dark .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-dark .sidebar-list li a:hover { + background-color: #3a516a; +} +.board-color-dark#header ul li.current, +.board-color-dark#header-quick-access ul li.current { + border-bottom: 2px solid #3a516a; +} +.board-color-dark#header-quick-access { + background: #283849; + color: #fff; +} +.board-color-dark#header #header-main-bar .board-header-btn.emphasis { + background: #513f2c; +} +.board-color-dark#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-dark#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #493928; +} +.board-color-dark#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #413223; +} +.board-color-dark .materialCheckBox.is-checked { + border-bottom: 2px solid #2c3e51; + border-right: 2px solid #2c3e51; +} +.board-color-dark .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e6ecf1; +} +.board-color-dark .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8f9fb; +} +.board-color-dark .toggle-label:after { + background-color: #233241; +} +.board-color-dark .toggle-switch:checked ~ .toggle-label { + background-color: #476483; +} +.board-color-dark .toggle-switch:checked ~ .toggle-label:after { + background-color: #233241; +} +@media screen and (max-width: 800px) { + .board-color-dark.pop-over .header { + background: #2c3e51; + color: #fff; + } +} +.board-color-dark#header ul li.current, +.board-color-dark#header-quick-access ul li.current { + border-bottom: 4px solid #476483; +} +.board-color-dark .ui-sortable, +.board-color-dark .swimlane, +.board-color-dark .swimlane >.swimlane-header-wrap, +.board-color-dark .swimlane >.list.js-list, +.board-color-dark .swimlane >.list-composer.js-list-composer, +.board-color-dark .list-body, +.board-color-dark .list, +.board-color-dark .list-composer, +.board-color-dark .sidebar-content, +.board-color-dark .card-details { + background-color: #2c3e50; +} +.board-color-dark .card-details h3, +.board-color-dark .card-details-left p, +.board-color-dark .card-details-items, +.board-color-dark .card-checklist-items .ui-sortable, +.board-color-dark .card-subtasks-items, +.board-color-dark .activities, +.board-color-dark .material-toggle-switch { + color: #bbb; +} +.board-color-dark .list-header { + background-color: #888; +} +.board-color-dark .board-widget, +.board-color-dark .board-widget-labels, +.board-color-dark .board-widget-members { + color: #aaa; +} +.board-color-dark .pop-over >.header { + display: none; +} +.board-color-dark #header-quick-access .fa-plus { + display: none; +} +.board-color-dark #header-quick-access:hover .fa-plus { + display: inherit; +} +.board-color-dark .open-minicard-composer { + visibility: hidden; +} +.board-color-dark .list.js-list:hover .open-minicard-composer { + visibility: visible; +} +.board-color-dark .list-header-menu { + visibility: hidden; +} +.board-color-dark .list.js-list:hover .list-header-menu { + visibility: visible; +} +.board-color-dark .list.js-list-composer >.list-header { + visibility: hidden; +} +.board-color-dark .list.js-list-composer:hover >.list-header { + visibility: visible; +} +.board-color-dark #header-quick-access, +.board-color-dark #header { + background-color: rgba(0,0,0,0.75) !important; +} +.board-color-dark #header .board-header-btn:hover { + background-color: rgba(255,255,255,0.3) !important; +} +.board-color-dark .list >.list-header, +.board-color-dark .swimlane-header { + color: rgba(255,255,255,0.7); +} +.board-color-dark .minicard-wrapper.is-selected .minicard, +.board-color-dark .minicard:hover, +.board-color-dark .minicard-composer.js-composer, +.board-color-dark .open-minicard-composer:hover { + background-color: rgba(255,255,255,0.8) !important; + color: #000; + border-radius: 7px; +} +.board-color-dark .minicard:hover .badge, +.board-color-dark .minicard-wrapper.is-selected .badge { + color: #000; +} +.board-color-dark .card-details .card-details-header { + background-color: #ccc; +} +.board-color-dark .sidebar-tongue, +.board-color-dark .sidebar-shadow { + background-color: #666 !important; +} +.board-color-dark .sidebar-content h3, +.board-color-dark .sidebar-content h2, +.board-color-dark .sidebar-content { + color: rgba(255,255,255,0.7) !important; +} +.board-color-dark .card-details .activities .activity .activity-desc .activity-comment { + background-color: #ccc; + color: #222; +} +.board-color-relax#header, +.board-color-relax.sk-spinner div, +.board-backgrounds-list .board-color-relax.background-box, +.board-list .board-color-relax a { + background-color: #27ae61; +} +.board-color-relax .is-selected .minicard { + border-left: 3px solid #27ae61; +} +.board-color-relax .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-relax button[type=submit].primary, +.board-color-relax input[type=submit].primary, +.board-color-relax .sidebar .sidebar-content .sidebar-btn { + background-color: #1f8b4e; + border-radius: 7px; +} +.board-color-relax.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-relax .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-relax .sidebar-list li a:hover { + background-color: #2cc66f; +} +.board-color-relax#header ul li.current, +.board-color-relax#header-quick-access ul li.current { + border-bottom: 2px solid #2cc66f; +} +.board-color-relax#header-quick-access { + background: #239d57; + color: #fff; +} +.board-color-relax#header #header-main-bar .board-header-btn.emphasis { + background: #ae2774; +} +.board-color-relax#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-relax#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #9d2368; +} +.board-color-relax#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #8b1f5d; +} +.board-color-relax .materialCheckBox.is-checked { + border-bottom: 2px solid #27ae61; + border-right: 2px solid #27ae61; +} +.board-color-relax .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e7faef; +} +.board-color-relax .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8fdfa; +} +.board-color-relax .toggle-label:after { + background-color: #1f8b4e; +} +.board-color-relax .toggle-switch:checked ~ .toggle-label { + background-color: #3dd37e; +} +.board-color-relax .toggle-switch:checked ~ .toggle-label:after { + background-color: #1f8b4e; +} +@media screen and (max-width: 800px) { + .board-color-relax.pop-over .header { + background: #27ae61; + color: #fff; + } +} +.board-color-relax#header ul li.current, +.board-color-relax#header-quick-access ul li.current { + border-bottom: 4px solid #3dd37e; +} +.board-color-relax .ui-sortable { + background-color: #a7e366; +} +.board-color-relax .list-header { + background-color: #a7e366; +} +.board-color-relax .list-body { + background-color: #a7e366; +} +.board-color-relax .list { + border-left: 1px dotted #000; +} +.board-color-relax .card-details .card-details-items ~ .js-open-inlined-form .viewer { + background-color: #fff !important; + padding: 15px !important; + border: 1px solid #000 !important; + word-wrap: break-word; +} +.board-color-relax .minicard .badges .badge .badge-icon.badge-comment, +.board-color-relax .minicard .badges .badge .badge-text.badge-comment { + display: block; + border-radius: 4px; + padding: 1px 3px; + margin-bottom: 0.3rem; + color: #f00; + background-color: #fff; + font-weight: bold; + font-size: 11pt; +} +.board-color-corteza#header, +.board-color-corteza.sk-spinner div, +.board-backgrounds-list .board-color-corteza.background-box, +.board-list .board-color-corteza a { + background-color: #568ba2; +} +.board-color-corteza .is-selected .minicard { + border-left: 3px solid #568ba2; +} +.board-color-corteza .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-corteza button[type=submit].primary, +.board-color-corteza input[type=submit].primary, +.board-color-corteza .sidebar .sidebar-content .sidebar-btn { + background-color: #456f82; + border-radius: 7px; +} +.board-color-corteza.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-corteza .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-corteza .sidebar-list li a:hover { + background-color: #6597ad; +} +.board-color-corteza#header ul li.current, +.board-color-corteza#header-quick-access ul li.current { + border-bottom: 2px solid #6597ad; +} +.board-color-corteza#header-quick-access { + background: #4d7d92; + color: #fff; +} +.board-color-corteza#header #header-main-bar .board-header-btn.emphasis { + background: #a26d56; +} +.board-color-corteza#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-corteza#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #92624d; +} +.board-color-corteza#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #825745; +} +.board-color-corteza .materialCheckBox.is-checked { + border-bottom: 2px solid #568ba2; + border-right: 2px solid #568ba2; +} +.board-color-corteza .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #eef3f6; +} +.board-color-corteza .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fafcfc; +} +.board-color-corteza .toggle-label:after { + background-color: #456f82; +} +.board-color-corteza .toggle-switch:checked ~ .toggle-label { + background-color: #76a3b6; +} +.board-color-corteza .toggle-switch:checked ~ .toggle-label:after { + background-color: #456f82; +} +@media screen and (max-width: 800px) { + .board-color-corteza.pop-over .header { + background: #568ba2; + color: #fff; + } +} +.board-color-corteza#header ul li.current, +.board-color-corteza#header-quick-access ul li.current { + border-bottom: 4px solid #76a3b6; +} +/* + Alternate "Clear" Styling +*/ +.board-color-clearblue.sk-spinner div, +.board-backgrounds-list .board-color-clearblue.background-box, +.board-list .board-color-clearblue a { + background: linear-gradient(180deg, #499bea 0%, #00aecc 100%); +} +.board-color-clearblue .is-selected .minicard { + border-left: 3px solid #499bea; +} +.board-color-clearblue.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-clearblue .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-clearblue .sidebar-list li a:hover { + background-color: #5ba5ec; +} +.board-color-clearblue#header ul li.current, +.board-color-clearblue#header-quick-access ul li.current { + border-bottom: 4px solid #00c8eb; +} +.board-color-clearblue#header-quick-access { + background: #2d8ce7; + color: #fff; +} +.board-color-clearblue#header-quick-access #header-new-board-icon, +.board-color-clearblue#header-quick-access #header-user-bar, +.board-color-clearblue#header-quick-access ul li { + color: rgba(255,255,255,0.5); +} +.board-color-clearblue#header { + background-color: #00aecc; + border-bottom: 1px solid #008ba3; + border-top: 1px solid #00687a; +} +.board-color-clearblue#header #header-main-bar { + background: linear-gradient(180deg, #499bea 0%, #00aecc 100%); +} +.board-color-clearblue#header #header-main-bar p { + margin-bottom: 6px; +} +.board-color-clearblue#header #header-main-bar .board-header-btn.emphasis { + background: #00c8eb; +} +.board-color-clearblue#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-clearblue#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: rgba(0,0,0,0.2); +} +.board-color-clearblue#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: rgba(0,0,0,0.2); +} +.board-color-clearblue .materialCheckBox.is-checked { + border-bottom: 2px solid #499bea; + border-right: 2px solid #499bea; +} +.board-color-clearblue .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e0fbff; +} +.board-color-clearblue .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f6feff; +} +.board-color-clearblue .toggle-switch:checked ~ .toggle-label { + background-color: #6dafee; +} +.board-color-clearblue .toggle-switch:checked ~ .toggle-label:after { + background-color: #197ddc; +} +.board-color-clearblue .board-canvas { + background: linear-gradient(135deg, #499bea 0%, #00aecc 100%); +} +.board-color-clearblue .swimlane { + background: none; +} +.board-color-clearblue .list:first-child { + margin-left: 15px; +} +.board-color-clearblue .list { + background: rgba(255,255,255,0.35); + margin: 10px; + border: 0; + border-radius: 14px; +} +.board-color-clearblue .list.list-composer { + background: rgba(255,255,255,0.1); + height: min-content; + flex: unset; + width: 270px; + padding-bottom: 16px; +} +.board-color-clearblue .list.list-composer .open-list-composer { + border-radius: 7px; + color: rgba(0,0,0,0.3); + padding: 7px 10px; + display: block; +} +.board-color-clearblue .list.list-composer .open-list-composer:hover { + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + background: rgba(255,255,255,0.7); + color: rgba(0,0,0,0.6); +} +.board-color-clearblue .list-header { + background-color: rgba(255,255,255,0.25); + border-radius: 14px 14px 0 0; +} +.board-color-clearblue .list-header:not([class*="list-header-"]) { + border-bottom: 6px solid rgba(255,255,255,0); +} +.board-color-clearblue .list-header .list-header-name { + color: rgba(0,0,0,0.6); +} +.board-color-clearblue .list-body { + padding: 11px; +} +.board-color-clearblue .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); + color: #222; +} +.board-color-clearblue .card-details { + border-radius: 0 0 14px 14px; + box-shadow: 0 0 7px 0 rgba(0,0,0,0.5); + margin-left: -10px; +} +.board-color-clearblue .list-body .open-minicard-composer { + border-radius: 7px; + color: rgba(0,0,0,0.3); + margin-bottom: 11px; +} +.board-color-clearblue .list-body .open-minicard-composer:hover { + background: rgba(255,255,255,0.7); + color: rgba(0,0,0,0.6); +} +.board-color-clearblue button[type=submit].primary, +.board-color-clearblue input[type=submit].primary { + box-shadow: none; + background-color: rgba(255,255,255,0.5); + color: rgba(0,0,0,0.55); + border-radius: 7px; + border: 0; +} +.board-color-clearblue button[type="submit"].primary:hover, +.board-color-clearblue input[type="submit"].primary:hover { + background-color: rgba(255,255,255,0.7); + color: rgba(0,0,0,0.8); + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + border-radius: 7px; +} +.board-color-clearblue .quiet, +.board-color-clearblue .quiet a { + color: rgba(0,0,0,0.4); +} +.board-color-clearblue .list-header .list-header-watch-icon { + color: rgba(0,0,0,0.5); + position: absolute; + margin-top: -34px; + margin-let: -11px; +} +.board-color-clearblue a.fa, +.board-color-clearblue a i.fa { + color: rgba(0,0,0,0.3); +} +.board-color-clearblue a:not(.disabled).is-active.fa, +.board-color-clearblue a:not(.disabled).is-active i.fa, +.board-color-clearblue a:not(.disabled):hover.fa, +.board-color-clearblue a:not(.disabled):hover i.fa { + color: rgba(0,0,0,0.6); + border-radius: 7px; +} +.board-color-clearblue input[type="email"], +.board-color-clearblue input[type="password"], +.board-color-clearblue input[type="text"] { + border: 0; + border-radius: 7px; +} +.board-color-clearblue .sidebar-shadow { + box-shadow: none; + border-left: 9px solid #00aecc; +} +.board-color-clearblue .is-open .sidebar-shadow { + box-shadow: -10px 0 8px rgba(0,0,0,0.3); +} +.board-color-clearblue .list.ui-sortable-helper { + transform: rotate(0deg); +} +.board-color-clearblue .minicard-wrapper.placeholder { + background: rgba(0,0,0,0.1); +} +.board-color-clearblue .minicard-wrapper.ui-sortable-helper { + transform: rotate(0deg); + opacity: 0.8; +} +.board-color-clearblue .list-body .open-minicard-composer { + color: rgba(0,0,0,0.3); +} +.board-color-clearblue .swinlane.ui-sortable-helper { + transform: rotate(0deg); +} +.board-color-clearblue .swimlane .swimlane-header-wrap { + background: linear-gradient(0deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.25) 100%); +} +.board-color-clearblue .swimlane-header-wrap .inlined-form { + width: 100%; +} +.board-color-clearblue .swimlane-header-wrap .list-composer { + text-align: center; + margin: 5px; +} +.board-color-clearblue .swimlane-header-wrap .list-name-input.full-line { + margin: 0; + display: inline-block; + width: 270px; +} +.board-color-clearblue .swimlane-header-wrap .edit-controls { + display: inline-block; + vertical-align: middle; +} +.board-color-clearblue .swimlane-header-wrap .primary.confirm { + margin-right: 0; +} +.board-color-clearblue .swimlane-header-wrap .fa.fa-times-thin { + margin-top: 2px; +} +.board-color-clearblue .list.ui-sortable-helper, +.board-color-clearblue .list.ui-sortable-helper .list-header.ui-sortable-handle, +.board-color-clearblue .list.ui-sortable-helper .viewer { + cursor: -webkit-grabbing; + cursor: grabbing; +} +/* + Alternate "Natural" Styling +*/ +.board-color-natural#header, +.board-color-natural.sk-spinner div, +.board-backgrounds-list .board-color-natural.background-box, +.board-list .board-color-natural a { + background-color: #596557; +} +.board-color-natural .is-selected .minicard { + border-left: 3px solid #596557; +} +.board-color-natural .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-natural button[type=submit].primary, +.board-color-natural input[type=submit].primary, +.board-color-natural .sidebar .sidebar-content .sidebar-btn { + background-color: #475146; + border-radius: 7px; +} +.board-color-natural.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-natural .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-natural .sidebar-list li a:hover { + background-color: #687666; +} +.board-color-natural#header ul li.current, +.board-color-natural#header-quick-access ul li.current { + border-bottom: 2px solid #687666; +} +.board-color-natural#header-quick-access { + background: #505b4e; + color: #fff; +} +.board-color-natural#header #header-main-bar .board-header-btn.emphasis { + background: #635765; +} +.board-color-natural#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-natural#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #594e5b; +} +.board-color-natural#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #4f4651; +} +.board-color-natural .materialCheckBox.is-checked { + border-bottom: 2px solid #596557; + border-right: 2px solid #596557; +} +.board-color-natural .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #eef0ee; +} +.board-color-natural .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #fafbfa; +} +.board-color-natural .toggle-label:after { + background-color: #475146; +} +.board-color-natural .toggle-switch:checked ~ .toggle-label { + background-color: #778875; +} +.board-color-natural .toggle-switch:checked ~ .toggle-label:after { + background-color: #475146; +} +@media screen and (max-width: 800px) { + .board-color-natural.pop-over .header { + background: #596557; + color: #fff; + } +} +.board-color-natural#header ul li.current, +.board-color-natural#header-quick-access ul li.current { + border-bottom: 4px solid #778875; +} +.board-color-natural#header-quick-access { + background-color: #2d392b; +} +.board-color-natural .ui-sortable { + background-color: #dedede; +} +.board-color-natural .swimlane .swimlane-header-wrap { + background-color: #c2c0ab; +} +/* + Alternate "Modern" Styling +*/ +.board-color-modern#header, +.board-color-modern.sk-spinner div, +.board-backgrounds-list .board-color-modern.background-box, +.board-list .board-color-modern a { + background-color: #2a80b8; +} +.board-color-modern .is-selected .minicard { + border-left: 3px solid #2a80b8; +} +.board-color-modern .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-modern button[type=submit].primary, +.board-color-modern input[type=submit].primary, +.board-color-modern .sidebar .sidebar-content .sidebar-btn { + background-color: #226693; + border-radius: 7px; +} +.board-color-modern.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-modern .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-modern .sidebar-list li a:hover { + background-color: #2f90cf; +} +.board-color-modern#header ul li.current, +.board-color-modern#header-quick-access ul li.current { + border-bottom: 2px solid #2f90cf; +} +.board-color-modern#header-quick-access { + background: #2673a6; + color: #fff; +} +.board-color-modern#header #header-main-bar .board-header-btn.emphasis { + background: #b8622a; +} +.board-color-modern#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-modern#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #a65826; +} +.board-color-modern#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #934e22; +} +.board-color-modern .materialCheckBox.is-checked { + border-bottom: 2px solid #2a80b8; + border-right: 2px solid #2a80b8; +} +.board-color-modern .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e8f3fa; +} +.board-color-modern .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8fbfd; +} +.board-color-modern .toggle-label:after { + background-color: #226693; +} +.board-color-modern .toggle-switch:checked ~ .toggle-label { + background-color: #469cd5; +} +.board-color-modern .toggle-switch:checked ~ .toggle-label:after { + background-color: #226693; +} +@media screen and (max-width: 800px) { + .board-color-modern.pop-over .header { + background: #2a80b8; + color: #fff; + } +} +.board-color-modern#header ul li.current, +.board-color-modern#header-quick-access ul li.current { + border-bottom: 4px solid #469cd5; +} +.board-color-modern body { + background: #f5f5f5; +} +.board-color-modern#header-quick-access { + padding: 10px; + font-size: 14px; + background: #333 !important; +} +.board-color-modern#header-quick-access ul { + overflow: visible; +} +.board-color-modern#header-quick-access ul li.current { + border: 0 !important; + font-weight: bold; +} +.board-color-modern#header-quick-access ul li.separator { + display: none; +} +.board-color-modern#header-quick-access ul li:nth-child(3) { + margin-right: 10px; +} +.board-color-modern#header-quick-access ul li a { + padding: 5px 10px; + border-radius: 2px; +} +.board-color-modern#header-quick-access ul li.current a { + border-radius: 2px; + background: rgba(255,255,255,0.2); +} +.board-color-modern#header #header-main-bar h1 { + font-family: Poppins; + font-weight: bold; +} +.board-color-modern#header-quick-access #header-user-bar { + position: relative; +} +.board-color-modern#header-quick-access #header-user-bar .header-user-bar-name { + margin: 5px 3px 0 0; +} +.board-color-modern section#notifications-drawer { + top: 46px; + box-shadow: 0 4px 20px rgba(0,0,0,0.1); + max-width: 100%; +} +.board-color-modern section#notifications-drawer .header { + top: 46px; + border-radius: 0 3px; + height: 21px; + background: #f7f7f7; +} +.board-color-modern .board-canvas { + background: #f5f5f5; +} +.board-color-modern .swimlane { + background: none; +} +.board-color-modern .swimlane .swimlane-header-wrap .swimlane-header { + font-family: Poppins; +} +.board-color-modern .board-list .board-list-item { + padding: 20px; +} +.board-color-modern .board-list-item-name { + font-family: Poppins; +} +.board-color-modern .list { + background: transparent; + border-left: 0; + margin: 10px 0; + padding: 0px; + border-radius: 5px; + min-width: 300px; +} +.board-color-modern .list-body .open-minicard-composer:hover { + background: none; + box-shadow: none; +} +.board-color-modern .list:first-child { + margin-left: 5px; +} +.board-color-modern .list.list-composer.js-list-composer { + transition: all 0.3s ease; + min-width: 80px; +} +.board-color-modern .open-list-composer.js-open-inlined-form:hover { + color: #222; +} +.board-color-modern .list-header { + background: none; +} +.board-color-modern .list-header .list-header-name { + font-family: Poppins; + color: #000; + font-weight: 500; +} +.board-color-modern .minicard { + padding: 15px 15px 10px; + box-shadow: 0 3px 8px rgba(0,0,0,0.05); +} +.board-color-modern .minicard-plum:hover:not(.minicard-composer), +.board-color-modern .is-selected .minicard-plum, +.board-color-modern .draggable-hover-card .minicard-plum { + background: none; +} +.board-color-modern .minicard-title { + line-height: 1.5em; +} +.board-color-modern .minicard .minicard-cover { + background-size: cover; + margin: -15px -15px 10px; + height: 100px; +} +.board-color-modern .card-label-orange { + color: #fff; +} +.board-color-modern .card-date { + font-size: 12px; + padding: 3px 5px; +} +.board-color-modern .header-title { + font-family: Poppins; + font-size: 16px; + color: #333; +} +.board-color-modern .pop-over { + box-shadow: 0 4px 20px rgba(0,0,0,0.2); + border: 0; + border-radius: 5px; +} +.board-color-modern .pop-over .header { + padding: 10px; + border-bottom: 0; + border-radius: 5px 5px 0 0; + background: #eee; +} +.board-color-modern .pop-over .header .header-title { + font-family: Poppins; + font-size: 16px; + color: #333; +} +.board-color-modern .pop-over .header .close-btn { + font-size: 20px; + top: 6px; + right: 8px; +} +.board-color-modern .pop-over .content-container .content { + padding: 5px 20px 20px; + width: 260px; +} +.board-color-modern .pop-over-list li > a { + border-radius: 5px; +} +.board-color-modern .pop-over-list li > a > i { + margin-right: 5px; +} +.board-color-modern .pop-over-list li>a .sub-name { + margin-bottom: 8px; +} +.board-color-modern .sidebar .sidebar-shadow { + box-shadow: 0 0 60px rgba(0,0,0,0.2); +} +.board-color-modern .sidebar .sidebar-content { + padding: 30px; +} +.board-color-modern .board-color-modern section#notifications-drawer { + border-radius: 5px; +} +.board-color-modern .board-color-modern section#notifications-drawer .header { + padding: 18px 16px; + border-bottom: 0; + border-radius: 5px 5px 0 0; + background: #eee; +} +.board-color-modern .board-color-modern section#notifications-drawer .header h5 { + font-family: Poppins; + font-weight: bold; +} +.board-color-modern .board-color-modern section#notifications-drawer .header .close { + font-size: 20px; + top: 14px; +} +.board-color-modern section#notifications-drawer .header .toggle-read { + top: 18px; +} +/* + Alternate "Modern Dark" Styling +*/ +.board-color-moderndark#header, +.board-color-moderndark.sk-spinner div, +.board-backgrounds-list .board-color-moderndark.background-box, +.board-list .board-color-moderndark a { + background-color: #2a2a2a; +} +.board-color-moderndark .is-selected .minicard { + border-left: 3px solid #2a2a2a; +} +.board-color-moderndark .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-moderndark button[type=submit].primary, +.board-color-moderndark input[type=submit].primary, +.board-color-moderndark .sidebar .sidebar-content .sidebar-btn { + background-color: #222; + border-radius: 7px; +} +.board-color-moderndark.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-moderndark .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-moderndark .sidebar-list li a:hover { + background-color: #3f3f3f; +} +.board-color-moderndark#header ul li.current, +.board-color-moderndark#header-quick-access ul li.current { + border-bottom: 2px solid #3f3f3f; +} +.board-color-moderndark#header-quick-access { + background: #262626; + color: #fff; +} +.board-color-moderndark#header #header-main-bar .board-header-btn.emphasis { + background: #2a2a2a; +} +.board-color-moderndark#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-moderndark#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #262626; +} +.board-color-moderndark#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #222; +} +.board-color-moderndark .materialCheckBox.is-checked { + border-bottom: 2px solid #2a2a2a; + border-right: 2px solid #2a2a2a; +} +.board-color-moderndark .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #eaeaea; +} +.board-color-moderndark .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f9f9f9; +} +.board-color-moderndark .toggle-label:after { + background-color: #222; +} +.board-color-moderndark .toggle-switch:checked ~ .toggle-label { + background-color: #555; +} +.board-color-moderndark .toggle-switch:checked ~ .toggle-label:after { + background-color: #222; +} +@media screen and (max-width: 800px) { + .board-color-moderndark.pop-over .header { + background: #2a2a2a; + color: #fff; + } +} +.board-color-moderndark#header ul li.current, +.board-color-moderndark#header-quick-access ul li.current { + border-bottom: 4px solid #555; +} +.board-color-moderndark body { + background: #2a2a2a; +} +.board-color-moderndark .board-wrapper .board-canvas .board-overlay { + opacity: 0.6; +} +.board-color-moderndark button[type=submit].primary, +.board-color-moderndark .board-color-modern input[type=submit].primary { + background-color: #777; + border-radius: 7px; +} +.board-color-moderndark .toggle-switch:checked~.toggle-label { + background-color: #f7f7f7; +} +.board-color-moderndark .toggle-label:after, +.board-color-moderndark .board-color-modern .toggle-switch:checked~.toggle-label:after { + background-color: #777 !important; +} +.board-color-moderndark button, +.board-color-moderndark input:not([type=file]), +.board-color-moderndark select, +.board-color-moderndark textarea { + border-radius: 7px; +} +.board-color-moderndark#header { + background-color: #262626; + border-bottom: 1px solid #555; + border-top: 1px solid #555; +} +.board-color-moderndark#header-quick-access, +.board-color-moderndark .background-box, +.board-color-moderndark #header { + background-color: #333; +} +.board-color-moderndark#header-quick-access { + padding: 4px; + font-size: 14px; +} +.board-color-moderndark#header-quick-access .allBoards { + padding: 5px 10px 0 10px; +} +.board-color-moderndark#header-quick-access ul.header-quick-access-list { + margin: -5px 0 -5px 0; +} +.board-color-moderndark#header #header-main-bar { + padding-top: 3px; + padding-bottom: 3px; +} +.board-color-moderndark#header-quick-access ul { + overflow: visible; +} +.board-color-moderndark#header-quick-access ul li.current { + border: 0 !important; + font-weight: bold; +} +.board-color-moderndark#header-quick-access ul li.separator { + display: none; +} +.board-color-moderndark#header-quick-access ul li:nth-child(3) { + margin-right: 10px; +} +.board-color-moderndark#header-quick-access ul li a { + padding: 5px 10px; + border-radius: 2px; +} +.board-color-moderndark#header-quick-access ul li.current a { + border-radius: 2px; + background: rgba(255,255,255,0.2); +} +.board-color-moderndark#header #header-main-bar h1 { + font-family: Poppins; + font-weight: bold; + line-height: 0.8em; + padding-top: 10px; +} +.board-color-moderndark .board-canvas { + background: #2a2a2a; +} +.board-color-moderndark .swimlane .swimlane-header-wrap { + background-color: #494949; + color: #ccc; + padding: 4px 0; +} +.board-color-moderndark .swimlane .swimlane-header-wrap .swimlane-header { + font-family: Poppins; +} +.board-color-moderndark .swimlane .swimlane-header-wrap .swimlane-header-menu { + padding: 6px; + font-size: 16px; +} +.board-color-moderndark .swimlane .swimlane-header-wrap .swimlane-header-plus-icon { + font-size: 16px; +} +.board-color-moderndark .swimlane { + background: #2a2a2a; + line-height: 18px; + max-height: 100%; +} +.board-color-moderndark .swimlane .list { + background: #666; + border-radius: 0; + border: 0px solid #666; + flex: 0 0 265px; +} +.board-color-moderndark .swimlane .list:first-child { + margin-left: 0; +} +.board-color-moderndark .swimlane .list:nth-child(even) .list-header, +.board-color-moderndark .swimlane .list:nth-child(even) .list-body { + background: #6a6a6a; +} +.board-color-moderndark .swimlane .list:nth-child(odd) .list-header, +.board-color-moderndark .swimlane .list:nth-child(odd) .list-body { + background: #555; +} +.board-color-moderndark .list-header { + background: #6a6a6a; +} +.board-color-moderndark .list-header .viewer { + padding-left: 10px; +} +.board-color-moderndark .list-header .list-header-name, +.board-color-moderndark .minicard { + line-height: 14px; + color: #eee; +} +.board-color-moderndark .list-header .list-header-menu { + padding: 10px; + top: 0; +} +.board-color-moderndark .list-header .list-header-plus-top { + color: #a6a6a6; +} +.board-color-moderndark .list-body { + scrollbar-width: thin; + scrollbar-color: #343434 #999; +} +.board-color-moderndark .list-body::-webkit-scrollbar { + width: 10px; +} +.board-color-moderndark .list-body::-webkit-scrollbar-track { + background: #343434; + border-radius: 3px; + margin: 4px 0; +} +.board-color-moderndark .list-body::-webkit-scrollbar-thumb { + background-color: #999; + border-radius: 6px; + border: 3px solid #343434; +} +.board-color-moderndark .list-body .open-minicard-composer:hover { + background: none; + box-shadow: none; + border-bottom: 0; +} +.board-color-moderndark .list-body a.open-minicard-composer, +.board-color-moderndark .list-body a.open-minicard-composer i, +.board-color-moderndark .list .list-composer .open-list-composer i { + color: #bbb; +} +.board-color-moderndark .list-body a.open-minicard-composer:hover, +.board-color-moderndark .list-body a.open-minicard-composer:hover i, +.board-color-moderndark .list .list-composer .open-list-composer:hover i { + color: #fff; + border-radius: 7px; +} +.board-color-moderndark .minicard-wrapper { + margin-bottom: 12px; +} +.board-color-moderndark .minicard { + background-color: #444; + color: #ccc; + border-radius: 2px; + font-size: 0.95em; + box-shadow: 0 4px 3px -3px rgba(0,0,0,0.8); + border-bottom: 1px solid #666; + padding: 8px; +} +.board-color-moderndark .minicard:hover { + color: #f7f7f7; + background-color: #4d4d4d !important; +} +.board-color-moderndark .minicard .minicard-labels { + margin-bottom: 4px; +} +.board-color-moderndark .minicard .card-label { + font-size: 11px; + font-weight: 400; + padding: 1px 6px 0; + border-radius: 2px; +} +.board-color-moderndark .minicard .badges { + color: #bbb; +} +.board-color-moderndark .minicard .date { + margin-top: 10px; + font-size: 11px; +} +.board-color-moderndark .card-date { + color: #444; + border-radius: 2px; +} +.board-color-moderndark .card-date.almost-due { + color: #444; +} +.board-color-moderndark .minicard.minicard-composer textarea.minicard-composer-textarea:focus { + background-color: #eee; + color: #333; + padding: 6px; +} +.board-color-moderndark .is-selected .minicard { + background-color: #666; +} +.board-color-moderndark .card-details { + background-color: #454545; + color: #ccc; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); + border: 1px solid #111; + z-index: 100 !important; +} +@media screen and (max-width: 800px) { + .board-color-moderndark .card-details { + width: 98%; + } +} +@media screen and (min-width: 801px) { + .board-color-moderndark .card-details { + position: absolute; + top: 30px; + left: calc(50% - 384px); + width: 768px; + max-height: calc(100% - 60px); + } +} +.board-color-moderndark .card-details { + scrollbar-width: thin; + scrollbar-color: #343434 #999; +} +.board-color-moderndark .card-details::-webkit-scrollbar { + width: 16px; +} +.board-color-moderndark .card-details::-webkit-scrollbar-track { + background: #343434; +} +.board-color-moderndark .card-details::-webkit-scrollbar-thumb { + background-color: #999; + border-radius: 6px; + border: 4px solid #343434; +} +.board-color-moderndark .card-details .card-details-header { + background: #333; + color: #ccc; + border-bottom: 2px solid #2d2d2d; +} +.board-color-moderndark .card-details hr { + background: #2d2d2d; +} +.board-color-moderndark .card-details .card-details-item-title { + color: #fff; +} +.board-color-moderndark .card-details .new-description textarea, +.board-color-moderndark .card-details .new-comment textarea { + background-color: #ddd; + color: #111; +} +.board-color-moderndark .card-details .checklist { + background-color: transparent; + margin-bottom: 10px; +} +.board-color-moderndark .card-details .checklist-item { + background-color: rgba(255,255,255,0.1); + padding: 4px 8px; + border-radius: 2px; + font-size: 13px; + margin-top: 5px; +} +.board-color-moderndark .card-details .checklist-item:hover { + background-color: rgba(255,255,255,0.2); +} +.board-color-moderndark .card-details .checklist-item .item-title .viewer p { + max-width: auto; +} +.board-color-moderndark .card-details .check-box.materialCheckBox { + border-color: #fff; +} +.board-color-moderndark .card-details .check-box.materialCheckBox.is-checked { + border-bottom: 2px solid #fff; + border-right: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.board-color-moderndark .card-details .js-add-checklist-item { + margin-top: 4px; +} +.board-color-moderndark .checklist-items .add-checklist-item { + margin-top: 0.7em; +} +.board-color-moderndark .card-details .activities .activity .activity-desc .activity-comment { + background-color: #ccc; + color: #222; +} +.board-color-moderndark .sidebar .sidebar-shadow { + background-color: #222; + box-shadow: -10px 0 5px -10px #444; + border-left: 1px solid #333; + color: #ccc; +} +.board-color-moderndark .activities .activity .activity-desc .activity-comment { + background-color: #ccc; + color: #222; +} +.board-color-moderndark .activities .activity .activity-desc .activity-checklist { + background-color: #ccc; + color: #222; +} +.board-color-moderndark .attachments-galery .attachment-item { + color: #222; +} +.board-color-moderndark .minicard-description { + color: #222; +} +.pop-over.board-color-moderndark { + background-color: #454545; + color: #ccc; + border: 1px solid #111; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); +} +.pop-over.board-color-moderndark .header { + background-color: #333; +} +.pop-over.board-color-moderndark .header-title { + font-family: Poppins; + font-size: 16px; + color: #ccc; +} +.pop-over.board-color-moderndark .pop-over-list li > a:hover { + background-color: rgba(255,255,255,0.2); +} +.board-color-exodark#header, +.board-color-exodark.sk-spinner div, +.board-backgrounds-list .board-color-exodark.background-box, +.board-list .board-color-exodark a { + background-color: #222; +} +.board-color-exodark .is-selected .minicard { + border-left: 3px solid #222; +} +.board-color-exodark .minicard { + border-radius: 7px; + padding: 10px 10px 4px 10px; + box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15); +} +.board-color-exodark button[type=submit].primary, +.board-color-exodark input[type=submit].primary, +.board-color-exodark .sidebar .sidebar-content .sidebar-btn { + background-color: #1b1b1b; + border-radius: 7px; +} +.board-color-exodark.pop-over .pop-over-list li a:not(.disabled):hover, +.board-color-exodark .sidebar .sidebar-content .sidebar-btn:hover, +.board-color-exodark .sidebar-list li a:hover { + background-color: #383838; +} +.board-color-exodark#header ul li.current, +.board-color-exodark#header-quick-access ul li.current { + border-bottom: 2px solid #383838; +} +.board-color-exodark#header-quick-access { + background: #1f1f1f; + color: #fff; +} +.board-color-exodark#header #header-main-bar .board-header-btn.emphasis { + background: #222; +} +.board-color-exodark#header #header-main-bar .board-header-btn.emphasis:hover, +.board-color-exodark#header #header-main-bar .board-header-btn.emphasis .board-header-btn-close { + background: #1f1f1f; +} +.board-color-exodark#header #header-main-bar .board-header-btn.emphasis:hover .board-header-btn-close { + background: #1b1b1b; +} +.board-color-exodark .materialCheckBox.is-checked { + border-bottom: 2px solid #222; + border-right: 2px solid #222; +} +.board-color-exodark .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard { + background: #e9e9e9; +} +.board-color-exodark .is-multiselection-active .multi-selection-checkbox:not(.is-checked) + .minicard:hover:not(.minicard-composer) { + background: #f8f8f8; +} +.board-color-exodark .toggle-label:after { + background-color: #1b1b1b; +} +.board-color-exodark .toggle-switch:checked ~ .toggle-label { + background-color: #4e4e4e; +} +.board-color-exodark .toggle-switch:checked ~ .toggle-label:after { + background-color: #1b1b1b; +} +@media screen and (max-width: 800px) { + .board-color-exodark.pop-over .header { + background: #222; + color: #fff; + } +} +.board-color-exodark#header ul li.current, +.board-color-exodark#header-quick-access ul li.current { + border-bottom: 4px solid #4e4e4e; +} +.board-color-exodark body { + background: #222; +} +.board-color-exodark i { + color: #00897b !important; +} +.board-color-exodark .board-canvas { + background: #222; + font-family: Poppins; +} +.board-color-exodark .swimlane { + background: #222; +} +.board-color-exodark .list { + margin: 10px; + color: #fff; + border-radius: 15px; + background: #222; + box-shadow: inset 15px 15px 37px #1c1c1c, inset -15px -15px 37px #282828; + border: none; +} +.board-color-exodark .list-header { + border-top-right-radius: 15px; + border-top-left-radius: 15px; + background: #222; + box-shadow: inset 15px 15px 37px #1c1c1c, inset -15px -15px 37px #282828; +} +.board-color-exodark .list-header-menu a { + color: #00897b !important; +} +.board-color-exodark .is-selected .minicard { + color: #fff; + background: #2b2b2b; + border: 1px solid #00897b; +} +.board-color-exodark .minicard { + color: #fff; + background: #2b2b2b; +} +.board-color-exodark .list-body .open-minicard-composer:hover { + background: #2b2b2b; + border: 1px solid #00897b; + border-radius: 10px; +} +.board-color-exodark .badges { + color: #fff; +} +.board-color-exodark .minicard textarea { + color: #fff; +} +.board-color-exodark .minicard .minicard-description { + background: #2b2b2b; + border: 1px solid #00897b; +} +.board-color-exodark .minicard:hover:not(.minicard-composer) { + border: 1px solid #00897b; + background: #2b2b2b; + padding: 9px 9px 3px 9px; /*because of the 1px border we need to reduce padding by 1px*/ +} +.board-color-exodark .card-details { + background: #2b2b2b !important; + color: #fff; +} +.board-color-exodark .card-details .card-details-header { + background: #2b2b2b; + color: #fff; +} +.board-color-exodark .sidebar-content { + background: #2b2b2b; + color: #fff; +} +.board-color-exodark .card-details, +.board-color-exodark .sidebar-content { + box-shadow: 0 0 7px 0 #00897b; +} +.board-color-exodark .attachments-galery .attachment-item { + background: #2b2b2b; +} +.board-color-exodark .attachments-galery .attachment-item:hover { + border: 1px solid #00897b; + background: #2b2b2b; +} +.board-color-exodark .checklist { + background: #2b2b2b; +} +.board-color-exodark .checklist .checklist-item { + background: #2b2b2b; +} +.board-color-exodark .checklist .checklist-item:hover { + background: #2b2b2b; +} +.board-color-exodark .add-checklist-item.js-open-inlined-form:hover { + background: #2b2b2b; + border: 1px solid #00897b; +} +.board-color-exodark .add-checklist.js-open-inlined-form:hover { + background: #2b2b2b; + border: 1px solid #00897b; +} +.board-color-exodark .card-details > h1, +.board-color-exodark h2, +.board-color-exodark h3, +.board-color-exodark h4, +.board-color-exodark h5, +.board-color-exodark h6, +.board-color-exodark p, +.board-color-exodark a, +.board-color-exodark span { + color: #fff !important; +} +.board-color-exodark .activity-desc { + background-color: #2b2b2b !important; +} +.board-color-exodark .activity-checklist { + background: #2b2b2b !important; + border: 1px solid #00897b; +} +.board-color-exodark .activity-comment { + background: #2b2b2b !important; + border: 1px solid #00897b; +} +.board-color-exodark .toggle-switch:checked ~ .toggle-label { + background-color: #00897b !important; +} +.pop-over.board-color-exodark { + background: #2b2b2b; + color: #fff; +} +.pop-over.board-color-exodark .header { + background: #2b2b2b; + color: #fff; +} diff --git a/client/components/boards/boardColors.styl b/client/components/boards/boardColors.styl deleted file mode 100644 index f1d4710b6..000000000 --- a/client/components/boards/boardColors.styl +++ /dev/null @@ -1,1232 +0,0 @@ -// We define a set of six board colors that we took from the FlatUI palette. -// http://flatuicolors.com -// -// XXX Centralizing all these properties in a single file just because their -// value is derived from the same color, doesn't make any sense. We should -// create a mixin/macro that would generate 6 versions of a given property and -// dispatch this list in the other stylus files. -setBoardColor(color) - &#header, - &.sk-spinner div, - .board-backgrounds-list &.background-box, - .board-list & a - background-color: color - - .is-selected .minicard - border-left: 3px solid color - - // All minicards rounded corners: - .minicard - border-radius: 7px - padding: 10px 10px 4px 10px - box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15) - - button[type=submit].primary, input[type=submit].primary, - .sidebar .sidebar-content .sidebar-btn - background-color: darken(color, 20%) - border-radius: 7px - - &.pop-over .pop-over-list li a:not(.disabled):hover, - .sidebar .sidebar-content .sidebar-btn:hover, - .sidebar-list li a:hover - background-color: lighten(color, 10%) - - &#header ul li.current, &#header-quick-access ul li.current - border-bottom: 2px solid lighten(color, 10%) - - &#header-quick-access - background: darken(color, 10%) - color: white - - &#header #header-main-bar .board-header-btn.emphasis - background: complement(color) - - &:hover, - .board-header-btn-close - background: darken(complement(color), 10%) - - &:hover .board-header-btn-close - background: darken(complement(color), 20%) - - .materialCheckBox.is-checked - border-bottom: 2px solid color - border-right: 2px solid color - - .is-multiselection-active .multi-selection-checkbox - &.is-checked + .minicard - background: lighten(color, 90%) - - &:not(.is-checked) + .minicard:hover:not(.minicard-composer) - background: lighten(color, 97%) - - .toggle-label - - &:after - background-color: darken(color, 20%) - - .toggle-switch:checked ~ .toggle-label - background-color: lighten(color, 20%) - - &:after - background-color: darken(color, 20%) - - @media screen and (max-width: 800px) - &.pop-over .header - background: color - color: white - - &#header ul li.current, &#header-quick-access ul li.current - border-bottom: 4px solid lighten(color, 20%) - -.board-color-nephritis - setBoardColor(#27AE60) - -.board-color-pomegranate - setBoardColor(#C0392B) - -.board-color-belize - setBoardColor(#2980B9) - -.board-color-wisteria - setBoardColor(#8E44AD) - -.board-color-midnight - setBoardColor(#2C3E50) - -.board-color-pumpkin - setBoardColor(#E67E22) - -.board-color-moderatepink - setBoardColor(#CD5A91) - -.board-color-strongcyan - setBoardColor(#00AECC) - -.board-color-limegreen - setBoardColor(#4BBF6B) - -.board-color-dark - setBoardColor(#2C3E51) - - /* Not hidden in dark mode. - card fields: received, start, due, end, members, requested, assigned - .card-details-item.card-details-item-received, - .card-details-item.card-details-item-start, - .card-details-item.card-details-item-due, - .card-details-item.card-details-item-end, - .card-details-item.card-details-item-members, - .card-details-item.card-details-item-name { display:none; } - .card-details-items:empty { display:none; } - */ - - // DARK MODE, when dark background mode selected. - // Modified version from https://github.com/wekan/wekan/wiki/Custom-CSS-themes#dark-theme - // In progress, please send pull requests to fix remaining visibility issues. - .ui-sortable, - .swimlane, - .swimlane >.swimlane-header-wrap, - .swimlane >.list.js-list, - .swimlane >.list-composer.js-list-composer, - .list-body, - .list, - .list-composer, - .sidebar-content, - .card-details - background-color:#2C3E50 - - .card-details h3, - .card-details-left p, - .card-details-items, - .card-checklist-items .ui-sortable, - .card-subtasks-items, - .activities, - .material-toggle-switch - color:#bbbbbb - - .list-header - background-color: #888888 - - .board-widget, - .board-widget-labels, - .board-widget-members - color: #aaaaaa - - /* popup menu titles (boards, swimlanes, lists, cards, labels) */ - .pop-over >.header - display:none; - - /* HIDE UNTIL HOVER -------------------------------------------------- */ - - /* header "+" button */ - #header-quick-access .fa-plus - display:none - #header-quick-access:hover .fa-plus - display:inherit - - /* "add card" links (use visibility rather than display so items don't jump) */ - .open-minicard-composer - visibility:hidden - - .list.js-list:hover .open-minicard-composer - visibility:visible - - .list-header-menu - visibility:hidden - - .list.js-list:hover .list-header-menu - visibility:visible - - /* "add list/swimlane" links (use visibility rather than display so items don't jump) */ - .list.js-list-composer >.list-header - visibility:hidden - - .list.js-list-composer:hover >.list-header - visibility:visible - - /* headers */ - #header-quick-access, #header - background-color:rgba(0,0,0,.75) !important - - #header .board-header-btn:hover - background-color:rgba(255,255,255,0.3) !important - - /* foregrounds: swimlanes, lists */ - .list >.list-header, .swimlane-header - color:rgba(255,255,255,.7) - - /* minicards - .minicard - background-color:rgba(255,255,255,.4) - */ - - .minicard-wrapper.is-selected .minicard, - .minicard:hover, - .minicard-composer.js-composer, - .open-minicard-composer:hover - background-color:rgba(255,255,255,.8) !important - color:#000 - border-radius: 7px - - /* - .minicard, .minicard .badge - color:#fff - */ - - .minicard:hover .badge, .minicard-wrapper.is-selected .badge - color:#000 - - /* cards */ - .card-details .card-details-header - background-color:#ccc - - /* sidebar */ - .sidebar-tongue, .sidebar-shadow - background-color:#666 !important - - .sidebar-content h3, .sidebar-content h2, .sidebar-content - color:rgba(255,255,255,.7) !important - - .card-details .activities .activity .activity-desc .activity-comment - background-color: #cccccc - color: #222222 - -.board-color-relax - setBoardColor(#27AE61) - - // RELAX MODE: light green background, with green background color, - // to help this theme users to relax. - // Colors and emphasis are specific to this Wekan theme contributor's company. - .ui-sortable - background-color:#a7e366 - - .list-header - background-color:#a7e366 - // border-bottom: 6px solid #a7e366 - - .list-body - background-color:#a7e366 - - .list - border-left: 1px dotted #000000 - - // Card details text emphasis: black border and white background - // to make it details text field easier to find for RELAX MODE users, - // and focus attention. - .card-details .card-details-items - & ~ .js-open-inlined-form - .viewer - background-color #ffffff !important - padding 15px !important - border 1px solid #000000 !important - word-wrap: break-word - - // When card has comment, emphasis on minicard: - // bigger red comment icon and number of comments, - // to make it easier notice card comments and focus attention. - .minicard .badges .badge - .badge-icon, - .badge-text - &.badge-comment - display: block - border-radius: 4px - padding: 1px 3px - margin-bottom: 0.3rem - color: #ff0000 - background-color: #ffffff - font-weight: bold - font-size: 11pt - -.board-color-corteza - setBoardColor(#568BA2) - - /* - Wekan for Corteza https://cortezaproject.org - - Theme to match Corteza colors from: - https://github.com/cortezaproject/corteza-webapp-messaging/blob/master/src/assets/sass/variables.scss - - // Paths - $fonts_dir : './assets/fonts/'; - $icomoon-font-path: $fonts_dir + 'icomoon' !default; - $icomoon-font-family: "icomoon" !default; - - // Typography - $regular: 'nunito_sansregular'; - $bold: 'nunito_sansbold'; - $semibold: 'nunito_sanssemibold'; - - // Color system - $white: #fff !default; - $black: #000 !default; - $primary: #568ba2; - $secondary: #90A3B1; - $success: #719430; - $warning: #F5D380; - $danger: #E85568; - $light: #F3F3F5; - $dark: #1e2224; - $currentmymessagebgcolor : #a7d0e3; - */ - - //.header-quick-access - // backgroud-color: #568ba2 - - -/* - Alternate "Clear" Styling -*/ -setBoardClear(color1,color2) - //color1: The quick access color - //color2: The main bar color - - &.sk-spinner div, - .board-backgrounds-list &.background-box, - .board-list & a - background: linear-gradient(180deg, color1 0%, color2 100%) - //background: linear-gradient(180deg, rgb(73, 155, 234) 0%, rgb(0, 174, 204) 100%) - - .is-selected .minicard - border-left: 3px solid color1 - - &.pop-over .pop-over-list li a:not(.disabled):hover, - .sidebar .sidebar-content .sidebar-btn:hover, - .sidebar-list li a:hover - background-color: lighten(color1, 10%) - - &#header ul li.current, &#header-quick-access ul li.current - border-bottom: 4px solid lighten(color2, 10%) - - &#header-quick-access - background: darken(color1, 10%) - //background: rgba(66,137,204,1) - color: #FFF - - &#header-quick-access #header-new-board-icon, - &#header-quick-access #header-user-bar, - &#header-quick-access ul li - color: rgba(255,255,255,0.5) - - // The background-color value here is not seen, - // its covered by the background of #header-main-bar - // it's just to aid transitions between boards - &#header - background-color: color2 - border-bottom: 1px solid darken(color2, 20%) - border-top: 1px solid darken(color2, 40%) - - // Since the theme uses a gradient for the header - // and gradients break transitions, it has to be set here - &#header #header-main-bar - background: linear-gradient(180deg, color1 0%, color2 100%) - - &#header #header-main-bar p - margin-bottom: 6px - - &#header #header-main-bar .board-header-btn.emphasis - background: lighten(color2, 10%) - - &:hover, - .board-header-btn-close - background: rgba(0,0,0,0.2) - - &:hover .board-header-btn-close - background: rgba(0,0,0,0.2) - - .materialCheckBox.is-checked - border-bottom: 2px solid color1 - border-right: 2px solid color1 - - .is-multiselection-active .multi-selection-checkbox - &.is-checked + .minicard - background: lighten(color2, 90%) - - &:not(.is-checked) + .minicard:hover:not(.minicard-composer) - background: lighten(color2, 97%) - - .toggle-switch:checked ~ .toggle-label - background-color: lighten(color1, 20%) - - &:after - background-color: darken(color1, 20%) - - .board-canvas - background: linear-gradient(135deg, color1 0%, color2 100%) - - .swimlane - background: none - - .list:first-child - margin-left: 15px - - .list - background: rgba(255,255,255,0.35) - margin: 10px - border: 0 - border-radius: 14px - - .list.list-composer - background: rgba(255,255,255,0.1) - height: min-content - flex: unset - width: 270px - padding-bottom: 16px - - .list.list-composer .open-list-composer - border-radius: 7px - color: rgba(0,0,0,0.3) - padding: 7px 10px - display: block - - .list.list-composer .open-list-composer:hover - box-shadow: 0 1px 2px rgba(0,0,0,.2) - background: rgba(255,255,255,0.7) - color: rgba(0,0,0,0.6) - - .list-header - background-color: rgba(255,255,255,0.25) - border-radius: 14px 14px 0 0 - - .list-header:not([class*="list-header-"]) - border-bottom: 6px solid rgba(255,255,255,0) - - .list-header .list-header-name - color: rgba(0,0,0,0.6) - - .list-body - padding: 11px - - .minicard - border-radius: 7px - padding: 10px 10px 4px 10px - box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15) - color: #222 - - .card-details - border-radius: 0 0 14px 14px - box-shadow: 0 0 7px 0 rgba(0,0,0,0.5) - margin-left: -10px - - .list-body .open-minicard-composer - border-radius: 7px - color: rgba(0,0,0,.3) - margin-bottom: 11px - - .list-body .open-minicard-composer:hover - background: rgba(255,255,255,0.7) - color: rgba(0,0,0,0.6) - - button[type=submit].primary, input[type=submit].primary - box-shadow: none - background-color: rgba(255,255,255,0.5) - color: rgba(0,0,0,0.55) - border-radius: 7px - border: 0 - - button[type="submit"].primary:hover, input[type="submit"].primary:hover - background-color: rgba(255,255,255,0.7) - color: rgba(0,0,0,0.8) - box-shadow: 0 1px 2px rgba(0,0,0,.2) - border-radius: 7px - .quiet, .quiet a - color: rgba(0,0,0,0.4) - - .list-header .list-header-watch-icon - color: rgba(0,0,0,0.5) - position: absolute - margin-top: -34px - margin-let: -11px - - a.fa, a i.fa - color: rgba(0,0,0,0.3) - - a:not(.disabled).is-active.fa, a:not(.disabled).is-active i.fa, a:not(.disabled):hover.fa, a:not(.disabled):hover i.fa - color: rgba(0,0,0,0.6) - border-radius: 7px - - input[type="email"], input[type="password"], input[type="text"] - border: 0 - border-radius: 7px - - .sidebar-shadow - box-shadow: none - border-left: 9px solid color2 - - .is-open .sidebar-shadow - box-shadow: -10px 0 8px rgba(0,0,0,0.3) - - .list.ui-sortable-helper - transform:rotate(0deg) - - .minicard-wrapper.placeholder - background: rgba(0,0,0,0.1) - - .minicard-wrapper.ui-sortable-helper - transform:rotate(0deg) - opacity: 0.8 - - .list-body .open-minicard-composer - color: rgba(0,0,0,.3) - - .swinlane.ui-sortable-helper - transform:rotate(0deg) - - .swimlane .swimlane-header-wrap - background: linear-gradient(0deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.25) 100%) - - .swimlane-header-wrap .inlined-form - width: 100% - - .swimlane-header-wrap .list-composer - text-align: center - margin: 5px - - .swimlane-header-wrap .list-name-input.full-line - margin: 0 - display: inline-block - width: 270px - - .swimlane-header-wrap .edit-controls - display: inline-block - vertical-align: middle - - .swimlane-header-wrap .primary.confirm - margin-right: 0 - - .swimlane-header-wrap .fa.fa-times-thin - margin-top: 2px - - // This is a general fix so that the little grabby hand appears when dragging the list via the title - .list.ui-sortable-helper, - .list.ui-sortable-helper .list-header.ui-sortable-handle, - .list.ui-sortable-helper .viewer - cursor:-webkit-grabbing; - cursor:grabbing - -.board-color-clearblue - setBoardClear(rgb(73, 155, 234),rgb(0, 174, 204)) - -/* - Alternate "Natural" Styling -*/ -.board-color-natural - setBoardColor(#596557) - - &#header-quick-access - background-color: #2d392b - - .ui-sortable - background-color:#dedede - - .list-header - // background-color: #c9cfc3 - // border-bottom: 6px solid #c9cfc3 - - .swimlane .swimlane-header-wrap - background-color: #c2c0ab - -/* - Alternate "Modern" Styling -*/ -.board-color-modern - setBoardColor(#2A80B8) - - /* General */ - body - background: #f5f5f5 - - &#header-quick-access - padding: 10px - font-size: 14px - background: #333 !important - - &#header-quick-access ul - overflow: visible - - &#header-quick-access ul li.current - border: 0 !important - font-weight: bold - - &#header-quick-access ul li.separator - display: none - - &#header-quick-access ul li:nth-child(3) - margin-right: 10px - - &#header-quick-access ul li a - padding: 5px 10px - border-radius: 2px - - &#header-quick-access ul li.current a - border-radius: 2px - background: rgba(255,255,255,.2) - - &#header #header-main-bar h1 - font-family: Poppins - font-weight: bold - &#header-quick-access #header-user-bar - position relative - - &#header-quick-access #header-user-bar .header-user-bar-name - margin: 5px 3px 0 0 - - section#notifications-drawer - top: 46px - box-shadow: 0 4px 20px rgba(0,0,0,.1) - max-width: 100% - - section#notifications-drawer .header - top: 46px - border-radius: 0 3px - height: 21px - background: #f7f7f7 - - .board-canvas - background: #f5f5f5 - - /* Swimlane */ - .swimlane - background: none - - .swimlane .swimlane-header-wrap .swimlane-header - font-family: Poppins - - /* All board views */ - .board-list .board-list-item - padding: 20px - - .board-list-item-name - font-family: Poppins - - /* Board */ - .list - background: transparent - border-left: 0 - margin: 10px 0 - padding: 0px - border-radius: 5px - min-width: 300px - - .list-body .open-minicard-composer:hover /*me*/ - background: none - box-shadow: none - - .list:first-child - margin-left: 5px - - .list.list-composer.js-list-composer - transition: all .3s ease - min-width: 80px - - .open-list-composer.js-open-inlined-form:hover - color: #222 - - .list-header - background: none - // border-bottom-width: 0px - - .list-header .list-header-name - font-family: Poppins - color: #000 - font-weight: 500 - - /* Card changes */ - .minicard - padding: 15px 15px 10px - box-shadow: 0 3px 8px rgba(0,0,0,.05) - - .minicard-plum:hover:not(.minicard-composer), .is-selected .minicard-plum, .draggable-hover-card .minicard-plum - background: none - - .minicard-title - line-height: 1.5em - - .minicard .minicard-cover - background-size: cover - margin: -15px -15px 10px - height: 100px - - .card-label-orange - color: #fff - - .card-date - font-size: 12px - padding: 3px 5px - - /* Pop over */ - .header-title - font-family: Poppins - font-size: 16px - color: #333 - - .pop-over - box-shadow: 0 4px 20px rgba(0,0,0,.2) - border: 0 - border-radius: 5px - - .pop-over .header - padding: 10px - border-bottom: 0 - border-radius: 5px 5px 0 0 - background:#eee - - .pop-over .header .header-title - font-family: Poppins - font-size:16px - color:#333 - - .pop-over .header .close-btn - font-size:20px - top:6px - right:8px - - .pop-over .content-container .content - padding: 5px 20px 20px - width: 260px - - .pop-over-list li > a - border-radius: 5px - - .pop-over-list li > a > i - margin-right: 5px - - .pop-over-list li>a .sub-name - margin-bottom: 8px - - /* Sidebar */ - .sidebar .sidebar-shadow - box-shadow: 0 0 60px rgba(0,0,0,.2) - - .sidebar .sidebar-content - padding: 30px - - /* Notifications */ - .board-color-modern section#notifications-drawer - border-radius:5px - - .board-color-modern section#notifications-drawer .header - padding: 18px 16px - border-bottom: 0 - border-radius: 5px 5px 0 0 - background: #eee - - .board-color-modern section#notifications-drawer .header h5 - font-family: Poppins - font-weight: bold - - .board-color-modern section#notifications-drawer .header .close - font-size: 20px - top: 14px - - section#notifications-drawer .header .toggle-read - top: 18px - -/* - Alternate "Modern Dark" Styling -*/ -.board-color-moderndark - setBoardColor(#2a2a2a) - - /* General */ - body - background: #2a2a2a - - .board-wrapper .board-canvas .board-overlay - opacity: .6 - - /* Forms */ - button[type=submit].primary, .board-color-modern input[type=submit].primary - background-color: #777777 - border-radius: 7px - - .toggle-switch:checked~.toggle-label - background-color: #f7f7f7 - - .toggle-label:after, .board-color-modern .toggle-switch:checked~.toggle-label:after - background-color: #777777 !important - - button, input:not([type=file]), select, textarea - border-radius: 7px - - /* Headers */ - &#header - background-color: #262626 - border-bottom: 1px solid #555555; - border-top: 1px solid #555555; - - &#header-quick-access, .background-box, #header - background-color: #333333 - - &#header-quick-access - padding: 4px - font-size: 14px - - &#header-quick-access .allBoards - padding: 5px 10px 0 10px; - - &#header-quick-access ul.header-quick-access-list - margin: -5px 0 -5px 0 - - &#header #header-main-bar - padding-top: 3px - padding-bottom: 3px - - &#header-quick-access ul - overflow: visible - - &#header-quick-access ul li.current - border: 0 !important - font-weight: bold - - &#header-quick-access ul li.separator - display: none - - &#header-quick-access ul li:nth-child(3) - margin-right: 10px - - &#header-quick-access ul li a - padding: 5px 10px - border-radius: 2px - - &#header-quick-access ul li.current a - border-radius: 2px - background: rgba(255,255,255,.2) - - &#header #header-main-bar h1 - font-family: Poppins - font-weight: bold - line-height: 0.8em - padding-top: 10px - - /* Content */ - .board-canvas - background: #2a2a2a - - /* Swimlanes */ - .swimlane .swimlane-header-wrap - background-color: #494949 - color: #cccccc - padding: 4px 0 - - .swimlane .swimlane-header-wrap .swimlane-header - font-family: Poppins - - .swimlane .swimlane-header-wrap .swimlane-header-menu - padding: 6px - font-size: 16px - - .swimlane .swimlane-header-wrap .swimlane-header-plus-icon - font-size: 16px - - .swimlane - background: #2a2a2a - line-height: 18px - max-height: 100% - - /* Lists */ - .swimlane .list - background: #666666 - border-radius: 0 - border: 0px solid #666666 - flex: 0 0 265px; - - .swimlane .list:first-child - margin-left: 0 - - .swimlane .list:nth-child(even) .list-header, - .swimlane .list:nth-child(even) .list-body - background: #6a6a6a - - .swimlane .list:nth-child(odd) .list-header, - .swimlane .list:nth-child(odd) .list-body - background: #555555 - - .list-header - background: #6a6a6a - - .list-header .viewer - padding-left: 10px - - .list-header .list-header-name, - .minicard - line-height: 14px - color: #eeeeee - - .list-header .list-header-menu - padding: 10px - top: 0 - - .list-header .list-header-plus-top - color: #a6a6a6 - - .list-body - scrollbar-width: thin - scrollbar-color: #343434 #999999 - - .list-body::-webkit-scrollbar - width: 10px - - .list-body::-webkit-scrollbar-track - background: #343434 - border-radius: 3px - margin: 4px 0 - - .list-body::-webkit-scrollbar-thumb - background-color: #999999 - border-radius: 6px - border: 3px solid #343434 - - .list-body .open-minicard-composer:hover - background: none - box-shadow: none - border-bottom: 0 - - .list-body a.open-minicard-composer, .list-body a.open-minicard-composer i, .list .list-composer .open-list-composer i - color: #bbbbbb - - .list-body a.open-minicard-composer:hover, .list-body a.open-minicard-composer:hover i, .list .list-composer .open-list-composer:hover i - color: #ffffff - border-radius: 7px - - /* Mini Card */ - .minicard-wrapper - margin-bottom: 12px - - .minicard - background-color: #444444 - color: #cccccc - border-radius: 2px - font-size: 0.95em - box-shadow: 0 4px 3px -3px rgba(0,0,0,0.8) - border-bottom: 1px solid #666666 - padding: 8px - - .minicard:hover - color: #f7f7f7 - background-color: #4d4d4d !important - - .minicard .minicard-labels - margin-bottom: 4px - - .minicard .card-label - font-size: 11px - font-weight: 400 - padding: 1px 6px 0 - border-radius: 2px - - .minicard .badges - color: #bbbbbb - - .minicard .date - margin-top: 10px - font-size: 11px - - .card-date - color: #444444 - border-radius: 2px - - .card-date.almost-due - color: #444444 - - .minicard.minicard-composer textarea.minicard-composer-textarea:focus - background-color: #eeeeee - color: #333333 - padding: 6px - - .is-selected .minicard - background-color: #666666 - - /* Card Details */ - .card-details - background-color: #454545 - color: #cccccc - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) - border: 1px solid #111111 - z-index: 100 !important - - @media screen and (max-width: 800px) - .card-details - width: 98% - - @media screen and (min-width: 801px) - .card-details - position: absolute - top: 30px - left: calc(50% - 384px) - width: 768px - max-height: calc(100% - 60px) - - .card-details - scrollbar-width: thin - scrollbar-color: #343434 #999999 - - .card-details::-webkit-scrollbar - width: 16px - - .card-details::-webkit-scrollbar-track - background: #343434 - - .card-details::-webkit-scrollbar-thumb - background-color: #999999 - border-radius: 6px - border: 4px solid #343434 - - .card-details .card-details-header - background: #333333 - color: #cccccc - border-bottom: 2px solid #2d2d2d - - .card-details hr - background: #2d2d2d - - .card-details .card-details-item-title - color: #ffffff - - .card-details .new-description textarea, .card-details .new-comment textarea - background-color: #dddddd - color: #111111 - - .card-details .checklist - background-color: transparent - margin-bottom: 10px - - .card-details .checklist-item - background-color: rgba(255,255,255,0.1) - padding: 4px 8px - border-radius: 2px - font-size: 13px - margin-top: 5px - - .card-details .checklist-item:hover - background-color: rgba(255,255,255,0.2) - - .card-details .checklist-item .item-title .viewer p - max-width: auto - - .card-details .check-box.materialCheckBox - border-color: #ffffff - - .card-details .check-box.materialCheckBox.is-checked - border-bottom: 2px solid #ffffff - border-right: 2px solid #ffffff - border-top: 0 - border-left: 0 - - .card-details .js-add-checklist-item - margin-top: 4px - - .checklist-items .add-checklist-item - margin-top: .7em - - .card-details .activities .activity .activity-desc .activity-comment - background-color: #cccccc - color: #222222 - - /* Sidebar */ - .sidebar .sidebar-shadow - background-color: #222222 - box-shadow: -10px 0 5px -10px #444444 - border-left: 1px solid #333333 - color: #cccccc - - .activities .activity .activity-desc - .activity-comment - background-color: #cccccc - color: #222222 - .activity-checklist - background-color: #cccccc - color: #222222; - - .attachments-galery .attachment-item - color: #222222; - - .minicard-description - color: #222222; - - /* Pop-Ups for "Modern Dark" */ -.pop-over.board-color-moderndark - background-color: #454545 - color: #cccccc - border: 1px solid #111111 - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) - -.pop-over.board-color-moderndark .header - background-color: #333333 - -.pop-over.board-color-moderndark .header-title - font-family: Poppins - font-size: 16px - color: #cccccc - -.pop-over.board-color-moderndark .pop-over-list li > a:hover - background-color: rgba(255,255,255,0.2) - - -.board-color-exodark - setBoardColor(#222222) - - body - background: #222222; - - i - color: #00897b!important; - - .board-canvas - background: #222222; - font-family: Poppins; //Maybe Lato would be great - - .swimlane - background: #222222; - - .list - margin: 10px; - color: white; - border-radius: 15px; - background: #222222; - box-shadow: inset 15px 15px 37px #1c1c1c, - inset -15px -15px 37px #282828; - border: none; - - .list-header - border-top-right-radius: 15px; - border-top-left-radius: 15px; - background: #222222; - box-shadow: inset 15px 15px 37px #1c1c1c, - inset -15px -15px 37px #282828; - - .list-header-menu - a - color: #00897b!important; - - .is-selected .minicard - color: white; - background: #2b2b2b; - border: 1px solid #00897b; - - .minicard - color: white; - background: #2b2b2b; - - .list-body - .open-minicard-composer:hover - background: #2b2b2b; - border: 1px solid #00897b; - border-radius: 10px; - - .badges - color: white; - - .minicard - textarea - color: white; - - .minicard .minicard-description - background: #2b2b2b; - border: 1px solid #00897b; - - - .minicard:hover:not(.minicard-composer) - border: 1px solid #00897b; - background: #2b2b2b; - padding: 9px 9px 3px 9px;/*because of the 1px border we need to reduce padding by 1px*/ - - .card-details - background: #2b2b2b!important; - color: white; - - .card-details .card-details-header - background: #2b2b2b; - color: white; - - .sidebar-content - background: #2b2b2b; - color: white; - - .card-details, .sidebar-content - box-shadow: 0 0 7px 0 #00897b; - - .attachments-galery .attachment-item - background: #2b2b2b - - .attachments-galery .attachment-item:hover - border: 1px solid #00897b; - background: #2b2b2b; - - .checklist - background: #2b2b2b; - .checklist-item - background: #2b2b2b; - &:hover - background: #2b2b2b; - - .add-checklist-item.js-open-inlined-form:hover - background: #2b2b2b; - border: 1px solid #00897b; - - .add-checklist.js-open-inlined-form:hover - background: #2b2b2b; - border: 1px solid #00897b; - - .card-details > h1,h2,h3,h4,h5,h6,p,a,span - color: white!important; - - .activity-desc - background-color: #2b2b2b!important; - - .activity-checklist - background: #2b2b2b!important; - border: 1px solid #00897b; - - .activity-comment - background: #2b2b2b!important; - border: 1px solid #00897b; - - .toggle-switch:checked ~ .toggle-label - background-color: #00897b!important; - -.pop-over.board-color-exodark - background: #2b2b2b; - color: white; - -.pop-over.board-color-exodark .header - background: #2b2b2b; - color: white; diff --git a/client/components/boards/boardHeader.css b/client/components/boards/boardHeader.css new file mode 100644 index 000000000..5b0ee4e48 --- /dev/null +++ b/client/components/boards/boardHeader.css @@ -0,0 +1,23 @@ +.integration-form { + padding: 5px; + border-bottom: 1px solid #ccc; +} +.flex, +.option { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; +} +.option { + -webkit-border-radius: 3px; + border-radius: 3px; + background: #fff; + text-decoration: none; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + margin-top: 5px; + padding: 5px; +} diff --git a/client/components/boards/boardHeader.styl b/client/components/boards/boardHeader.styl deleted file mode 100644 index 402b4f1ea..000000000 --- a/client/components/boards/boardHeader.styl +++ /dev/null @@ -1,22 +0,0 @@ -.integration-form - padding: 5px - border-bottom: 1px solid #ccc - -.flex - display: -webkit-box - display: -moz-box - display: -webkit-flex - display: -moz-flex - display: -ms-flexbox - display: flex - -.option - @extends .flex - -webkit-border-radius: 3px; - border-radius: 3px; - background: #fff; - text-decoration: none; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); - box-shadow: 0 1px 2px rgba(0,0,0,0.2); - margin-top: 5px; - padding: 5px; diff --git a/client/components/boards/boardsList.css b/client/components/boards/boardsList.css new file mode 100644 index 000000000..f5890f23a --- /dev/null +++ b/client/components/boards/boardsList.css @@ -0,0 +1,280 @@ +.board-list { + margin: 0 8px; +} +.board-list li { + float: left; + color: #dedede; /* li same color as background grey */ + width: 20%; + box-sizing: border-box; + position: relative; +} +.board-list li.placeholder:after { + content: ''; + display: block; + background: #ccc; + border-radius: 3px; + height: 106px; + margin: 8px; +} +.board-list li.ui-sortable-helper { + cursor: grabbing; + transform: rotate(4deg); + display: block !important; +} +.board-list li.starred .fa-star, +.board-list li.starred .fa-star-o { + opacity: 1; +} +.board-list .board-list-item { + overflow: hidden; + background-color: #999; + color: #f6f6f6; + min-height: 100px; + font-size: 16px; + line-height: 22px; + border-radius: 3px; + display: block; + font-weight: 700; + padding: 8px; + margin: 8px; + position: relative; + text-decoration: none; + word-wrap: break-word; +} +.board-list .board-list-item.template-container { + border: 4px solid #fff; +} +.board-list .board-list-item.tile { + background-size: auto; + background-repeat: repeat; +} +.board-list .board-list-item-sub-name { + color: rgba(255,255,255,0.5); + display: block; + font-size: 14px; + font-weight: 400; + line-height: 22px; +} +.board-list .board-list-item-desc { + color: #fff; + display: block; + font-size: 14px; + font-weight: 400; + line-height: 18px; +} +.board-list .js-add-board { + text-align: center; +} +.board-list .js-add-board .label { + font-weight: normal; + line-height: 56px; +} +.board-list .js-add-board :hover { + background-color: #939393; +} +.board-list .fa-star, +.board-list .fa-star-o { + bottom: 0; + font-size: 14px; + height: 18px; + line-height: 18px; + opacity: 0; + padding: 9px 9px; + position: absolute; + right: 0; + top: 0; + transition-duration: 0.15s; + transition-property: color, font-size, background; +} +.board-list .fa-circle { + bottom: 0; + font-size: 10px; + height: 10px; + line-height: 10px; + padding: 9px 9px; + position: absolute; + right: 0; + transition-duration: 0.15s; + transition-property: color, font-size, background; +} +.board-list .has-overtime-card-active { + color: #eb4646 !important; +} +.board-list .no-overtime-card-active { + color: #3cb500 !important; +} +.board-list .is-star-active { + color: #fff; +} +.board-list .fa-clone { + position: absolute; + bottom: 0; + font-size: 14px; + height: 18px; + line-height: 18px; + opacity: 0; + right: 0; + padding: 9px 9px; + transition-duration: 0.15s; + transition-property: color, font-size, background; +} +.board-list .fa-archive { + position: absolute; + bottom: 0; + font-size: 14px; + height: 18px; + line-height: 18px; + opacity: 0; + left: 0; + padding: 9px 9px; + transition-duration: 0.15s; + transition-property: color, font-size, background; +} +.board-list li:hover a:hover .fa-star, +.board-list li:hover a:hover .fa-clone, +.board-list li:hover a:hover .fa-archive, +.board-list li:hover a:hover .fa-star-o { + color: #fff; +} +.board-list li:hover a .fa-star, +.board-list li:hover a .fa-clone, +.board-list li:hover a .fa-archive, +.board-list li:hover a .fa-star-o { + color: #fff; + opacity: 0.75; +} +.board-list li:hover a .fa-star:hover, +.board-list li:hover a .fa-clone:hover, +.board-list li:hover a .fa-archive:hover, +.board-list li:hover a .fa-star-o:hover { + font-size: 18px; + opacity: 1; +} +.board-list li:hover a .fa-star.is-star-active, +.board-list li:hover a .fa-clone.is-star-active, +.board-list li:hover a .fa-archive.is-star-active, +.board-list li:hover a .fa-star-o.is-star-active { + opacity: 1; +} +.board-backgrounds-list .board-background-select { + box-sizing: border-box; + display: block; + float: left; + width: 50%; + padding-top: 12px; + position: relative; + z-index: 1; +} +.board-backgrounds-list .board-background-select:nth-child(-n + 2) { + padding-top: 0; +} +.board-backgrounds-list .board-background-select:nth-child(2n) { + padding-left: 6px; +} +.board-backgrounds-list .board-background-select:nth-child(2n+1) { + padding-right: 6px; +} +.board-backgrounds-list .board-background-select .background-box { + color: #fff; + border-radius: 3px; + background-size: cover; + display: block; + height: 74px; + position: relative; + width: 100%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} +.board-backgrounds-list .board-background-select .background-box i.fa-check { + font-size: 25px; + color: #fff; +} +@media screen and (max-width: 800px) { + .board-list { + height: 100%; + overflow: scroll; + } + .board-list li { + width: 50%; + } + .board-list .board-list-item { + overflow: hidden; + height: 8rem; + } + .board-list .board-list-item-sub-name { + position: relative; + top: -100px; + left: -100px; + } + .board-list .board-handle { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + right: 10px; + font-size: 24px; + } +} +@media screen and (max-width: 360px) { + li { + width: 100%; + } + .board-handle { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + right: 10px; + font-size: 24px; + } +} +.AllBoardTeamsOrgs { + list-style-type: none; + overflow: hidden; +} +.AllBoardTeams, +.AllBoardOrgs, +.AllBoardBtns { + float: left; +} +.js-AllBoardOrgs { + margin-left: 16px; +} +.AllBoardTeams { + margin-left: 16px; +} +.AllBoardButtonsContainer { + margin: 16px; +} +#filterBtn, +#resetBtn { + display: inline; +} +.js-board { + display: block; +} +.minicard-members { + padding: 6px 0 6px 8px; + width: 100%; + margin-bottom: 2px; + margin-left: -4px; + display: inline-block; +} +.minicard-lists { + margin: 0 auto; + max-width: 95%; + height: 100%; +} +.flex { + display: flex; +} +.flex-wrap { + flex-wrap: wrap; +} +.flex-wrap .item { + margin: 2px; + padding-right: 6px; + text-align: center; +} diff --git a/client/components/boards/boardsList.styl b/client/components/boards/boardsList.styl deleted file mode 100644 index 1af4c6293..000000000 --- a/client/components/boards/boardsList.styl +++ /dev/null @@ -1,276 +0,0 @@ -@import 'nib' - -$spaceBetweenTiles = 16px - -.board-list - margin: 0 ($spaceBetweenTiles/2) - - li - float: left - width: 20% - box-sizing: border-box - position: relative - - &.placeholder:after - content: ''; - display: block; - background: darken(white, 20%) - border-radius: 3px; - height: 106px; - margin: 8px; - - &.ui-sortable-helper - cursor: grabbing - transform: rotate(4deg) - display: block !important - - &.starred - .fa-star, - .fa-star-o - opacity: 1 - - .board-list-item - overflow: hidden; - background-color: #999 - color: #f6f6f6 - min-height: 100px - font-size: 16px - line-height: 22px - border-radius: 3px - display: block - font-weight: 700 - padding: 8px - margin: ($spaceBetweenTiles/2) - position: relative - text-decoration: none - word-wrap: break-word - - &.template-container - border: 4px solid #fff - - &.tile - background-size: auto - background-repeat: repeat - - .board-list-item-sub-name - color: rgba(255, 255, 255, .5) - display: block - font-size: 14px - font-weight: 400 - line-height: 22px - - .board-list-item-desc - color: #fff - display: block - font-size: 14px - font-weight: 400 - line-height: 18px - - .js-add-board - text-align:center - - .label - font-weight: normal - line-height: 56px - - :hover - background-color:#939393 - - .fa-star, - .fa-star-o - bottom: 0 - font-size: 14px - height: 18px - line-height: 18px - opacity: 0 - padding: 9px 9px - position: absolute - right: 0 - top: 0 - transition-duration: .15s - transition-property: color, font-size, background - - .fa-circle - bottom: 0; - font-size: 10px; - height: 10px; - line-height: 10px; - padding: 9px 9px; - position: absolute; - right: 0; - transition-duration: .15s - transition-property: color, font-size, background - - .has-overtime-card-active - color: #eb4646 !important - - .no-overtime-card-active - color: #3cb500 !important - - .is-star-active - color: white - - .fa-clone - position: absolute; - bottom: 0 - font-size: 14px - height: 18px - line-height: 18px - opacity: 0 - right: 0 - padding: 9px 9px - transition-duration: .15s - transition-property: color, font-size, background - - .fa-archive - position: absolute; - bottom: 0 - font-size: 14px - height: 18px - line-height: 18px - opacity: 0 - left: 0 - padding: 9px 9px - transition-duration: .15s - transition-property: color, font-size, background - - li:hover a - &:hover - .fa-star, - .fa-clone, - .fa-archive, - .fa-star-o - color: white - - .fa-star, - .fa-clone, - .fa-archive, - .fa-star-o - color: white - opacity: .75 - - &:hover - font-size: 18px - opacity: 1 - - &.is-star-active - opacity: 1 - -.board-backgrounds-list - - .board-background-select - box-sizing: border-box - display: block - float: left - width: 50% - padding-top: 12px - position: relative - z-index: 1 - - &:nth-child(-n + 2) - padding-top: 0 - - &:nth-child(2n) - padding-left: 6px - - &:nth-child(2n+1) - padding-right: 6px - - .background-box - color: white - border-radius: 3px - background-size: cover - display: block - height: 74px - position: relative - width: 100% - cursor: pointer - display: flex - align-items: center - justify-content: center - - i.fa-check - font-size: 25px - color: white - -@media screen and (max-width: 800px) - .board-list - height: 100% - overflow: scroll - - li - width: 50% - - .board-list-item - overflow: hidden - height: 8rem - - .board-list-item-sub-name - position: relative - top: -100px - left: -100px - - .board-handle - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - right: 10px - font-size: 24px - -@media screen and (max-width: 360px) - li - width: 100% - - .board-handle - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - right: 10px - font-size: 24px - -.AllBoardTeamsOrgs - list-style-type: none; - overflow: hidden; - -.AllBoardTeams,.AllBoardOrgs,.AllBoardBtns - float: left; - -.js-AllBoardOrgs - margin-left: 16px; - -.AllBoardTeams - margin-left : 16px; - -.AllBoardButtonsContainer - margin: 16px; - -#filterBtn,#resetBtn - display: inline; - -.js-board - display: block; - -.minicard-members - padding: 6px 0 6px 8px - width: 100% - margin-bottom: 2px - margin-left: -4px - display: inline-block - -.minicard-lists - margin: 0 auto - max-width: 95% - height: 100% - -.flex - display: flex - -.flex-wrap - flex-wrap: wrap - - .item - margin: 2px; - padding-right: 6px - text-align: center diff --git a/client/components/cards/attachments.css b/client/components/cards/attachments.css new file mode 100644 index 000000000..67aeed96f --- /dev/null +++ b/client/components/cards/attachments.css @@ -0,0 +1,81 @@ +.attachments-galery { + display: flex; + flex-wrap: wrap; +} +.attachments-galery .attachment-item { + width: 31.33%; + margin: 10px 1% 0; + text-align: center; + border-radius: 3px; + overflow: auto; + background: #ededed; + min-height: 120px; +} +.attachments-galery .attachment-item:hover { + background: #e0e0e0; +} +.attachments-galery .attachment-item.add-attachment { + display: flex; + align-items: center; +} +.attachments-galery .attachment-item.add-attachment a { + display: block; + margin: auto; +} +.attachments-galery .attachment-item .attachment-thumbnail { + height: 80px; + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.attachments-galery .attachment-item .attachment-thumbnail .attachment-thumbnail-img { + max-height: 100%; + max-width: 100%; +} +.attachments-galery .attachment-item .attachment-thumbnail .attachment-thumbnail-ext { + text-transform: uppercase; + font-size: 1.6em; +} +.attachments-galery .attachment-item .attachment-details { + font-size: 0.75em; + margin: 3px; +} +.attachments-galery .attachment-item .attachment-details .attachment-details-actions a { + display: block; +} +.attachments-galery .attachment-item .attachment-details .attachment-details-actions a.attachment-details-menu { + padding-top: 10px; +} +.attachment-image-preview { + max-width: 100px; + display: block; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} +.preview-clipboard-image { + width: 280px; + max-width: 100%; + height: 200px; + display: block; + border: 1px solid #000; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} +@media screen and (max-width: 800px) { + .attachments-galery .attachment-item { + width: 48%; + } + .attachments-galery .attachment-item .attachment-thumbnail { + height: 130px; + } + .attachments-galery .attachment-item .attachment-details { + font-size: 1.1em; + } +} +@media screen and (max-width: 360px) { + .attachments-galery .attachment-item { + width: 100%; + } + .attachments-galery .attachment-item .attachment-thumbnail { + height: 200px; + } +} diff --git a/client/components/cards/attachments.styl b/client/components/cards/attachments.styl deleted file mode 100644 index 02566b850..000000000 --- a/client/components/cards/attachments.styl +++ /dev/null @@ -1,83 +0,0 @@ -@import 'nib' - -.attachments-galery - display: flex - flex-wrap: wrap - - .attachment-item - width: 33.33% - 2% - margin: 10px 1% 0 - text-align: center - border-radius: 3px - overflow: auto - background: darken(white, 7%) - min-height: 120px - - &:hover - background: darken(white, 12%) - - &.add-attachment - display: flex - align-items: center - - a - display: block - margin: auto - - .attachment-thumbnail - height: 80px - display: flex - align-items: center - justify-content: center - position: relative - - .attachment-thumbnail-img - max-height: 100% - max-width: 100% - - .attachment-thumbnail-ext - text-transform: uppercase - font-size: 1.6em - - .attachment-details - font-size: 0.75em - margin: 3px - - .attachment-details-actions a - display: block - - &.attachment-details-menu - padding-top: 10px - -.attachment-image-preview - max-width: 100px - display: block - box-shadow: 0 1px 2px rgba(0,0,0,.2) - -.preview-clipboard-image - width: 280px - max-width: 100%; - height: 200px - display: block - border: 1px solid black - box-shadow: 0 1px 2px rgba(0,0,0,.2) - -@media screen and (max-width: 800px) - .attachments-galery - flex-direction - row - .attachment-item - width: 50% - 2% - - .attachment-thumbnail - height: 130px - .attachment-details - font-size: 1.1em - -@media screen and (max-width: 360px) - .attachments-galery - .attachment-item - width: 100% - - .attachment-thumbnail - height: 200px diff --git a/client/components/cards/cardDate.css b/client/components/cards/cardDate.css new file mode 100644 index 000000000..30bc0d3af --- /dev/null +++ b/client/components/cards/cardDate.css @@ -0,0 +1,67 @@ +.card-date { + display: block; + border-radius: 4px; + padding: 1px 3px; + background-color: #dbdbdb; +} +.card-date:hover, +.card-date.is-active { + background-color: #b3b3b3; +} +.card-date.current, +.card-date.almost-due, +.card-date.due, +.card-date.long-overdue { + color: #fff; +} +.card-date.current { + background-color: #5ba639; +} +.card-date.current:hover, +.card-date.current.is-active { + background-color: #46802c; +} +.card-date.almost-due { + background-color: #edc909; +} +.card-date.almost-due:hover, +.card-date.almost-due.is-active { + background-color: #bc9f07; +} +.card-date.due { + background-color: #fa3f00; +} +.card-date.due:hover, +.card-date.due.is-active { + background-color: #c73200; +} +.card-date.long-overdue { + background-color: #fd5d47; +} +.card-date.long-overdue:hover, +.card-date.long-overdue.is-active { + background-color: #fd3e24; +} +.card-date.end-date time::before { + content: "\f253"; +} +.card-date.due-date time::before { + content: "\f090"; +} +.card-date.start-date time::before { + content: "\f251"; +} +.card-date.received-date time::before { + content: "\f08b"; +} +.card-date time::before { + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + -webkit-font-smoothing: antialiased; + margin-right: 0.3em; +} +.customfield-date { + display: block; + border-radius: 4px; + padding: 1px 3px; +} diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl deleted file mode 100644 index 617d11bb6..000000000 --- a/client/components/cards/cardDate.styl +++ /dev/null @@ -1,63 +0,0 @@ -.card-date - display: block - border-radius: 4px - padding: 1px 3px - - background-color: #dbdbdb - &:hover, &.is-active - background-color: #b3b3b3 - - &.current, &.almost-due, &.due, &.long-overdue - color: #fff - - &.current - background-color: #5ba639 - &:hover, &.is-active - background-color: darken(#5ba639, 10) - - &.almost-due - background-color: #edc909 - &:hover, &.is-active - background-color: darken(#edc909, 10) - - &.due - background-color: #fa3f00 - &:hover, &.is-active - background-color: darken(#fa3f00, 10) - - &.long-overdue - background-color: #fd5d47 - &:hover, &.is-active - background-color: darken(#fd5d47, 7) - - &.end-date - time - &::before - content: "\f253" // symbol: fa-hourglass-end - - &.due-date - time - &::before - content: "\f090" // symbol: fa-sign-in - - &.start-date - time - &::before - content: "\f251" // symbol: fa-hourglass-start - - &.received-date - time - &::before - content: "\f08b" // symbol: fa-sign-out - - time - &::before - font: normal normal normal 14px/1 FontAwesome - font-size: inherit - -webkit-font-smoothing: antialiased - margin-right: 0.3em - -.customfield-date - display: block - border-radius: 4px - padding: 1px 3px diff --git a/client/components/cards/cardDescription.css b/client/components/cards/cardDescription.css new file mode 100644 index 000000000..b65e6b65a --- /dev/null +++ b/client/components/cards/cardDescription.css @@ -0,0 +1,56 @@ +.new-description { + position: relative; + margin: 0 0 20px 0; +} +.new-description.is-open .helper { + display: inline-block; +} +.new-description.is-open textarea { + min-height: 100px; + color: #4d4d4d; + cursor: auto; + overflow: hidden; + word-wrap: break-word; +} +.new-description .too-long { + margin-top: 8px; +} +.new-description textarea { + background-color: #fff; + border: 0; + box-shadow: 0 1px 2px rgba(0,0,0,0.23); + height: 36px; + margin: 4px 4px 6px 0; + padding: 9px 11px; + width: 100%; +} +.new-description textarea:hover, +.new-description textarea:is-open { + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,0.33); + border: 0; + cursor: pointer; +} +.new-description textarea:is-open { + cursor: auto; +} +.description-item { + background-color: #fff; + border: 0; + box-shadow: 0 1px 2px rgba(0,0,0,0.23); + color: #8c8c8c; + height: 36px; + margin: 4px 4px 6px 0; + width: 92%; +} +.description-item:hover { + background: #e0e0e0; +} +.description-item.add-description { + display: flex; + margin: 5px; +} +.description-item.add-description a { + display: block; + margin: auto; +} diff --git a/client/components/cards/cardDescription.styl b/client/components/cards/cardDescription.styl deleted file mode 100644 index fb4cbf23d..000000000 --- a/client/components/cards/cardDescription.styl +++ /dev/null @@ -1,59 +0,0 @@ -@import 'nib' - -.new-description - position: relative - margin: 0 0 20px 0 - - - &.is-open - .helper - display: inline-block - - textarea - min-height: 100px - color: #4d4d4d - cursor: auto - overflow: hidden - word-wrap: break-word - - .too-long - margin-top: 8px - - textarea - background-color: #fff - border: 0 - box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - height: 36px - margin: 4px 4px 6px 0 - padding: 9px 11px - width: 100% - - &:hover, - &:is-open - background-color: #fff - box-shadow: 0 1px 3px rgba(0, 0, 0, .33) - border: 0 - cursor: pointer - - &:is-open - cursor: auto - -.description-item - background-color: #fff - border: 0 - box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - color: #8c8c8c - height: 36px - margin: 4px 4px 6px 0 - width: 92% - - &:hover - background: darken(white, 12%) - - &.add-description - display: flex - margin: 5px - - a - display: block - margin: auto diff --git a/client/components/cards/cardDetails.css b/client/components/cards/cardDetails.css new file mode 100644 index 000000000..45c39929d --- /dev/null +++ b/client/components/cards/cardDetails.css @@ -0,0 +1,588 @@ +.assignee { + border-radius: 3px; + display: block; + position: relative; + float: left; + height: 30px; + width: 30px; + margin: 0 4px 4px 0; + cursor: pointer; + user-select: none; + z-index: 1; + text-decoration: none; + border-radius: 50%; +} +.assignee .avatar { + overflow: hidden; + border-radius: 50%; +} +.assignee .avatar.avatar-assignee-initials { + height: 70%; + width: 70%; + padding: 15%; + background-color: #dbdbdb; + color: #444; + position: absolute; +} +.assignee .avatar.avatar-image { + object-fit: cover; + object-position: center; + height: 100%; + width: 100%; +} +.assignee .assignee-presence-status { + background-color: #b3b3b3; + border: 1px solid #fff; + border-radius: 50%; + height: 7px; + width: 7px; + position: absolute; + right: -1px; + bottom: -1px; + border: 1px solid #fff; + z-index: 15; +} +.assignee .assignee-presence-status.active { + background: #64c464; + border-color: #daf1da; +} +.assignee .assignee-presence-status.idle { + background: #e4e467; + border-color: #f7f7d4; +} +.assignee .assignee-presence-status.disconnected { + background: #bdbdbd; + border-color: #ededed; +} +.assignee .assignee-presence-status.pending { + background: #e44242; + border-color: #f1dada; +} +.assignee.add-assignee { + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0 0 2px #bfbfbf inset; +} +.assignee.add-assignee:hover, +.assignee.add-assignee.is-active { + box-shadow: 0 0 0 2px #666 inset; +} +.copied-tooltip { + display: none; + padding: 0px 10px; + background-color: rgba(0,0,0,0.875); + color: #fff; + border-radius: 5px; +} +.card-details { + padding: 0; + flex-shrink: 0; + flex-basis: 600px; + will-change: flex-basis; + overflow-y: scroll; + overflow-x: hidden; + background: #f7f7f7; + border-radius: bottom 3px; + z-index: 20; + animation: flexGrowIn 0.1s; + box-shadow: 0 0 7px 0 #b3b3b3; + transition: flex-basis 0.1s; + box-sizing: border-box; +} +.card-details .mCustomScrollBox { + padding-left: 0; +} +.card-details .card-details-canvas { + width: auto; + padding: 0 20px; +} +.card-details .card-details-header { + margin: 0 -20px 5px; + padding: 7px 20px; + background: #ededed; + border-bottom: 1px solid #dbdbdb; + position: sticky; + top: 0px; + z-index: 500; +} +.card-details .card-details-header .card-number { + color: #b3b3b3; + display: inline-block; + margin-right: 5px; +} +.card-details .card-details-header .close-card-details, +.card-details .card-details-header .maximize-card-details, +.card-details .card-details-header .minimize-card-details, +.card-details .card-details-header .card-details-menu, +.card-details .card-details-header .card-copy-button, +.card-details .card-details-header .card-copy-mobile-button, +.card-details .card-details-header .close-card-details-mobile-web, +.card-details .card-details-header .card-details-menu-mobile-web, +.card-details .card-details-header .copied-tooltip { + float: right; +} +.card-details .card-details-header .close-card-details, +.card-details .card-details-header .maximize-card-details, +.card-details .card-details-header .minimize-card-details { + font-size: 24px; + padding: 5px 10px 5px 10px; + margin-right: -8px; +} +.card-details .card-details-header .close-card-details-mobile-web { + font-size: 24px; + padding: 5px; + margin-right: 40px; +} +.card-details .card-details-header .card-copy-button { + font-size: 17px; + padding: 10px; + margin-right: 10px; +} +.card-details .card-details-header .card-copy-mobile-button { + font-size: 17px; + padding: 10px; + margin-right: 10px; +} +.card-details .card-details-header .card-details-menu { + font-size: 17px; + padding: 10px; +} +.card-details .card-details-header .card-details-menu-mobile-web { + font-size: 17px; + padding: 10px; + margin-right: 30px; +} +.card-details .card-details-header .card-details-watch { + font-size: 17px; + padding-left: 7px; + color: #a6a6a6; +} +.card-details .card-details-header .card-details-title { + font-weight: bold; + font-size: 1.33em; + margin: 7px 0 0; + padding: 0; +} +.card-details .card-details-header .linked-card-location { + font-style: italic; + font-size: 1em; + margin-bottom: 0; +} +.card-details .card-details-header .linked-card-location p { + margin-bottom: 0; +} +.card-details .card-details-header form.inlined-form { + margin-top: 5px; + margin-bottom: 10px; +} +.card-details .card-details-header form.inlined-form .copied-tooltip { + padding: 0px 10px; +} +.card-details .card-details-header .card-details-list { + font-size: 0.85em; + margin-bottom: 3px; +} +.card-details .card-details-header .card-details-list a.card-details-list-title { + font-weight: bold; +} +.card-details .card-details-header .card-details-list a.card-details-list-title.is-editable { + display: inline-block; + background: #e6e6e6; + border-radius: 3px; + padding: 0px 5px; +} +.card-details .card-details-header .copied-tooltip { + margin-right: 10px; + padding: 10px; +} +.card-details .card-description textarea { + min-height: 100px; +} +.card-details .card-details-items { + display: flex; + flex-wrap: wrap; + margin: 15px 0; +} +.card-details .card-details-items .card-details-item { + margin-right: 0.5em; + flex-grow: 1; +} +.card-details .card-details-items .card-details-item:last-child { + margin-right: 0; +} +.card-details .card-details-items .card-details-item.card-details-item-labels { + display: block; + word-wrap: break-word; + max-width: 95%; +} +.card-details .card-details-items .card-details-item.card-details-item-members, +.card-details .card-details-items .card-details-item.card-details-item-assignees, +.card-details .card-details-items .card-details-item.card-details-item-customfield, +.card-details .card-details-items .card-details-item.card-details-item-name { + display: block; + word-wrap: break-word; + max-width: 36%; +} +.card-details .card-details-items .card-details-item.card-details-item-creator, +.card-details .card-details-items .card-details-item.card-details-item-received, +.card-details .card-details-items .card-details-item.card-details-item-start, +.card-details .card-details-items .card-details-item.card-details-item-due, +.card-details .card-details-items .card-details-item.card-details-item-end { + display: block; + word-wrap: break-word; + max-width: 28%; +} +.card-details .card-details-items .card-details-item.custom-fields { + padding-left: 10px; +} +.card-details .card-details-item-title { + font-size: 16px; + font-weight: bold; + color: #4d4d4d; +} +.card-details .activities { + padding-top: 10px; +} +@media screen and (min-width: 801px) { + .card-details-maximized { + padding: 0; + flex-shrink: 0; + flex-basis: calc(100% - 20px); + will-change: flex-basis; + overflow-y: scroll; + overflow-x: scroll; + background: #f7f7f7; + border-radius: bottom 3px; + z-index: 100; + animation: flexGrowIn 0.1s; + box-shadow: 0 0 7px 0 #b3b3b3; + transition: flex-basis 0.1s; + box-sizing: border-box; + position: absolute; + top: 0; + left: 0; + height: calc(100% - 20px); + width: calc(100% - 20px); + float: left; + } + .card-details-maximized .card-details-left { + float: left; + top: 60px; + left: 20px; + width: 47%; + border-right: solid 2px #dbdbdb; + padding-right: 10px; + } + .card-details-maximized .card-details-right { + position: absolute; + float: right; + left: 50%; + margin: 15px 0; + } + .card-details-maximized .card-details-header { + width: 100%; + } +} +input[type="text"].attachment-add-link-input { + float: left; + margin: 0 0 8px; + width: 80%; +} +input[type="submit"].attachment-add-link-submit { + float: left; + margin: 0 0 8px 4px; + padding: 6px 12px; + width: 18%; +} +@media screen and (max-width: 800px) { + .card-details { + width: calc(100% - 1px); + padding: 0px 20px 0px 20px; + margin: 0px; + transition: none; + overflow-y: revert; + overflow-x: revert; + } + .card-details .card-details-canvas { + width: 100%; + padding-left: 0px; + } + .card-details .card-details-header .close-card-details { + margin-right: 0px; + } + .card-details .card-details-header .card-details-menu { + margin-right: 40px; + } + .card-details .card-details-header .maximize-card-details { + margin-right: 40px; + } + .card-details .card-details-header .minimize-card-details { + margin-right: 40px; + } + .card-details-popup { + padding: 0px 10px; + } + .pop-over > .content-wrapper > .popup-container-depth-0 { + width: 100%; + } + .pop-over > .content-wrapper > .popup-container-depth-0 > .content { + width: calc(100% - 10px); + } + .pop-over > .content-wrapper > .popup-container-depth-0 > .content > .card-details-popup hr { + margin: 15px 0px; + } + .pop-over > .content-wrapper > .popup-container-depth-0 .card-details-header { + margin: 0; + } +} +.card-details-white { + background: unset !important; + color: #000 !important; + border: 1px solid #eee; +} +.card-details-green { + background: #3cb500 !important; + color: #fff !important; +} +.card-details-yellow { + background: #fad900 !important; + color: #000 !important; +} +.card-details-orange { + background: #ff9f19 !important; + color: #000 !important; +} +.card-details-red { + background: #eb4646 !important; + color: #fff !important; +} +.card-details-purple { + background: #a632db !important; + color: #fff !important; +} +.card-details-blue { + background: #0079bf !important; + color: #fff !important; +} +.card-details-pink { + background: #ff78cb !important; + color: #000 !important; +} +.card-details-sky { + background: #00c2e0 !important; + color: #fff !important; +} +.card-details-black { + background: #4d4d4d !important; + color: #fff !important; +} +.card-details-lime { + background: #51e898 !important; + color: #000 !important; +} +.card-details-silver { + background: #c0c0c0 !important; + color: #000 !important; +} +.card-details-peachpuff { + background: #ffdab9 !important; + color: #000 !important; +} +.card-details-crimson { + background: #dc143c !important; + color: #fff !important; +} +.card-details-plum { + background: #dda0dd !important; + color: #000 !important; +} +.card-details-darkgreen { + background: #006400 !important; + color: #fff !important; +} +.card-details-slateblue { + background: #6a5acd !important; + color: #fff !important; +} +.card-details-magenta { + background: #f0f !important; + color: #fff !important; +} +.card-details-gold { + background: #ffd700 !important; + color: #000 !important; +} +.card-details-navy { + background: #000080 !important; + color: #fff !important; +} +.card-details-gray { + background: #808080 !important; + color: #fff !important; +} +.card-details-saddlebrown { + background: #8b4513 !important; + color: #fff !important; +} +.card-details-paleturquoise { + background: #afeeee !important; + color: #000 !important; +} +.card-details-mistyrose { + background: #ffe4e1 !important; + color: #000 !important; +} +.card-details-indigo { + background: #4b0082 !important; + color: #fff !important; +} +.voted { + opacity: 0.7; +} +.vote-title { + display: flex; + justify-content: space-between; +} +.vote-title .js-edit-date { + align-self: baseline; + margin-left: 5px; +} +.vote-result { + display: flex; +} +.js-show-positive-votes { + cursor: pointer; +} +.poker-voted { + opacity: 0.7; +} +.poker-title { + display: flex; + justify-content: space-between; +} +.poker-title .js-edit-date { + align-self: baseline; + margin-left: 5px; +} +.poker-result { + display: flex; + flex-flow: row wrap; +} +.js-show-positive-poker-votes { + cursor: pointer; +} +.poker-deck { + display: grid; + flex-direction: column; + text-align: center; +} +.poker-card-result { + width: 32px; + font-size: 1em; + font-weight: bold; + padding: 4px 2px 4px 2px; + cursor: default; +} +.winner { + font-weight: bold; + outline: #2d2d2d solid 2px; +} +.loser { + opacity: 0.5; +} +.responsive-table { + overflow-x: auto; +} +.poker-table { + display: table; + width: 100%; + padding-top: 10px; +} +.poker-table-row { + display: table-row; +} +.poker-table-heading { + background-color: #eee; + display: table-header-group; +} +.poker-table-cell { + display: table-cell; + padding: 0 0 5px 2px; + border-bottom: 1px solid #d2d0d0; + text-align: center; + min-width: 45px; +} +.poker-table-cell-who { + width: 150px; + vertical-align: middle; +} +.poker-table-heading-left, +.poker-table-heading-right { + display: table-header-group; + font-weight: bold; + border-top: 1px solid #808080; +} +@media (max-width: 400px) { + .poker-table-heading-right { + display: none; + } +} +.poker-table-body { + display: table-row-group; +} +.poker-table-side-left, +.poker-table-side-right { + display: inline-block; +} +.poker-table-side-right { + padding-left: 10px; +} +@media (max-width: 400px) { + .poker-table-side-right { + padding-left: 0px; + } +} +.estimation-add { + display: block; + overflow: auto; + margin-top: 15px; + margin-bottom: 5px; +} +.estimation-add input { + display: inline-block; + float: right; + margin: auto; + margin-right: 10px; + width: 100px; +} +.estimation-add button { + display: inline-block; + float: right; + margin: auto; +} +.poker-card { + width: 48px; + height: 72px; + float: left; + background: #fff; + border-radius: 5px; + display: table; + box-sizing: border-box; + padding: 5px; + margin: 3px; + font-size: 20px; + font-weight: bold; + text-shadow: #2d2d2d 1px 1px 0; + box-shadow: 0 0 5px #aaa; + text-align: center; + position: relative; + cursor: pointer; +} +.poker-card .inner { + display: table-cell; + vertical-align: middle; + border-radius: 5px; + overflow: hidden; + background-color: #cecece; +} diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl deleted file mode 100644 index acbee01b0..000000000 --- a/client/components/cards/cardDetails.styl +++ /dev/null @@ -1,564 +0,0 @@ -@import 'nib' - -// Assignee, code copied from wekan/client/users/userAvatar.styl - -avatar-radius = 50% - -.assignee - border-radius: 3px - display: block - position: relative - float: left - height: 30px - width: @height - margin: 0 4px 4px 0 - cursor: pointer - user-select: none - z-index: 1 - text-decoration: none - border-radius: avatar-radius - - .avatar - overflow: hidden - border-radius: avatar-radius - - &.avatar-assignee-initials - height: 70% - width: @height - padding: 15% - background-color: #dbdbdb - color: #444444 - position: absolute - - &.avatar-image - object-fit: cover; - object-position: center; - height: 100% - width: @height - - .assignee-presence-status - background-color: #b3b3b3 - border: 1px solid #fff - border-radius: 50% - height: 7px - width: @height - position: absolute - right: -1px - bottom: -1px - border: 1px solid white - z-index: 15 - - &.active - background: #64c464 - border-color: #daf1da - - &.idle - background: #e4e467 - border-color: #f7f7d4 - - &.disconnected - background: #bdbdbd - border-color: #ededed - - &.pending - background: #e44242 - border-color: #f1dada - - - - &.add-assignee - display: flex - align-items: center - justify-content: center - box-shadow: 0 0 0 2px darken(white, 25%) inset - - &:hover, &.is-active - box-shadow: 0 0 0 2px darken(white, 60%) inset - -// Other card details -.copied-tooltip - display: none - padding: 0px 10px; - background-color: #000000df; - color: #fff; - border-radius: 5px; - -.card-details - padding: 0 - flex-shrink: 0 - flex-basis: 600px - will-change: flex-basis - overflow-y: scroll - overflow-x: hidden - background: darken(white, 3%) - border-radius: bottom 3px - z-index: 20 - animation: flexGrowIn 0.1s - box-shadow: 0 0 7px 0 darken(white, 30%) - transition: flex-basis 0.1s - box-sizing: border-box - - .mCustomScrollBox - padding-left: 0 - - .card-details-canvas - width: auto - padding: 0 20px - - .card-details-header - margin: 0 -20px 5px - padding: 7px 20px - background: darken(white, 7%) - border-bottom: 1px solid darken(white, 14%) - position: sticky - top: 0px - z-index: 500 - - .card-number { - color: darken(white, 30%); - display: inline-block; - margin-right: 5px; - } - - .close-card-details, - .maximize-card-details, - .minimize-card-details, - .card-details-menu, - .card-copy-button, - .card-copy-mobile-button, - .close-card-details-mobile-web, - .card-details-menu-mobile-web, - .copied-tooltip - float: right - - .close-card-details, - .maximize-card-details, - .minimize-card-details - font-size: 24px - padding: 5px 10px 5px 10px - margin-right: -8px - - .close-card-details-mobile-web - font-size: 24px - padding: 5px - margin-right: 40px - - .card-copy-button - font-size: 17px - padding: 10px - margin-right: 10px - - .card-copy-mobile-button - font-size: 17px - padding: 10px - margin-right: 10px - - .card-details-menu - font-size: 17px - padding: 10px - - .card-details-menu-mobile-web - font-size: 17px - padding: 10px - margin-right: 30px - - .card-details-watch - font-size: 17px - padding-left: 7px - color: #a6a6a6 - - .card-details-title - font-weight: bold - font-size: 1.33em - margin: 7px 0 0 - padding: 0 - - .linked-card-location - font-style: italic - font-size: 1em - margin-bottom: 0 - & p - margin-bottom: 0 - - form.inlined-form - margin-top: 5px - margin-bottom: 10px - - .copied-tooltip - padding: 0px 10px - - .card-details-list - font-size: 0.85em - margin-bottom: 3px - - a.card-details-list-title - font-weight: bold - - &.is-editable - display: inline-block - background: darken(white, 10%) - border-radius: 3px - padding: 0px 5px - - .copied-tooltip - margin-right: 10px - padding: 10px; - - .card-description textarea - min-height: 100px - - .card-details-items - display: flex - flex-wrap: wrap - margin: 15px 0 - - .card-details-item - margin-right: 0.5em - flex-grow: 1 - &:last-child - margin-right: 0 - &.card-details-item-labels - display: block - word-wrap: break-word - max-width: 95% - &.card-details-item-members, - &.card-details-item-assignees, - &.card-details-item-customfield, - &.card-details-item-name - display: block - word-wrap: break-word - max-width: 36% - &.card-details-item-creator, - &.card-details-item-received, - &.card-details-item-start, - &.card-details-item-due, - &.card-details-item-end - display: block - word-wrap: break-word - max-width: 28% - &.custom-fields - padding-left: 10px - - - .card-details-item-title - font-size: 16px - font-weight: bold - color: #4d4d4d - - .activities - padding-top: 10px - -@media screen and (min-width: 801px) - .card-details-maximized - padding: 0 - flex-shrink: 0 - flex-basis: calc(100% - 20px) - will-change: flex-basis - overflow-y: scroll - overflow-x: scroll - background: darken(white, 3%) - border-radius: bottom 3px - z-index: 100 - animation: flexGrowIn 0.1s - box-shadow: 0 0 7px 0 darken(white, 30%) - transition: flex-basis 0.1s - box-sizing: border-box - position: absolute - top: 0 - left: 0 - height: calc(100% - 20px) - width: calc(100% - 20px) - float: left - - .card-details-left - float: left - top: 60px - left: 20px - width: 47% - border-right: solid 2px #dbdbdb - padding-right: 10px - - .card-details-right - position: absolute - float: right - left: 50% - margin: 15px 0 - - .card-details-header - width: 100% - -input[type="text"].attachment-add-link-input - float: left - margin: 0 0 8px - width: 80% - -input[type="submit"].attachment-add-link-submit - float: left - margin: 0 0 8px 4px - padding: 6px 12px - width: 18% - -@media screen and (max-width: 800px) - .card-details - width: calc(100% - 1px) - padding: 0px 20px 0px 20px - margin: 0px - transition: none - overflow-y: revert - overflow-x: revert - - .card-details-canvas - width: 100% - padding-left: 0px - - .card-details-header - .close-card-details - margin-right: 0px - - .card-details-menu - margin-right: 40px - - .maximize-card-details - margin-right: 40px - - .minimize-card-details - margin-right: 40px - - .card-details-popup - padding: 0px 10px - - .pop-over > .content-wrapper > .popup-container-depth-0 - width: 100% - - & > .content - width: calc(100% - 10px) - - & > .content > .card-details-popup hr - margin: 15px 0px - - .card-details-header - margin: 0 - -card-details-color(background, color...) - background: background !important - if color - color: color !important //overwrite text for better visibility - -.card-details-white - card-details-color(unset, #000) //Black text for better visibility - border: 1px solid #eee - -.card-details-green - card-details-color(#3cb500, #ffffff) //White text for better visibility - -.card-details-yellow - card-details-color(#fad900, #000) //Black text for better visibility - -.card-details-orange - card-details-color(#ff9f19, #000) //Black text for better visibility - -.card-details-red - card-details-color(#eb4646, #ffffff) //White text for better visibility - -.card-details-purple - card-details-color(#a632db, #ffffff) //White text for better visibility - -.card-details-blue - card-details-color(#0079bf, #ffffff) //White text for better visibility - -.card-details-pink - card-details-color(#ff78cb, #000) //Black text for better visibility - -.card-details-sky - card-details-color(#00c2e0, #ffffff) //White text for better visibility - -.card-details-black - card-details-color(#4d4d4d, #ffffff) //White text for better visibility - -.card-details-lime - card-details-color(#51e898, #000) //Black text for better visibility - -.card-details-silver - card-details-color(#c0c0c0, #000) //Black text for better visibility - -.card-details-peachpuff - card-details-color(#ffdab9, #000) //Black text for better visibility - -.card-details-crimson - card-details-color(#dc143c, #ffffff) //White text for better visibility - -.card-details-plum - card-details-color(#dda0dd, #000) //Black text for better visibility - -.card-details-darkgreen - card-details-color(#006400, #ffffff) //White text for better visibility - -.card-details-slateblue - card-details-color(#6a5acd, #ffffff) //White text for better visibility - -.card-details-magenta - card-details-color(#ff00ff, #ffffff) //White text for better visibility - -.card-details-gold - card-details-color(#ffd700, #000) //Black text for better visibility - -.card-details-navy - card-details-color(#000080, #ffffff) //White text for better visibility - -.card-details-gray - card-details-color(#808080, #ffffff) //White text for better visibility - -.card-details-saddlebrown - card-details-color(#8b4513, #ffffff) //White text for better visibility - -.card-details-paleturquoise - card-details-color(#afeeee, #000) //Black text for better visibility - -.card-details-mistyrose - card-details-color(#ffe4e1, #000) //Black text for better visibility - -.card-details-indigo - card-details-color(#4b0082, #ffffff) //White text for better visibility - -.voted - opacity: .7 -.vote-title - display: flex - justify-content: space-between - - .js-edit-date - align-self: baseline - margin-left: 5px - -.vote-result - display: flex -.js-show-positive-votes - cursor: pointer - -.poker-voted - opacity: .7 - -.poker-title - display: flex - justify-content: space-between - - .js-edit-date - align-self: baseline - margin-left: 5px - -.poker-result - display: flex - flex-flow: row wrap -.js-show-positive-poker-votes - cursor: pointer - -.poker-deck - display: grid - flex-direction: column - text-align: center - -.poker-card-result - width: 32px - font-size: 1em - font-weight: bold - padding: 4px 2px 4px 2px - cursor: default - -.winner - font-weight: bold - outline: #2d2d2d solid 2px - -.loser - opacity: .5 - -.responsive-table - overflow-x: auto - -.poker-table - display: table - width: 100% - padding-top: 10px - -.poker-table-row - display: table-row - -.poker-table-heading - background-color: #EEE - display: table-header-group - -.poker-table-cell - display: table-cell - padding: 0 0 5px 2px - border-bottom: 1px solid #d2d0d0 - text-align: center - min-width: 45px - -.poker-table-cell-who - width: 150px - vertical-align: middle - -.poker-table-heading-left, -.poker-table-heading-right - display: table-header-group - font-weight: bold - border-top: 1px solid #808080 - -@media (max-width: 400px) - .poker-table-heading-right - display: none - -.poker-table-body - display: table-row-group - -.poker-table-side-left, -.poker-table-side-right - display: inline-block - -.poker-table-side-right - padding-left: 10px - -@media (max-width: 400px) - .poker-table-side-right - padding-left: 0px - -.estimation-add - display: block - overflow: auto - margin-top: 15px - margin-bottom: 5px - input - display: inline-block - float: right - margin: auto - margin-right: 10px - width: 100px - button - display: inline-block - float: right - margin: auto - -.poker-card - width:48px - height:72px - float:left - background:#fff - border-radius:5px - display:table - box-sizing:border-box - padding:5px - margin:3px - font-size:20px - font-weight: bold - text-shadow: #2d2d2d 1px 1px 0 - box-shadow:0 0 5px #aaaaaa - text-align:center - position:relative - cursor: pointer - - .inner - display:table-cell - vertical-align:middle - border-radius:5px - overflow:hidden - background-color: #cecece - diff --git a/client/components/cards/cardTime.css b/client/components/cards/cardTime.css new file mode 100644 index 000000000..ab8f2fae1 --- /dev/null +++ b/client/components/cards/cardTime.css @@ -0,0 +1,18 @@ +.card-time { + display: block; + border-radius: 4px; + padding: 1px 3px; + color: #fff; + background-color: #dbdbdb; +} +.card-time:hover, +.card-time.is-active { + background-color: #b3b3b3; +} +.card-time time::before { + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + -webkit-font-smoothing: antialiased; + content: "\f017"; + margin-right: 0.3em; +} diff --git a/client/components/cards/cardTime.styl b/client/components/cards/cardTime.styl deleted file mode 100644 index 3c4b43aed..000000000 --- a/client/components/cards/cardTime.styl +++ /dev/null @@ -1,17 +0,0 @@ -.card-time - display: block - border-radius: 4px - padding: 1px 3px - color: #fff - - background-color: #dbdbdb - &:hover, &.is-active - background-color: #b3b3b3 - - time - &::before - font: normal normal normal 14px/1 FontAwesome - font-size: inherit - -webkit-font-smoothing: antialiased - content: "\f017" // clock symbol - margin-right: 0.3em diff --git a/client/components/cards/checklists.css b/client/components/cards/checklists.css new file mode 100644 index 000000000..b40f77f67 --- /dev/null +++ b/client/components/cards/checklists.css @@ -0,0 +1,173 @@ +.js-add-checklist { + color: #8c8c8c; +} +textarea.js-add-checklist-item, +textarea.js-edit-checklist-item { + overflow: hidden; + word-wrap: break-word; + resize: none; + height: 34px; +} +.delete-text, +.js-delete-checklist-item, +.js-convert-checklist-item-to-card { + color: #8c8c8c; + text-decoration: underline; + word-wrap: break-word; + float: right; + padding-top: 6px; +} +.delete-text:hover, +.js-delete-checklist-item:hover, +.js-convert-checklist-item-to-card:hover { + color: inherit; +} +.checklists-title { + display: flex; + justify-content: space-between; +} +.checklist-progress-bar-container { + display: flex; + flex-direction: row; + align-items: center; +} +.checklist-progress-bar-container .checklist-progress-text { + margin-right: 10px; +} +.checklist-progress-bar-container .checklist-progress-bar { + width: 80%; + height: 10px; +} +.checklist-progress-bar-container .checklist-progress-bar .checklist-progress { + color: #fff !important; + background-color: #2196f3 !important; + padding: 0.01em 16px; + border-radius: 16px; + height: 100%; +} +.checklist-title .checkbox { + float: left; + width: 30px; + height: 30px; + font-size: 18px; + line-height: 30px; +} +.checklist-title .title { + font-size: 18px; + line-height: 25px; +} +.checklist-title .checklist-stat { + margin: 0 0.5em; + float: right; + padding-top: 6px; +} +.checklist-title .checklist-stat.is-finished { + color: #3cb500; +} +.checklist-title span.fa.checklist-handle { + padding-right: 20px; + padding-top: 3px; + float: left; +} +#card-details-overlay { + top: 0; + bottom: -600px; + right: 0; +} +.checklist { + background: #f7f7f7; +} +.checklist.placeholder { + background: #ccc; + border-radius: 2px; +} +.checklist.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(4deg); + cursor: grabbing; +} +.checklist-item { + margin: 0 0 0 0.1em; + line-height: 18px; + font-size: 1.1em; + margin-top: 3px; + display: flex; + background: #f7f7f7; + opacity: 1; + transition: height 0ms 400ms, opacity 400ms 0ms; + height: auto; + overflow: hidden; +} +.checklist-item.is-checked.invisible { + opacity: 0; + height: 0; + transition: height 0ms 0ms, opacity 600ms 0ms; + margin-top: 0; + margin-bottom: 0; +} +.checklist-item.placeholder { + background: #ccc; + border-radius: 2px; +} +.checklist-item.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(4deg); + cursor: grabbing; +} +.checklist-item:hover { + background-color: #ebebeb; +} +.checklist-item .check-box-container { + padding-right: 10px; +} +.checklist-item .check-box { + margin: 0.1em 0 0 0; +} +.checklist-item .check-box.is-checked { + border-bottom: 2px solid #3cb500; + border-right: 2px solid #3cb500; +} +.checklist-item .item-title { + flex: 1; +} +.checklist-item .item-title.is-checked { + color: #8c8c8c; + font-style: italic; + text-decoration: line-through; +} +.checklist-item .item-title .viewer p { + margin-bottom: 2px; + display: block; + word-wrap: break-word; + max-width: 420px; +} +.checklist-item span.fa.checklistitem-handle { + padding-top: 2px; + padding-right: 10px; +} +.js-delete-checklist-item, +.js-convert-checklist-item-to-card { + margin: 0 0 0.5em 1.33em; + padding: 12px 0 0 0; +} +.add-checklist-item { + margin: 0.2em 0 0.5em 1.33em; +} +.add-checklist-item.js-open-inlined-form, +.add-checklist.js-open-inlined-form { + display: block; + width: 50%; +} +.add-checklist-item.js-open-inlined-form:hover, +.add-checklist.js-open-inlined-form:hover { + background: #dbdbdb; + color: #222; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} +.checklist-details-menu { + float: right; + padding: 6px 10px 6px 10px; +} +.edit-controls label.toggle-label { + margin-left: 2px; +} diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl deleted file mode 100644 index c906eec5d..000000000 --- a/client/components/cards/checklists.styl +++ /dev/null @@ -1,168 +0,0 @@ -.js-add-checklist - color: #8c8c8c - -textarea.js-add-checklist-item, textarea.js-edit-checklist-item - overflow: hidden - word-wrap: break-word - resize: none - height: 34px - -.delete-text - color: #8c8c8c - text-decoration: underline - word-wrap: break-word - float: right - padding-top: 6px - &:hover - color: inherit - -.checklists-title - display: flex - justify-content: space-between - -.checklist-progress-bar-container - display: flex - flex-direction: row - align-items: center - - .checklist-progress-text - margin-right: 10px - - .checklist-progress-bar - width: 80% - height: 10px - - .checklist-progress - color: #fff !important - background-color: #2196F3 !important - padding: 0.01em 16px - border-radius: 16px - height: 100% - -.checklist-title - .checkbox - float: left - width: 30px - height 30px - font-size: 18px - line-height: 30px - - .title - font-size: 18px - line-height: 25px - - .checklist-stat - margin: 0 0.5em - float: right - padding-top: 6px - &.is-finished - color: #3cb500 - - span.fa.checklist-handle - padding-right: 20px - padding-top: 3px - float: left - -#card-details-overlay - top: 0 - bottom: -600px - right: 0 - -.checklist - background: darken(white, 3%) - - &.placeholder - background: darken(white, 20%) - border-radius: 2px - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(4deg) - cursor: grabbing - - -.checklist-item - margin: 0 0 0 0.1em - line-height: 18px - font-size: 1.1em - margin-top: 3px - display: flex - background: darken(white, 3%) - opacity: 1 - transition: height 0ms 400ms, opacity 400ms 0ms - height: auto - overflow: hidden - - &.is-checked.invisible - opacity: 0 - height: 0 - transition: height 0ms 0ms, opacity 600ms 0ms - margin-top: 0 - margin-bottom: 0 - - &.placeholder - background: darken(white, 20%) - border-radius: 2px - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(4deg) - cursor: grabbing - - &:hover - background-color: darken(white, 8%) - - .check-box-container - padding-right: 10px; - - .check-box - margin: 0.1em 0 0 0; - &.is-checked - border-bottom: 2px solid #3cb500 - border-right: 2px solid #3cb500 - - .item-title - flex: 1 - &.is-checked - color: #8c8c8c - font-style: italic - text-decoration: line-through - & .viewer - p - margin-bottom: 2px - display: block - word-wrap: break-word - max-width: 420px - - span.fa.checklistitem-handle - padding-top: 2px - padding-right: 10px; - -.js-delete-checklist-item, -.js-convert-checklist-item-to-card - margin: 0 0 0.5em 1.33em - @extends .delete-text - padding: 12px 0 0 0 - -.add-checklist-item - margin: 0.2em 0 0.5em 1.33em - -.add-checklist-item,.add-checklist - &.js-open-inlined-form - display: block - width: 50% - - &:hover - background: #dbdbdb - color: #222 - box-shadow: 0 1px 2px rgba(0,0,0,.2) - -.checklist-details-menu - float: right - padding: 6px 10px 6px 10px - -.edit-controls - label.toggle-label - margin-left: 2px diff --git a/client/components/cards/labels.css b/client/components/cards/labels.css new file mode 100644 index 000000000..45d886191 --- /dev/null +++ b/client/components/cards/labels.css @@ -0,0 +1,230 @@ +.card-label { + border: 1px solid #000; + border-radius: 4px; + color: #fff; + display: inline-block; + font-weight: 700; + font-size: 13px; + margin-right: 4px; + margin-bottom: 5px; + padding: 3px 8px; + max-width: 210px; + min-width: 8px; + word-wrap: break-word; + min-height: 18px; + vertical-align: middle; + white-space: initial; + overflow: initial; +} +.card-label:hover { + color: #fff; +} +.card-label.square { + height: 30px; + width: 30px; + padding: 0; +} +.card-label.add-label { + box-shadow: 0 0 0 2px #bfbfbf inset; + border: initial; +} +.card-label.add-label:hover, +.card-label.add-label.is-active { + box-shadow: 0 0 0 2px #666 inset; +} +.card-label p { + margin: 0px; +} +.palette-colors { + display: flex; + flex-wrap: wrap; +} +.palette-colors .palette-color { + flex-grow: 1; + display: flex; + align-items: center; + justify-content: center; +} +.card-label-white { + background-color: #fff; + color: #000; +} +.card-label-white:hover { + color: #aaa; +} +.card-label-green { + background-color: #3cb500; +} +.card-label-green:hover { + color: #000; +} +.card-label-yellow { + background-color: #fad900; + color: #000; +} +.card-label-orange { + background-color: #ff9f19; + color: #000; +} +.card-label-red { + background-color: #eb4646; +} +.card-label-purple { + background-color: #a632db; +} +.card-label-blue { + background-color: #0079bf; +} +.card-label-pink { + background-color: #ff78cb; + color: #000; +} +.card-label-sky { + background-color: #00c2e0; +} +.card-label-black { + background-color: #4d4d4d; +} +.card-label-lime { + background-color: #51e898; + color: #000; +} +.card-label-silver { + background-color: #c0c0c0; + color: #000; +} +.card-label-peachpuff { + background-color: #ffdab9; + color: #000; +} +.card-label-crimson { + background-color: #dc143c; +} +.card-label-plum { + background-color: #dda0dd; + color: #000; +} +.card-label-darkgreen { + background-color: #006400; +} +.card-label-slateblue { + background-color: #6a5acd; +} +.card-label-magenta { + background-color: #f0f; +} +.card-label-gold { + background-color: #ffd700; + color: #000; +} +.card-label-navy { + background-color: #000080; +} +.card-label-gray { + background-color: #808080; +} +.card-label-saddlebrown { + background-color: #8b4513; +} +.card-label-paleturquoise { + background-color: #afeeee; + color: #000; +} +.card-label-mistyrose { + background-color: #ffe4e1; + color: #000; +} +.card-label-indigo { + background-color: #4b0082; +} +.edit-label .card-label, +.create-label .card-label { + float: left; + height: 25px; + margin: 0px 3% 7px 0px; + width: 10.5%; + max-width: 10.5%; + cursor: pointer; +} +.edit-labels input[type="text"] { + margin: 4px 0 6px 38px; + width: 243px; +} +.edit-labels .card-label { + height: 30px; + left: 0; + padding: 1px 5px; + position: absolute; + top: 0; + width: 24px; +} +.edit-labels .labels-static .card-label { + line-height: 30px; + margin-bottom: 4px; + position: relative; + top: auto; + left: 0; + width: 260px; +} +.edit-labels-pop-over { + margin-bottom: 8px; +} +.edit-labels-pop-over .card-label .viewer p { + margin: 0; +} +.edit-labels-pop-over .shortcut { + display: inline-block; +} +.card-label-selectable { + border-radius: 3px; + cursor: pointer; + margin: 0; + margin-bottom: 3px; + width: 190px; + min-height: 18px; + padding: 8px; + position: relative; + transition: margin-right 0.1s; +} +.card-label-selectable .card-label-selectable-icon { + position: absolute; + top: 8px; + right: -20px; +} +.card-label-selectable.active:hover, +.card-label-selectable.active, +.card-label-selectable.active.selected:hover, +.card-label-selectable.active.selected { + padding-right: 32px; +} +.card-label-selectable.active:hover .card-label-selectable-icon, +.card-label-selectable.active .card-label-selectable-icon, +.card-label-selectable.active.selected:hover .card-label-selectable-icon, +.card-label-selectable.active.selected .card-label-selectable-icon { + right: 6px; +} +.card-label-selectable.selected, +.card-label-selectable:hover { + opacity: 0.8; +} +.active .card-label-selectable, +.active .card-label-selectable:hover { + margin-right: 0; +} +.active .card-label-selectable .card-label-selectable-icon { + right: 8px; +} +.card-label-edit-button { + border-radius: 3px; + float: right; + padding: 8px; +} +.card-label-edit-button:hover { + background: #dbdbdb; +} +ul.edit-labels-pop-over span.fa.label-handle { + padding-right: 10px; +} +ul.edit-labels-pop-over span.fa.label-handle + .card-label { + max-width: 180px; +} diff --git a/client/components/cards/labels.styl b/client/components/cards/labels.styl deleted file mode 100644 index 700ff1044..000000000 --- a/client/components/cards/labels.styl +++ /dev/null @@ -1,231 +0,0 @@ -@import 'nib' - -// XXX Use .board-widget-labels as a flexbox container -.card-label - border: 1px solid #000000 - border-radius: 4px - color: white //Default white text, in select cases, changed to black to improve contrast between label colour and text - display: inline-block - font-weight: 700 - font-size: 13px - margin-right: 4px - margin-bottom: 5px - padding: 3px 8px - max-width: 210px - min-width: 8px - word-wrap: break-word - min-height: 18px - vertical-align: middle - white-space: initial - overflow: initial - - &:hover - color: white - - &.square - height: 30px - width: @height - padding: 0 - - &.add-label - box-shadow: 0 0 0 2px darken(white, 25%) inset - border: initial - - &:hover, &.is-active - box-shadow: 0 0 0 2px darken(white, 60%) inset - - p - margin: 0px - -.palette-colors - display: flex - flex-wrap: wrap - - .palette-color - flex-grow: 1 - display: flex - align-items: center - justify-content: center - -.card-label-white - background-color: #ffffff - color: #000000 //Black text for better visibility - -.card-label-white:hover - color: #aaaaaa //grey text for better visibility - -.card-label-green - background-color: #3cb500 - -.card-label-green:hover - color: #000000 //Black hover text for better visibility - -.card-label-yellow - background-color: #fad900 - color: #000000 //Black text for better visibility - -.card-label-orange - background-color: #ff9f19 - color: #000000 //Black text for better visibility - -.card-label-red - background-color: #eb4646 - -.card-label-purple - background-color: #a632db - -.card-label-blue - background-color: #0079bf - -.card-label-pink - background-color: #ff78cb - color: #000000 //Black text for better visibility - -.card-label-sky - background-color: #00c2e0 - -.card-label-black - background-color: #4d4d4d - -.card-label-lime - background-color: #51e898 - color: #000000 //Black text for better visibility - -.card-label-silver - background-color: #c0c0c0 - color: #000000 //Black text for better visibility - -.card-label-peachpuff - background-color: #ffdab9 - color: #000000 //Black text for better visibility - -.card-label-crimson - background-color: #dc143c - -.card-label-plum - background-color: #dda0dd - color: #000000 //Black text for better visibility - -.card-label-darkgreen - background-color: #006400 - -.card-label-slateblue - background-color: #6a5acd - -.card-label-magenta - background-color: #ff00ff - -.card-label-gold - background-color: #ffd700 - color: #000000 //Black text for better visibility - -.card-label-navy - background-color: #000080 - -.card-label-gray - background-color: #808080 - -.card-label-saddlebrown - background-color: #8b4513 - -.card-label-paleturquoise - background-color: #afeeee - color: #000000 //Black text for better visibility - -.card-label-mistyrose - background-color: #ffe4e1 - color: #000000 //Black text for better visibility - -.card-label-indigo - background-color: #4b0082 - -.edit-label, -.create-label - .card-label - float: left - height: 25px - margin: 0px 3% 7px 0px - width: 10.5% - max-width: 10.5% - cursor: pointer - -.edit-labels - input[type="text"] - margin: 4px 0 6px 38px - width: 243px - - .card-label - height: 30px - left: 0 - padding: 1px 5px - position: absolute - top: 0 - width: 24px - - .labels-static .card-label - line-height: 30px - margin-bottom: 4px - position: relative - top: auto - left: 0 - width: 260px - -.edit-labels-pop-over - margin-bottom: 8px - .card-label .viewer p - margin: 0 - -.edit-labels-pop-over .shortcut - display: inline-block - -.card-label-selectable - border-radius: 3px - cursor: pointer - margin: 0 - margin-bottom: 3px - width: 190px - min-height: 18px - padding: 8px - position: relative - transition: margin-right .1s - - .card-label-selectable-icon - position: absolute - top: 8px - right: -20px - - &.active:hover, - &.active, - &.active.selected:hover, - &.active.selected - padding-right: 32px - - .card-label-selectable-icon - right: 6px - - &.selected, - &:hover - opacity: .8 - -.active .card-label-selectable - &, - &:hover - margin-right: 0 - - .card-label-selectable-icon - right: 8px - -.card-label-edit-button - border-radius: 3px - float: right - padding: 8px - - &:hover - background: #dbdbdb - -ul.edit-labels-pop-over - span.fa.label-handle - padding-right: 10px; - - span.fa.label-handle + .card-label - max-width: 180px diff --git a/client/components/cards/minicard.css b/client/components/cards/minicard.css new file mode 100644 index 000000000..27db132a9 --- /dev/null +++ b/client/components/cards/minicard.css @@ -0,0 +1,550 @@ +.minicard-wrapper { + cursor: pointer; + position: relative; + display: flex; + align-items: center; + margin-bottom: 9px; +} +.minicard-wrapper.placeholder { + background: #ccc; + border-radius: 9px; +} +.minicard-wrapper.ui-sortable-helper { + cursor: grabbing; + transform: rotate(4deg); + display: block !important; +} +.minicard-wrapper.ui-sortable-helper .and-n-other { + width: 100%; + height: 16px; + padding: 4px; + background-color: #f2f2f2; + text-align: center; + border-radius: 3px; +} +.minicard-wrapper.ui-sortable-helper .multi-selection-checkbox { + display: none; +} +.minicard-wrapper .multi-selection-checkbox + .minicard { + margin-left: 8px; +} +.minicard { + padding: 6px 8px 2px; + position: relative; + flex: 1; + flex-wrap: wrap; + background-color: #fff; + min-height: 20px; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); + border-radius: 2px; + color: #4d4d4d; + overflow: hidden; + transition: transform 0.2s, border-radius 0.2s; +} +.minicard.linked-board .linked-icon, +.minicard.linked-card .linked-icon { + display: inline-block; + margin-right: 11px; + vertical-align: baseline; + font-size: 0.9em; +} +.minicard.linked-board .linked-archived, +.minicard.linked-card .linked-archived { + color: #937760; +} +.is-selected .minicard { + transform: translateX(11px); + border-bottom-right-radius: 0; + border-top-right-radius: 0; + z-index: 25; + box-shadow: -2px 1px 2px rgba(0,0,0,0.2); +} +.minicard:hover:not(.minicard-composer), +.is-selected .minicard, +.draggable-hover-card .minicard { + background: #f7f7f7; +} +.draggable-hover-card .minicard { + background: #ededed; +} +.minicard .minicard-cover { + background-position: center; + background-repeat: no-repeat; + background-size: contain; + height: 145px; + user-select: none; + margin: -6px -8px 6px -8px; + border-radius: top 2px; +} +.minicard .minicard-labels { + float: none; +} +.minicard .minicard-labels .minicard-label { + width: 11px; + height: 11px; + border-radius: 2px; + margin-right: 3px; + margin-bottom: 3px; +} +.minicard .minicard-labels-no-text { + display: flex; + flex-wrap: wrap; +} +.minicard .minicard-custom-fields { + display: block; +} +.minicard .minicard-custom-field { + display: flex; +} +.minicard .minicard-custom-field-item { + flex-grow: 1; + display: block; + word-wrap: break-word; + max-width: 100px; + margin-right: 4px; +} +.minicard .handle { + width: 20px; + height: 20px; + position: absolute; + right: 5px; + top: 5px; + display: none; +} +@media only screen { + .minicard .handle { + display: block; + } +} +.minicard .handle .fa-arrows { + font-size: 20px; + color: #ccc; +} +.minicard .minicard-title .card-number { + color: #b3b3b3; + display: inline-block; + margin-right: 5px; +} +.minicard .minicard-title p:last-child { + margin-bottom: 0; +} +.minicard .minicard-title .viewer { + display: block; + word-wrap: break-word; + max-width: 230px; +} +.minicard .dates { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} +.minicard .date { + margin-right: 3px; +} +.minicard .badges { + float: left; + margin-top: 7px; + color: #808080; +} +.minicard .badges:empty { + display: none; +} +.minicard .badges .badge { + float: left; + margin-right: 11px; + margin-bottom: 3px; + font-size: 0.9em; +} +.minicard .badges .badge.is-finished { + background: #3cb500; + padding: 0px 3px; + border-radius: 3px; + color: #fff; +} +.minicard .badges .badge:last-of-type { + margin-right: 0; +} +.minicard .badges .badge .badge-icon, +.minicard .badges .badge .badge-text { + vertical-align: middle; +} +.minicard .badges .badge .badge-icon.badge-comment, +.minicard .badges .badge .badge-text.badge-comment { + margin-bottom: 0.1rem; +} +.minicard .badges .badge .badge-text { + font-size: 0.9em; + padding-left: 2px; + line-height: 14px; +} +.minicard .badges .badge .check-list-text { + padding-left: 0px; + line-height: 12px; +} +.minicard .minicard-members, +.minicard .minicard-assignees, +.minicard .minicard-creator { + float: right; + margin-left: 5px; + margin-bottom: 4px; +} +.minicard .minicard-members .member, +.minicard .minicard-assignees .member, +.minicard .minicard-creator .member { + float: right; + border-radius: 50%; + height: 28px; + width: 28px; + margin-bottom: 4px; +} +.minicard .minicard-members .assignee, +.minicard .minicard-assignees .assignee, +.minicard .minicard-creator .assignee { + float: right; + border-radius: 50%; + height: 28px; + width: 28px; +} +.minicard .minicard-members + .badges, +.minicard .minicard-assignees + .badges, +.minicard .minicard-creator + .badges { + margin-top: 5px; +} +.minicard .minicard-assignees { + border-bottom: 1px solid #f00; +} +.minicard .minicard-creator { + border-bottom: 1px solid #008000; +} +.minicard .minicard-members:empty, +.minicard .minicard-assignees:empty { + display: none; +} +.minicard .minicard-description { + padding: 6px 0 6px 8px; + background-color: #eee; + width: 100%; + margin-bottom: 2px; + margin-left: -4px; + border-radius: 3px; + display: inline-block; +} +.minicard.minicard-composer { + margin-bottom: 10px; +} +.minicard.minicard-composer textarea.minicard-composer-textarea, +.minicard.minicard-composer textarea.minicard-composer-textarea:focus { + resize: none; + background: none; + border: none; + box-shadow: none; + height: auto; + margin: 0; + padding: 0; + max-height: 162px; + min-height: 36px; + margin-bottom: 20px; + overflow-y: auto; +} +.parent-prefix { + color: #b3b3b3; + font-size: 0.9em; +} +.parent-subtext { + color: #b3b3b3; + font-size: 0.9em; +} +@media screen and (max-width: 800px) { + .is-selected .minicard { + transform: translateX(0px); + border-bottom-right-radius: 0; + border-top-right-radius: 0; + z-index: 15; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); + } +} +/* https://github.com/wekan/wekan/issues/4254#issuecomment-1037192960 */ +.minicard-green { + background-color: #3cb500 !important; + color: #fff !important; +} +.minicard-green:hover:not(.minicard-composer), +.is-selected .minicard-green, +.draggable-hover-card .minicard-green { + background: #3ab000; +} +.draggable-hover-card .minicard-green { + background: #38a800; +} +.minicard-yellow { + background-color: #fad900 !important; +} +.minicard-yellow:hover:not(.minicard-composer), +.is-selected .minicard-yellow, +.draggable-hover-card .minicard-yellow { + background: #f3d200; +} +.draggable-hover-card .minicard-yellow { + background: #e9ca00; +} +.minicard-orange { + background-color: #ff9f19 !important; +} +.minicard-orange:hover:not(.minicard-composer), +.is-selected .minicard-orange, +.draggable-hover-card .minicard-orange { + background: #ff9b11; +} +.draggable-hover-card .minicard-orange { + background: #ff9705; +} +.minicard-red { + background-color: #eb4646 !important; + color: #fff !important; +} +.minicard-red:hover:not(.minicard-composer), +.is-selected .minicard-red, +.draggable-hover-card .minicard-red { + background: #ea3e3e; +} +.draggable-hover-card .minicard-red { + background: #e93333; +} +.minicard-purple { + background-color: #a632db !important; + color: #fff !important; +} +.minicard-purple:hover:not(.minicard-composer), +.is-selected .minicard-purple, +.draggable-hover-card .minicard-purple { + background: #a32bda; +} +.draggable-hover-card .minicard-purple { + background: #9e25d5; +} +.minicard-blue { + background-color: #0079bf !important; + color: #fff !important; +} +.minicard-blue:hover:not(.minicard-composer), +.is-selected .minicard-blue, +.draggable-hover-card .minicard-blue { + background: #0075b9; +} +.draggable-hover-card .minicard-blue { + background: #0071b2; +} +.minicard-pink { + background-color: #ff78cb !important; +} +.minicard-pink:hover:not(.minicard-composer), +.is-selected .minicard-pink, +.draggable-hover-card .minicard-pink { + background: #ff6dc7; +} +.draggable-hover-card .minicard-pink { + background: #ff5ec1; +} +.minicard-sky { + background-color: #00c2e0 !important; + color: #fff !important; +} +.minicard-sky:hover:not(.minicard-composer), +.is-selected .minicard-sky, +.draggable-hover-card .minicard-sky { + background: #00bcd9; +} +.draggable-hover-card .minicard-sky { + background: #00b4d0; +} +.minicard-black { + background-color: #4d4d4d !important; + color: #fff !important; +} +.minicard-black:hover:not(.minicard-composer), +.is-selected .minicard-black, +.draggable-hover-card .minicard-black { + background: #4b4b4b; +} +.draggable-hover-card .minicard-black { + background: #484848; +} +.minicard-lime { + background-color: #51e898 !important; +} +.minicard-lime:hover:not(.minicard-composer), +.is-selected .minicard-lime, +.draggable-hover-card .minicard-lime { + background: #49e793; +} +.draggable-hover-card .minicard-lime { + background: #3ee58d; +} +.minicard-silver { + background-color: #c0c0c0 !important; +} +.minicard-silver:hover:not(.minicard-composer), +.is-selected .minicard-silver, +.draggable-hover-card .minicard-silver { + background: #bababa; +} +.draggable-hover-card .minicard-silver { + background: #b3b3b3; +} +.minicard-peachpuff { + background-color: #ffdab9 !important; +} +.minicard-peachpuff:hover:not(.minicard-composer), +.is-selected .minicard-peachpuff, +.draggable-hover-card .minicard-peachpuff { + background: #ffd3ac; +} +.draggable-hover-card .minicard-peachpuff { + background: #ffca9a; +} +.minicard-crimson { + background-color: #dc143c !important; + color: #fff !important; +} +.minicard-crimson:hover:not(.minicard-composer), +.is-selected .minicard-crimson, +.draggable-hover-card .minicard-crimson { + background: #d5133a; +} +.draggable-hover-card .minicard-crimson { + background: #cd1338; +} +.minicard-plum { + background-color: #dda0dd !important; +} +.minicard-plum:hover:not(.minicard-composer), +.is-selected .minicard-plum, +.draggable-hover-card .minicard-plum { + background: #da98da; +} +.draggable-hover-card .minicard-plum { + background: #d68cd6; +} +.minicard-darkgreen { + background-color: #006400 !important; + color: #fff !important; +} +.minicard-darkgreen:hover:not(.minicard-composer), +.is-selected .minicard-darkgreen, +.draggable-hover-card .minicard-darkgreen { + background: #006100; +} +.draggable-hover-card .minicard-darkgreen { + background: #005d00; +} +.minicard-slateblue { + background-color: #6a5acd !important; + color: #fff !important; +} +.minicard-slateblue:hover:not(.minicard-composer), +.is-selected .minicard-slateblue, +.draggable-hover-card .minicard-slateblue { + background: #6453cb; +} +.draggable-hover-card .minicard-slateblue { + background: #5c4ac8; +} +.minicard-magenta { + background-color: #f0f !important; + color: #fff !important; +} +.minicard-magenta:hover:not(.minicard-composer), +.is-selected .minicard-magenta, +.draggable-hover-card .minicard-magenta { + background: #f700f7; +} +.draggable-hover-card .minicard-magenta { + background: #ed00ed; +} +.minicard-gold { + background-color: #ffd700 !important; +} +.minicard-gold:hover:not(.minicard-composer), +.is-selected .minicard-gold, +.draggable-hover-card .minicard-gold { + background: #f7d100; +} +.draggable-hover-card .minicard-gold { + background: #edc800; +} +.minicard-navy { + background-color: #000080 !important; + color: #fff !important; +} +.minicard-navy:hover:not(.minicard-composer), +.is-selected .minicard-navy, +.draggable-hover-card .minicard-navy { + background: #00007c; +} +.draggable-hover-card .minicard-navy { + background: #007; +} +.minicard-gray { + background-color: #808080 !important; + color: #fff !important; +} +.minicard-gray:hover:not(.minicard-composer), +.is-selected .minicard-gray, +.draggable-hover-card .minicard-gray { + background: #7c7c7c; +} +.draggable-hover-card .minicard-gray { + background: #777; +} +.minicard-saddlebrown { + background-color: #8b4513 !important; + color: #fff !important; +} +.minicard-saddlebrown:hover:not(.minicard-composer), +.is-selected .minicard-saddlebrown, +.draggable-hover-card .minicard-saddlebrown { + background: #874312; +} +.draggable-hover-card .minicard-saddlebrown { + background: #814012; +} +.minicard-paleturquoise { + background-color: #afeeee !important; +} +.minicard-paleturquoise:hover:not(.minicard-composer), +.is-selected .minicard-paleturquoise, +.draggable-hover-card .minicard-paleturquoise { + background: #a5ecec; +} +.draggable-hover-card .minicard-paleturquoise { + background: #97e9e9; +} +.minicard-mistyrose { + background-color: #ffe4e1 !important; +} +.minicard-mistyrose:hover:not(.minicard-composer), +.is-selected .minicard-mistyrose, +.draggable-hover-card .minicard-mistyrose { + background: #ffd7d3; +} +.draggable-hover-card .minicard-mistyrose { + background: #ffc6bf; +} +.minicard-indigo { + background-color: #4b0082 !important; + color: #fff !important; +} +.minicard-indigo:hover:not(.minicard-composer), +.is-selected .minicard-indigo, +.draggable-hover-card .minicard-indigo { + background: #49007e; +} +.draggable-hover-card .minicard-indigo { + background: #460079; +} +.text-red { + color: #f00; +} +.text-green { + color: #008000; +} diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl deleted file mode 100644 index 6ab3672c3..000000000 --- a/client/components/cards/minicard.styl +++ /dev/null @@ -1,335 +0,0 @@ -@import 'nib' - -.minicard-wrapper - cursor: pointer - position: relative - display: flex - align-items: center - margin-bottom: 9px - - &.placeholder - background: darken(white, 20%) - border-radius: 9px - - &.ui-sortable-helper - cursor: grabbing - transform: rotate(4deg) - display: block !important - - .and-n-other - width: 100% - height: 16px - padding: 4px - background-color: darken(white, 5%) - text-align: center - border-radius: 3px - - .multi-selection-checkbox - display: none - - .multi-selection-checkbox + .minicard - margin-left: 8px - -.minicard - padding: 6px 8px 2px - position: relative - flex: 1 - flex-wrap: wrap - background-color: #fff - min-height: 20px - box-shadow: 0 1px 2px rgba(0,0,0,.15) - border-radius: 2px - color: #4d4d4d - overflow: hidden - transition: transform 0.2s, - border-radius 0.2s - - &.linked-board - &.linked-card - .linked-icon - display: inline-block - margin-right: 11px - vertical-align: baseline - font-size: 0.9em - .linked-archived - color: #937760 - - .is-selected & - transform: translateX(11px) - border-bottom-right-radius: 0 - border-top-right-radius: 0 - z-index: 25 - box-shadow: -2px 1px 2px rgba(0,0,0,.2) - - &:hover:not(.minicard-composer), - .is-selected &, - .draggable-hover-card & - background: darken(white, 3%) - - .draggable-hover-card & - background: darken(white, 7%) - - .minicard-cover - background-position: center - background-repeat: no-repeat - background-size: contain - height: 145px - user-select: none - margin: -6px -8px 6px -8px - border-radius: top 2px - - .minicard-labels - float: none - - .minicard-label - width: 11px - height: @width - border-radius: 2px - margin-right: 3px - margin-bottom: 3px - - .minicard-labels-no-text - display: flex - flex-wrap: wrap - - .minicard-custom-fields - display:block; - .minicard-custom-field - display:flex; - .minicard-custom-field-item - flex-grow: 1 - display: block - word-wrap: break-word - max-width: 100px - margin-right: 4px - .handle - width: 20px; - height: 20px; - position: absolute; - right: 5px; - top: 5px; - display:none; - @media only screen { - display:block; - } - .fa-arrows - font-size:20px; - color: #ccc; - .minicard-title - .card-number - color: darken(white, 30%); - display: inline-block; - margin-right: 5px; - p:last-child - margin-bottom: 0 - .viewer - display: block - word-wrap: break-word - max-width: 230px - .dates - display: flex; - flex-direction: row; - flex-wrap: wrap; - .date - margin-right: 3px - .badges - float: left - margin-top: 7px - color: darken(white, 50%) - - &:empty - display: none - - .badge - float: left - margin-right: 11px - margin-bottom: 3px - font-size: 0.9em - &.is-finished - background: #3cb500 - padding: 0px 3px - border-radius: 3px - color: white - - &:last-of-type - margin-right: 0 - - .badge-icon, - .badge-text - vertical-align: middle - &.badge-comment - margin-bottom: 0.1rem - - .badge-text - font-size: 0.9em - padding-left: 2px - line-height: 14px - .check-list-text - padding-left: 0px - line-height: 12px - - .minicard-members, - .minicard-assignees, - .minicard-creator - float: right - margin-left: 5px - margin-bottom: 4px - - .member - float: right - border-radius: 50% - height: 28px - width: @height - margin-bottom: 4px - - .assignee - float: right - border-radius: 50% - height: 28px - width: @height - - + .badges - margin-top: 5px - - .minicard-assignees - border-bottom: 1px solid red - - .minicard-creator - border-bottom: 1px solid green - - .minicard-members:empty, - .minicard-assignees:empty - display: none - - .minicard-description { - padding: 6px 0 6px 8px - background-color: #eee - width: 100% - margin-bottom: 2px - margin-left: -4px - border-radius: 3px - display: inline-block - } - - &.minicard-composer - margin-bottom: 10px - - textarea.minicard-composer-textarea, - textarea.minicard-composer-textarea:focus - resize: none - background: none - border: none - box-shadow: none - height: auto - margin: 0 - padding: 0 - max-height: 162px - min-height: 36px - margin-bottom: 20px - overflow-y: auto - -.parent-prefix - color: darken(white, 30%) - font-size: 0.9em -.parent-subtext - color: darken(white, 30%) - font-size: 0.9em - -@media screen and (max-width: 800px) - .minicard - .is-selected & - transform: translateX(0px) - border-bottom-right-radius: 0 - border-top-right-radius: 0 - z-index: 15 - box-shadow: 0 1px 2px rgba(0,0,0,.15) - -/* https://github.com/wekan/wekan/issues/4254#issuecomment-1037192960 */ - -minicard-color(background, color...) - background-color: background !important - if color - color: color !important //overwrite text for better visibility - &:hover:not(.minicard-composer), - .is-selected &, - .draggable-hover-card & - background: darken(background, 3%) - .draggable-hover-card & - background: darken(background, 7%) - -.minicard-green - minicard-color(#3cb500, #ffffff) //White text for better visibility - -.minicard-yellow - minicard-color(#fad900) - -.minicard-orange - minicard-color(#ff9f19) - -.minicard-red - minicard-color(#eb4646, #ffffff) //White text for better visibility - -.minicard-purple - minicard-color(#a632db, #ffffff) //White text for better visibility - -.minicard-blue - minicard-color(#0079bf, #ffffff) //White text for better visibility - -.minicard-pink - minicard-color(#ff78cb) - -.minicard-sky - minicard-color(#00c2e0, #ffffff) //White text for better visibility - -.minicard-black - minicard-color(#4d4d4d, #ffffff) //White text for better visibility - -.minicard-lime - minicard-color(#51e898) - -.minicard-silver - minicard-color(#c0c0c0) - -.minicard-peachpuff - minicard-color(#ffdab9) - -.minicard-crimson - minicard-color(#dc143c, #ffffff) //White text for better visibility - -.minicard-plum - minicard-color(#dda0dd) - -.minicard-darkgreen - minicard-color(#006400, #ffffff) //White text for better visibility - -.minicard-slateblue - minicard-color(#6a5acd, #ffffff) //White text for better visibility - -.minicard-magenta - minicard-color(#ff00ff, #ffffff) //White text for better visibility - -.minicard-gold - minicard-color(#ffd700) - -.minicard-navy - minicard-color(#000080, #ffffff) //White text for better visibility - -.minicard-gray - minicard-color(#808080, #ffffff) //White text for better visibility - -.minicard-saddlebrown - minicard-color(#8b4513, #ffffff) //White text for better visibility - -.minicard-paleturquoise - minicard-color(#afeeee) - -.minicard-mistyrose - minicard-color(#ffe4e1) - -.minicard-indigo - minicard-color(#4b0082, #ffffff) //White text for better visibility - -.text-red - color:red -.text-green - color:green diff --git a/client/components/cards/resultCard.css b/client/components/cards/resultCard.css new file mode 100644 index 000000000..e47e929c7 --- /dev/null +++ b/client/components/cards/resultCard.css @@ -0,0 +1,25 @@ +.result-card-list-wrapper { + margin: 1rem; + border-radius: 5px; + padding: 1.5rem; + padding-top: 0.75rem; + display: inline-block; + min-width: 250px; + max-width: 350px; +} +.result-card-wrapper { + margin-top: 0; + margin-bottom: 10px; +} +.result-card-context { + display: inline-block; +} +.result-card-context-separator { + font-weight: bold; +} +.result-card-context-list { + margin-bottom: 0.7rem; +} +.result-card-block-wrapper { + display: inline-block; +} diff --git a/client/components/cards/resultCard.styl b/client/components/cards/resultCard.styl deleted file mode 100644 index 7aa94e90f..000000000 --- a/client/components/cards/resultCard.styl +++ /dev/null @@ -1,24 +0,0 @@ -.result-card-list-wrapper - margin: 1rem - border-radius: 5px - padding: 1.5rem - padding-top: 0.75rem - display: inline-block - min-width: 250px - max-width: 350px - -.result-card-wrapper - margin-top: 0 - margin-bottom: 10px - -.result-card-context - display: inline-block - -.result-card-context-separator - font-weight: bold - -.result-card-context-list - margin-bottom: 0.7rem - -.result-card-block-wrapper - display: inline-block diff --git a/client/components/cards/subtasks.css b/client/components/cards/subtasks.css new file mode 100644 index 000000000..08f5122c2 --- /dev/null +++ b/client/components/cards/subtasks.css @@ -0,0 +1,152 @@ +.js-add-subtask { + color: #8c8c8c; +} +textarea.js-add-subtask-item, +textarea.js-edit-subtask-item { + overflow: hidden; + word-wrap: break-word; + resize: none; + height: 34px; +} +.delete-text, +.subtask-title .js-delete-subtask, +.subtask-title .js-view-subtask, +.js-delete-subtask-item { + color: #8c8c8c; + text-decoration: underline; + word-wrap: break-word; + float: right; + padding-top: 6px; +} +.delete-text:hover, +.subtask-title .js-delete-subtask:hover, +.subtask-title .js-view-subtask:hover, +.js-delete-subtask-item:hover { + color: inherit; +} +.subtask-title .checkbox { + float: left; + width: 30px; + height: 30px; + font-size: 18px; + line-height: 30px; +} +.subtask-title .title { + font-size: 18px; + line-height: 25px; +} +.subtask-title .subtasks-stat { + margin: 0 0.5em; + float: right; + padding-top: 6px; +} +.subtask-title .subtasks-stat.is-finished { + color: #3cb500; +} +.subtask-title .js-delete-subtask { + margin: 0 0.5em; +} +.js-confirm-subtask-delete { + background-color: #f7f7f7; + position: absolute; + float: left; + width: 60%; + margin-top: 0; + margin-left: 13%; + padding-bottom: 2%; + padding-left: 3%; + padding-right: 3%; + z-index: 17; + border-radius: 3px; +} +.js-confirm-subtask-delete p { + position: relative; + margin-top: 3%; + width: 100%; + text-align: center; +} +.js-confirm-subtask-delete p span { + font-weight: bold; +} +.js-confirm-subtask-delete p i { + font-size: 2em; +} +.js-confirm-subtask-delete .js-subtask-delete-buttons { + position: relative; + padding: left 2% right 2%; +} +.js-confirm-subtask-delete .js-subtask-delete-buttons .confirm-subtask-delete { + margin-left: 12%; + float: left; +} +.js-confirm-subtask-delete .js-subtask-delete-buttons .toggle-delete-subtask-dialog { + margin-right: 12%; + float: right; +} +#card-details-overlay { + top: 0; + bottom: -600px; + right: 0; +} +.subtasks { + background: #f7f7f7; +} +.subtasks.placeholder { + background: #ccc; + border-radius: 2px; +} +.subtasks.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(4deg); + cursor: grabbing; +} +.subtasks-item { + margin: 0 0 0 0.1em; + line-height: 18px; + font-size: 1.1em; + margin-top: 3px; + display: flex; + background: #f7f7f7; +} +.subtasks-item.placeholder { + background: #ccc; + border-radius: 2px; +} +.subtasks-item.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(4deg); + cursor: grabbing; +} +.subtasks-item:hover { + background-color: #ebebeb; +} +.subtasks-item .check-box { + margin: 0.1em 0 0 0; +} +.subtasks-item .check-box.is-checked { + border-bottom: 2px solid #3cb500; + border-right: 2px solid #3cb500; +} +.subtasks-item .item-title { + flex: 1; + padding-left: 10px; +} +.subtasks-item .item-title.is-checked { + color: #8c8c8c; + font-style: italic; +} +.subtasks-item .item-title .viewer p { + margin-bottom: 2px; +} +.js-delete-subtask-item { + margin: 0 0 0.5em 1.33em; + padding: 12px 0 0 0; +} +.add-subtask-item { + margin: 0.2em 0 0.5em 1.33em; + display: inline-block; +} +.subtask-details-menu { + float: right; + padding: 6px 10px 6px 10px; +} diff --git a/client/components/cards/subtasks.styl b/client/components/cards/subtasks.styl deleted file mode 100644 index 357f8973a..000000000 --- a/client/components/cards/subtasks.styl +++ /dev/null @@ -1,146 +0,0 @@ -.js-add-subtask - color: #8c8c8c - -textarea.js-add-subtask-item, textarea.js-edit-subtask-item - overflow: hidden - word-wrap: break-word - resize: none - height: 34px - -.delete-text - color: #8c8c8c - text-decoration: underline - word-wrap: break-word - float: right - padding-top: 6px - &:hover - color: inherit - -.subtask-title - .checkbox - float: left - width: 30px - height 30px - font-size: 18px - line-height: 30px - - .title - font-size: 18px - line-height: 25px - - .subtasks-stat - margin: 0 0.5em - float: right - padding-top: 6px - &.is-finished - color: #3cb500 - - .js-delete-subtask - @extends .delete-text - margin: 0 0.5em - - .js-view-subtask - @extends .delete-text - -.js-confirm-subtask-delete - background-color: darken(white, 3%) - position: absolute - float: left; - width: 60% - margin-top: 0 - margin-left: 13% - padding-bottom: 2% - padding-left: 3% - padding-right: 3% - z-index: 17 - border-radius: 3px - - p - position: relative - margin-top: 3% - width: 100% - text-align: center - span - font-weight: bold - - i - font-size: 2em - - .js-subtask-delete-buttons - position: relative - padding: left 2% right 2% - .confirm-subtask-delete - margin-left: 12% - float: left - .toggle-delete-subtask-dialog - margin-right: 12% - float: right - -#card-details-overlay - top: 0 - bottom: -600px - right: 0 - -.subtasks - background: darken(white, 3%) - - &.placeholder - background: darken(white, 20%) - border-radius: 2px - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(4deg) - cursor: grabbing - - -.subtasks-item - margin: 0 0 0 0.1em - line-height: 18px - font-size: 1.1em - margin-top: 3px - display: flex - background: darken(white, 3%) - - &.placeholder - background: darken(white, 20%) - border-radius: 2px - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(4deg) - cursor: grabbing - - &:hover - background-color: darken(white, 8%) - - .check-box - margin: 0.1em 0 0 0; - &.is-checked - border-bottom: 2px solid #3cb500 - border-right: 2px solid #3cb500 - - .item-title - flex: 1 - padding-left: 10px; - &.is-checked - color: #8c8c8c - font-style: italic - & .viewer - p - margin-bottom: 2px - -.js-delete-subtask-item - margin: 0 0 0.5em 1.33em - @extends .delete-text - padding: 12px 0 0 0 - -.add-subtask-item - margin: 0.2em 0 0.5em 1.33em - display: inline-block - -.subtask-details-menu - float: right - padding: 6px 10px 6px 10px diff --git a/client/components/forms/datepicker.css b/client/components/forms/datepicker.css new file mode 100644 index 000000000..f0adcab6c --- /dev/null +++ b/client/components/forms/datepicker.css @@ -0,0 +1,22 @@ +.datepicker-container .fields .left { + width: 56%; +} +.datepicker-container .fields .right { + width: 38%; +} +.datepicker-container .datepicker { + width: 100%; +} +.datepicker-container .datepicker table { + width: 100%; + border: none; + border-spacing: 0; + border-collapse: collapse; +} +.datepicker-container .datepicker table thead { + background: none; +} +.datepicker-container .datepicker table td, +.datepicker-container .datepicker table th { + box-sizing: border-box; +} diff --git a/client/components/forms/datepicker.styl b/client/components/forms/datepicker.styl deleted file mode 100644 index a25580948..000000000 --- a/client/components/forms/datepicker.styl +++ /dev/null @@ -1,17 +0,0 @@ -.datepicker-container - .fields - .left - width: 56% - .right - width: 38% - .datepicker - width: 100% - table - width: 100% - border: none - border-spacing: 0 - border-collapse: collapse - thead - background: none - td, th - box-sizing: border-box \ No newline at end of file diff --git a/client/components/forms/forms.css b/client/components/forms/forms.css new file mode 100644 index 000000000..603d1552b --- /dev/null +++ b/client/components/forms/forms.css @@ -0,0 +1,736 @@ +select, +textarea, +input:not([type=file]), +button { + box-sizing: border-box; + background-color: #ebebeb; + border: 1px solid #ccc; + border-radius: 3px; + display: block; + margin-bottom: 12px; + min-height: 34px; + padding: 7px; +} +select.full, +textarea.full, +input:not([type=file]).full, +button.full { + width: 100%; +} +select.input-error, +textarea.input-error, +input:not([type=file]).input-error, +button.input-error { + background-color: #ece9e9; + border-color: #ba1212; +} +select:focus, +textarea:focus, +input:not([type=file]):focus, +button:focus { + outline: 0; +} +input[type="file"] { + margin-bottom: 16px; +} +input[type="radio"] { + -webkit-appearance: radio; + min-height: inherit; +} +input[type="text"], +input[type="password"], +input[type="email"] { + transition: background 85ms ease-in, border-color 85ms ease-in; + width: 250px; +} +input[type="text"].inline-input, +input[type="password"].inline-input, +input[type="email"].inline-input { + background: none; + border: 0; + margin: 0; + padding: 2px; + min-height: 0; + height: 18px; + width: 200px; +} +input[type="text"].full-line, +input[type="password"].full-line, +input[type="email"].full-line { + width: 100%; +} +input[type="email"]:invalid { + box-shadow: none; +} +input[type="text"]:hover, +input[type="password"]:hover, +input[type="email"]:hover, +textarea:hover { + border-color: #999; +} +input[type="text"]:hover.input-error, +input[type="password"]:hover.input-error, +input[type="email"]:hover.input-error, +textarea:hover.input-error { + border-color: #ba1212; +} +input[type="text"]:focus, +input[type="password"]:focus, +input[type="email"]:focus, +textarea:focus { + background: #fff; + border-color: #318ec4; + box-shadow: 0 0 2px #318ec4; +} +input[type="text"]:focus.input-error, +input[type="password"]:focus.input-error, +input[type="email"]:focus.input-error, +textarea:focus.input-error { + background-color: #f8f7f7; + border-color: #ba1212; + box-shadow: 0 0 2px #d11515; +} +input[type="text"]:disabled, +input[type="password"]:disabled, +input[type="email"]:disabled, +textarea:disabled { + background-color: #dcdcdc; + border-color: #bfbfbf; + color: #8c8c8c; + -webkit-touch-callout: none; + user-select: none; +} +select { + max-height: 300px; + width: 256px; + margin-bottom: 8px; +} +select.inline { + width: 100%; +} +option[disabled] { + color: #8c8c8c; +} +textarea { + height: 150px; + transition: background 85ms ease-in, border-color 85ms ease-in; + resize: vertical; + width: 100%; +} +textarea.editor { + resize: none; + padding-bottom: 22px; +} +.button { + border-radius: 3px; + text-decoration: none; + position: relative; +} +input[type="submit"], +button { + background: #cfcfcf; + background: linear-gradient(#cfcfcf, #c2c2c2); + border: none; + cursor: pointer; + display: inline-block; + font-weight: 700; + line-height: 22px; + padding: 7px 20px; + text-align: center; +} +input[type="submit"] .wide, +button .wide { + padding-left: 30px; + padding-right: 30px; +} +input[type="submit"]:hover, +button:hover, +input[type="submit"]:focus, +button:focus { + background: #c2c2c2; + background: linear-gradient(#c2c2c2, #b5b5b5); +} +input[type="submit"]:active, +button:active { + background: #b5b5b5; + background: linear-gradient(#b5b5b5, #a8a8a8); + box-shadow: inset 0 3px 6px rgba(0,0,0,0.1); +} +input[type="submit"]:active:hover, +button:active:hover, +input[type="submit"]:active:focus, +button:active:focus, +input[type="submit"]:active:active, +button:active:active { + background: #e6e6e6; + background: linear-gradient(#e6e6e6, #e6e6e6); +} +input[type="submit"].primary, +button.primary { + background: #005377; + box-shadow: 0 1px 0 #4d4d4d; + color: #fff; +} +input[type="submit"].primary:hover, +button.primary:hover, +input[type="submit"].primary:focus, +button.primary:focus { + background: #004766; +} +input[type="submit"].primary:active, +button.primary:active { + background: #01628c; +} +input[type="submit"].negate:hover, +button.negate:hover, +input[type="submit"].negate:focus, +button.negate:focus { + background: #990f0f; + background: linear-gradient(#990f0f, #7d0c0c); + box-shadow: 0 1px 0 #4d4d4d; + color: #fff; +} +input[type="submit"].negate:active, +button.negate:active { + background: #7d0c0c; + box-shadow: 0 1px 0 #4d4d4d; + color: #fff; +} +input[type="submit"] i.fa, +button i.fa { + margin-right: 10px; +} +input[type="submit"].disabled, +input[type="submit"]:disabled, +input[type="button"].disabled, +button.disabled, +.button.disabled, +input[type="submit"].disabled:hover, +input[type="submit"]:disabled:hover, +input[type="button"].disabled:hover, +button.disabled:hover, +.button.disabled:hover, +input[type="submit"].disabled:active, +input[type="submit"]:disabled:active, +input[type="button"].disabled:active, +button.disabled:active, +.button.disabled:active { + background: #cfcfcf; + cursor: default; + box-shadow: none; + color: #a8a8a8; +} +fieldset { + border: 1px solid #bfbfbf; + padding: 15px; + margin-bottom: 15px; +} +input[type="hidden"] { + display: none; +} +.radio-div, +.check-div { + display: block; + margin: 0 0 4px 20px; + min-height: 20px; + position: relative; +} +.radio-div input, +.check-div input { + left: -18px; + min-height: 0; + margin: 0; + padding: 0; + position: absolute; + top: 2px; +} +.radio-div label, +.check-div label { + font-weight: 400; +} +label { + display: block; + font-weight: 700; + margin-bottom: 4px; +} +label.form-error { + color: #ba1212; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder, +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #8c8c8c; +} +.edit-controls, +.add-controls { + display: flex; + align-items: center; + margin-top: 0px; + margin-bottom: 12px; +} +.edit-controls button[type=submit], +.add-controls button[type=submit], +.edit-controls input[type=button], +.add-controls input[type=button] { + float: left; + height: 32px; + margin-bottom: 0px; +} +.edit-controls .fa-times-thin, +.add-controls .fa-times-thin { + font-size: 26px; + margin: 3px 10px; +} +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + left: -9999px; + visibility: hidden; + display: none; +} +.materialCheckBox { + position: relative; + width: 13px; + height: 13px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + transition: 0.2s; + margin: 0; + cursor: pointer; +} +.materialCheckBox.is-checked { + top: -4px; + left: -3px; + width: 7px; + height: 15px; + margin-right: 6px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + transform: rotate(40deg); + -webkit-backface-visibility: hidden; + transform-origin: 100% 100%; +} +.button-link { + background: #fff; + background: linear-gradient(#fff, #f5f5f5); + border-radius: 3px; + box-sizing: border-box; + user-select: none; + border: 1px solid #e3e3e3; + border-bottom-color: #c2c2c2; + cursor: pointer; + display: block; + font-weight: 700; + height: 34px; + margin-top: 6px; + max-width: 300px; + padding: 7px; + position: relative; + text-decoration: none; + overflow: ellipsis; +} +.button-link .on { + background: #48b512; + background: linear-gradient(#48b512, #3d990f); + border-radius: 3px; + color: #fff; + display: none; + font-size: 12px; + font-weight: 700; + height: 17px; + line-height: 17px; + margin: 0; + padding: 2px 4px; + position: absolute; + right: 5px; + top: 5px; + text-align: center; +} +.button-link.is-on { + padding-right: 30px; + max-width: 196px; +} +.button-link.is-on .on { + display: block; +} +.button-link.inline { + color: #666; + padding: 2px 14px; + margin-left: 4px; +} +.button-link.setting { + height: 52px; + float: left; + position: relative; + margin-top: 0; +} +.button-link.setting.disabled { + background: #fff; + border-color: #e9e9e9; + color: #8c8c8c; + cursor: default; +} +.button-link.setting.disabled select { + display: none; +} +.button-link.setting.disabled:hover .label { + color: #8c8c8c; +} +.button-link.setting.disabled, +.button-link.setting.disabled:hover, +.button-link.setting.disabled:active, +.button-link.setting.disabled.primary, +.button-link.setting.disabled.primary:hover, +.button-link.setting.disabled.primary:active { + background: #cfcfcf; + border-color: #c2c2c2; + border-bottom-color: #b5b5b5; + cursor: default; + box-shadow: none; + color: #a8a8a8; +} +.button-link.setting .label { + color: #8c8c8c; + display: block; + font-size: 12px; + line-height: 14px; + margin-bottom: 0; +} +.button-link.setting:hover .label { + color: #eee; +} +.button-link.setting .value { + display: block; + font-size: 18px; + line-height: 24px; + overflow: hidden; + text-overflow: ellipsis; +} +.button-link.setting label { + display: none; +} +.button-link.setting select { + border: none; + cursor: pointer; + height: 50px; + left: 0; + margin: 0; + opacity: 0; + position: absolute; + top: 0; + z-index: 2; + width: 100%; +} +.button-link:hover { + background: #318ec4; + background: linear-gradient(#318ec4, #2b7cab); + border-color: #2e85b8; + color: #fff; +} +.button-link:hover .on { + background-image: none; + background-color: rgba(255,255,255,0.3); + border-color: transparent; +} +.button-link:active { + background: #2e85b8; + background: linear-gradient(#2e85b8, #28739f); + border-color: #2b7cab; + color: #fff; +} +.button-link .button-link.negate:hover { + background: #990f0f; + background: linear-gradient(#990f0f, #7d0c0c); + border-color: linear-gradient(#990f0f, #7d0c0c); +} +.button-link .button-link.negate:active { + background: #7d0c0c; + border-color: #990f0f; +} +.button-link.primary { + background: #48b512; + background: linear-gradient(#48b512, #3d990f); + border: 1px solid; + border-color: #3d990f; + color: #fff; +} +.button-link.primary:hover { + background: #3d990f; + background: linear-gradient(#3d990f, #327d0c); + border-color: #3d990f; +} +.button-link.danger { + background: #ba1212; + background: linear-gradient(#ba1212, #8b0e0e); + border: 1px solid; + border-color: #a21010; + color: #fff; +} +.button-link.danger:hover { + background: #a21010; + background: linear-gradient(#a21010, #740b0b); + border-color: #8b0e0e; +} +button.quiet-button, +button.loud-text-button { + background: none; + text-align: left; + line-height: normal; + border: none; + box-shadow: none; +} +button.quiet-button:active, +button.loud-text-button:active { + color: #4d4d4d; + background: #d3d3d3; + box-shadow: none; +} +button.quiet-button { + font-weight: 400; + text-decoration: underline; +} +button.loud-text-button { + width: 100%; +} +button.loud-text-button:hover { + color: #111; +} +.emphasis-button, +.quiet-button { + border-radius: 3px; + user-select: none; + color: #8c8c8c; + display: block; + margin: 2px 0; + padding: 6px 8px; + position: relative; +} +.emphasis-button.w-img, +.quiet-button.w-img { + padding-left: 28px; +} +.emphasis-button:hover, +.quiet-button:hover { + color: #4d4d4d; + background: #dcdcdc; +} +.emphasis-button:active, +.quiet-button:active { + color: #4d4d4d; + background: #d3d3d3; +} +.quiet-button-large { + padding: 16px 24px; +} +.emphasis-button { + color: #74663e; + background: #ecdfbb; +} +.emphasis-button:hover { + color: #53492d; + background: #e7d6a7; +} +.emphasis-button:active { + color: #53492d; + background: #e1cc93; +} +.is-editable { + cursor: pointer; +} +.big-link { + border-radius: 3px; + display: block; + margin: 6px 0 6px 40px; + padding: 11px; + position: relative; + text-decoration: none; + font-size: 16px; + line-height: 20px; +} +.big-link .text { + text-decoration: underline; +} +.big-link:hover { + background: #dcdcdc; +} +.big-link.options { + padding-right: 41px; +} +.big-link .option { + height: 30px; + width: 30px; + position: absolute; + right: 6px; + top: 6px; +} +.big-link.none { + color: #8c8c8c; + text-decoration: none; +} +.big-link.none:hover { + background: transparent; +} +.big-link.avatar-changer { + padding-right: 51px; +} +.big-link.avatar-changer .member { + border: 1px solid #ccc; + border-radius: 3px; + height: 40px; + width: 40px; + position: absolute; + right: 0; + top: 0; +} +.big-link.avatar-changer .member .member-avatar { + height: 40px; + width: 40px; +} +.big-link.avatar-changer .member .member-initials { + font-size: 16px; + height: 40px; + line-height: 40px; + max-height: 40px; +} +.show-more { + border-radius: 3px; + color: #8c8c8c; + display: block; + padding: 16px 8px 16px 40px; + margin: 8px 0; +} +.show-more:hover { + background: #dcdcdc; + text-decoration: underline; +} +.show-more.compact { + padding: 12px 8px; + margin: 8px 0 0; + text-align: center; +} +.board-widget .show-more { + padding: 12px 8px 12px 40px; +} +.uploader { + clear: both; + cursor: pointer; + position: relative; + height: 34px; + width: 100%; +} +.uploader .realfile { + cursor: pointer; + height: 34px; + line-height: 34px; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 2; + font-size: 23px; +} +.uploader .realfile input[type="file"] { + cursor: pointer; + height: 34px; + line-height: 34px; + margin: 0; + opacity: 0; + padding: 0; + width: 100%; + z-index: 2; + font-size: 23px; +} +.uploader:hover .fakefile { + background: #318ec4; + background: linear-gradient(#318ec4, #2b7cab); + border-color: #2e85b8; + color: #fff; +} +.dropdown-menu { + border-radius: 2px; + overflow: hidden; +} +.dropdown-menu li { + border-top: none; +} +.dropdown-menu li a { + padding: 4px 12px 4px 8px; +} +.dropdown-menu li a img { + width: 18px; + height: 18px; + margin-right: 5px; + vertical-align: middle; +} +.dropdown-menu li a .minicard-label { + width: 11px; + height: 11px; + border-radius: 2px; + margin: 2px 7px -2px -2px; + display: inline-block; +} +.dropdown-menu li.active { + background: #005377; +} +.dropdown-menu li.active a, +.dropdown-menu li.active .quiet { + color: #fff; +} +.material-toggle-switch { + display: flex; +} +.toggle-label { + position: relative; + display: block; + height: 20px; + width: 44px; + background-color: #a6a6a6; + border-radius: 100px; + cursor: pointer; + transition: all 0.3s ease; +} +.toggle-label:after { + position: absolute; + left: -2px; + top: -3px; + display: block; + width: 26px; + height: 26px; + border-radius: 100px; + background-color: #fff; + box-shadow: 0px 3px 3px rgba(0,0,0,0.05); + content: ''; + transition: all 0.3s ease; +} +.toggle-label:active:after { + transform: scale(1.15, 0.85); +} +.toggle-switch:checked ~ .toggle-label { + background-color: #6fbeb5; +} +.toggle-switch:checked ~ .toggle-label:after { + left: 20px; + background-color: #179588; +} +.toggle-switch:checked:disabled ~ .toggle-label { + background-color: #d5d5d5; + pointer-events: none; +} +.toggle-switch:checked:disabled ~ .toggle-label:after { + background-color: #bcbdbc; +} +.toggle-switch { + display: none; +} +.toggle-switch-title { + margin: 0 0.5em; + display: flex; +} +@media screen and (max-width: 800px) { + .edit-controls .fa-times-thin, + .add-controls .fa-times-thin { + margin: 3px 20px; + } +} diff --git a/client/components/forms/forms.styl b/client/components/forms/forms.styl deleted file mode 100644 index 69e470109..000000000 --- a/client/components/forms/forms.styl +++ /dev/null @@ -1,695 +0,0 @@ -@import 'nib' - -select, -textarea, -input:not([type=file]), -button - box-sizing: border-box - background-color: #ebebeb - border: 1px solid #ccc - border-radius: 3px - display: block - margin-bottom: 12px - min-height: 34px - padding: 7px - - &.full - width: 100% - - &.input-error - background-color: #ece9e9 - border-color: #ba1212 - - &:focus - outline: 0 - -input[type="file"] - margin-bottom: 16px - -input[type="radio"] - -webkit-appearance: radio - min-height: inherit - -input[type="text"], -input[type="password"], -input[type="email"] - transition: background 85ms ease-in, - border-color 85ms ease-in - width: 250px - - &.inline-input - background: none - border: 0 - margin: 0 - padding: 2px - min-height: 0 - height: 18px - width: 200px - - &.full-line - width: 100% - -input[type="email"]:invalid - box-shadow: none - -input[type="text"], -input[type="password"], -input[type="email"], -textarea - - &:hover - border-color: #999 - - &.input-error - border-color: #ba1212 - - &:focus - background: #fff - border-color: #318ec4 - box-shadow: 0 0 2px #318ec4 - - &.input-error - background-color: #f8f7f7 - border-color: #ba1212 - box-shadow: 0 0 2px #d11515 - - &:disabled - background-color: #dcdcdc - border-color: #bfbfbf - color: #8c8c8c - -webkit-touch-callout: none - user-select: none - -select - max-height: 300px - width: 256px - margin-bottom: 8px - - &.inline - width: 100% - -option[disabled] - color: #8c8c8c - -textarea - height: 150px - transition: background 85ms ease-in, - border-color 85ms ease-in - resize: vertical - width: 100% - - &.editor - resize: none - padding-bottom: 22px - - -.button - border-radius: 3px - text-decoration: none - position: relative - -input[type="submit"], -button - background: #cfcfcf - background: linear-gradient(#cfcfcf, #c2c2c2) - border: none - cursor: pointer - display: inline-block - font-weight: 700 - line-height: 22px - padding: 7px 20px - text-align: center - - .wide - padding-left: 30px - padding-right: 30px - - &:hover, - &:focus - background: #c2c2c2 - background: linear-gradient(#c2c2c2, #b5b5b5) - - &:active - background: #b5b5b5 - background: linear-gradient(#b5b5b5, #a8a8a8) - box-shadow: inset 0 3px 6px rgba(0, 0, 0, .1) - - &:hover, - &:focus, - &:active - background: #e6e6e6 - background: linear-gradient(#e6e6e6, #e6e6e6) - - &.primary - background: #005377 - box-shadow: 0 1px 0 #4d4d4d - color: white - - &:hover, - &:focus - background: #004766 - - &:active - background: #01628C - - &.negate - &:hover, - &:focus - background: #990f0f - background: linear-gradient(#990f0f, #7d0c0c) - box-shadow: 0 1px 0 #4d4d4d - color: #fff - - &:active - background: #7d0c0c - box-shadow: 0 1px 0 #4d4d4d - color: #fff - - i.fa - margin-right: 10px - -input[type="submit"].disabled, -input[type="submit"]:disabled, -input[type="button"].disabled, -button.disabled, -.button.disabled - - &, - &:hover, - &:active - background: #cfcfcf - cursor: default - box-shadow: none - color: #a8a8a8 - -fieldset - border: 1px solid #bfbfbf - padding: 15px - margin-bottom: 15px - -input[type="hidden"] - display: none - -.radio-div, -.check-div - display: block - margin: 0 0 4px 20px - min-height: 20px - position: relative - - input - left: -18px - min-height: 0 - margin: 0 - padding: 0 - position: absolute - top: 2px - - label - font-weight: 400 - -label - display: block - font-weight: 700 - margin-bottom: 4px - - &.form-error - color: #ba1212 - -input, -textarea - &::-webkit-input-placeholder, - &::-moz-placeholder - color: #8c8c8c - -.edit-controls, -.add-controls - display: flex - align-items: center - margin-top: 0px - margin-bottom: 12px - - button[type=submit] - input[type=button] - float: left - height: 32px - margin-bottom: 0px - - .fa-times-thin - font-size: 26px - margin: 3px 10px - -// Material Design checkboxes - [type="checkbox"]:not(:checked), - [type="checkbox"]:checked - position: absolute - left: -9999px - visibility: hidden - display: none - -.materialCheckBox - position: relative - width: 13px - height: @width - z-index: 0 - border: 2px solid #5a5a5a - border-radius: 1px - transition: .2s - margin: 0 - cursor: pointer - - &.is-checked - top: -4px - left: -3px - width: 7px - height: 15px - margin-right: 6px - border-top: 2px solid transparent - border-left: 2px solid transparent - transform: rotate(40deg) - -webkit-backface-visibility: hidden - transform-origin: 100% 100% - -.button-link - background: #fff - background: linear-gradient(#fff, #f5f5f5) - border-radius: 3px - box-sizing: border-box - user-select: none - border: 1px solid #e3e3e3 - border-bottom-color: #c2c2c2 - cursor: pointer - display: block - font-weight: 700 - height: 34px - margin-top: 6px - max-width: 300px - padding: 7px - position: relative - text-decoration: none - overflow: ellipsis - - .on - background: #48b512 - background: linear-gradient(#48b512, #3d990f) - border-radius: 3px - color: #fff - display: none - font-size: 12px - font-weight: 700 - height: 17px - line-height: @height - margin: 0 - padding: 2px 4px - position: absolute - right: 5px - top: 5px - text-align: center - - &.is-on - padding-right: 30px - max-width: 196px - - .on - display: block - - &.inline - color: #666 - padding: 2px 14px - margin-left: 4px - - &.setting - height: 52px - float: left - position: relative - margin-top: 0 - - &.disabled - background: #fff - border-color: #e9e9e9 - color: #8c8c8c - cursor: default - - select - display: none - - &:hover .label - color: #8c8c8c - - &, - &:hover, - &:active, - &.primary, - &.primary:hover, - &.primary:active - background: #cfcfcf - border-color: #c2c2c2 - border-bottom-color: #b5b5b5 - cursor: default - box-shadow: none - color: #a8a8a8 - - .label - color: #8c8c8c - display: block - font-size: 12px - line-height: 14px - margin-bottom: 0 - - &:hover .label - color: #eee - - .value - display: block - font-size: 18px - line-height: 24px - overflow: hidden - text-overflow: ellipsis - - label - display: none - - select - border: none - cursor: pointer - height: 50px - left: 0 - margin: 0 - opacity: 0 - position: absolute - top: 0 - z-index: 2 - width: 100% - - &:hover - background: #318ec4 - background: linear-gradient(#318ec4, #2b7cab) - border-color: #2e85b8 - color: #fff - - .on - background-image: none - background-color: rgba(255, 255, 255, .3) - border-color: transparent - - &:active - background: #2e85b8 - background: linear-gradient(#2e85b8, #28739f) - border-color: #2b7cab - color: #fff - - .button-link.negate - - &:hover - background: #990f0f - background: linear-gradient(#990f0f, #7d0c0c) - border-color: @background - - &:active - background: #7d0c0c - border-color: #990f0f - - - &.primary - background: #48b512 - background: linear-gradient(#48b512, #3d990f) - border: 1px solid - border-color: #3d990f - color: #fff - - &:hover - background: #3d990f - background: linear-gradient(#3d990f, #327d0c) - border-color: #3d990f - - &.danger - background: #ba1212 - background: linear-gradient(#ba1212, #8b0e0e) - border: 1px solid - border-color: #a21010 - color: #fff - - &:hover - background: #a21010 - background: linear-gradient(#a21010, #740b0b) - border-color: #8b0e0e - -button - &.quiet-button, - &.loud-text-button - background: none - text-align: left - line-height: normal - border: none - box-shadow: none - - &:active - color: #4d4d4d - background: #d3d3d3 - box-shadow: none - - &.quiet-button - font-weight: 400 - text-decoration: underline - - &.loud-text-button - width: 100% - - &:hover - color: #111 - -.emphasis-button, -.quiet-button - border-radius: 3px - user-select: none - color: #8c8c8c - display: block - margin: 2px 0 - padding: 6px 8px - position: relative - - &.w-img - padding-left: 28px - - &:hover - color: #4d4d4d - background: #dcdcdc - - &:active - color: #4d4d4d - background: #d3d3d3 - -.quiet-button-large - padding: 16px 24px - -.emphasis-button - color: #74663e - background: #ecdfbb - - &:hover - color: #53492d - background: #e7d6a7 - - &:active - color: #53492d - background: #e1cc93 - -.is-editable - cursor: pointer - -.big-link - border-radius: 3px - display: block - margin: 6px 0 6px 40px - padding: 11px - position: relative - text-decoration: none - font-size: 16px - line-height: 20px - - .text - text-decoration: underline - - &:hover - background: #dcdcdc - - &.options - padding-right: 41px - - .option - height: 30px - width: @height - position: absolute - right: 6px - top: 6px - - &.none - color: #8c8c8c - text-decoration: none - - &:hover - background: transparent - - &.avatar-changer - padding-right: 51px - - .member - border: 1px solid #ccc - border-radius: 3px - height: 40px - width: @height - position: absolute - right: 0 - top: 0 - - .member-avatar - height: 40px - width: @height - - .member-initials - font-size: 16px - height: 40px - line-height: @height - max-height: @height - -.show-more - border-radius: 3px - color: #8c8c8c - display: block - padding: 16px 8px 16px 40px - margin: 8px 0 - - &:hover - background: #dcdcdc - text-decoration: underline - - &.compact - padding: 12px 8px - margin: 8px 0 0 - text-align: center - -.board-widget .show-more - padding: 12px 8px 12px 40px - -.uploader - clear: both - cursor: pointer - position: relative - height: 34px - width: 100% - - .realfile - cursor: pointer - height: 34px - line-height: @height - position: absolute - top: 0 - left: 0 - width: 100% - z-index: 2 - font-size: 23px - - input[type="file"] - cursor: pointer - height: 34px - line-height: @height - margin: 0 - opacity: 0 - padding: 0 - width: 100% - z-index: 2 - font-size: 23px - - &:hover .fakefile - background: #318ec4 - background: linear-gradient(#318ec4, #2b7cab) - border-color: #2e85b8 - color: #fff - -.dropdown-menu - border-radius: 2px - overflow: hidden - - li - border-top: none - - a - padding: 4px 12px 4px 8px - - img - width: 18px - height: @width - margin-right: 5px - vertical-align: middle - - .minicard-label - width: 11px - height: @width - border-radius: 2px - margin: 2px 7px -2px -2px - display: inline-block - - &.active - background: #005377 - - a, .quiet - color: white - -// Material Design Toggle Switch -.material-toggle-switch - display: flex - -.toggle-label - position: relative - display: block - height: 20px - width: 44px - background-color: #a6a6a6 - border-radius: 100px - cursor: pointer - transition: all 0.3s ease - - &:after - position: absolute - left: -2px - top: -3px - display: block - width: 26px - height: 26px - border-radius: 100px - background-color: #fff - box-shadow: 0px 3px 3px rgba(0,0,0,0.05) - content: '' - transition: all 0.3s ease - - &:active - &:after - transform: scale(1.15, 0.85) - -.toggle-switch:checked ~ .toggle-label - background-color: #6fbeb5 - - &:after - left: 20px - background-color: #179588 - -.toggle-switch:checked:disabled ~ .toggle-label - background-color: #d5d5d5 - pointer-events: none - - &:after - background-color: #bcbdbc - -.toggle-switch - display: none - -.toggle-switch-title - margin: 0 0.5em - display: flex - - -@media screen and (max-width: 800px) - .edit-controls, - .add-controls - .fa-times-thin - margin: 3px 20px diff --git a/client/components/import/import.css b/client/components/import/import.css new file mode 100644 index 000000000..8c8350b02 --- /dev/null +++ b/client/components/import/import.css @@ -0,0 +1,51 @@ +.map-members:after { + content: ""; + flex: auto; +} +.map-members .mapping-list { + display: flex; + flex-wrap: wrap; + margin: 0 -4px; +} +.map-members .mapping-list .mapping-item { + max-width: 300px; + min-width: 200px; + padding: 6px; + margin: 5px; + flex: 1; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); +} +.map-members .mapping-list .mapping-item:hover { + background: #f2f2f2; +} +.map-members .mapping-list .mapping-item.filled { + background: #e0ffe5; +} +.map-members .mapping-list .mapping-item.filled:hover { + background: #ffe0e0; +} +.map-members .mapping-list .mapping-item.ghost-item { + height: 0; + visibility: hidden; + border: none; +} +.map-members .mapping-list .profile-source { + display: inline-block; + width: 80%; +} +.map-members .mapping-list .wekan { + display: inline-block; + width: 35px; +} +.map-members .mapping-list .wekan .member { + float: none; +} +a.show-mapping { + text-decoration: underline; +} +.import-members-map-note { + font-size: 90%; + font-weight: bold; +} diff --git a/client/components/import/import.styl b/client/components/import/import.styl deleted file mode 100644 index d34048495..000000000 --- a/client/components/import/import.styl +++ /dev/null @@ -1,53 +0,0 @@ -@import 'nib' - -.map-members - &:after - content: ""; - flex: auto; - - .mapping-list - display: flex - flex-wrap: wrap - margin: 0 -4px - - .mapping-item - max-width: 300px - min-width: 200px - padding: 6px - margin: 5px - flex:1 - background: white - border-radius: 3px - box-shadow: 0 1px 2px rgba(0,0,0,.15) - - &:hover - background: darken(white, 5%) - - &.filled - background: #E0FFE5 - - &:hover - background: #FFE0E0 - - &.ghost-item - height: 0 - visibility: hidden - border: none - - .profile-source - display: inline-block - width: 80% - - .wekan - display: inline-block - width: 35px - - .member - float: none - -a.show-mapping - text-decoration underline - -.import-members-map-note - font-size: 90% - font-weight: bold diff --git a/client/components/lists/list.css b/client/components/lists/list.css new file mode 100644 index 000000000..2988da7e4 --- /dev/null +++ b/client/components/lists/list.css @@ -0,0 +1,345 @@ +.list { + box-sizing: border-box; + display: flex; + flex-direction: column; + position: relative; + background: #dedede; + border-left: 1px solid #ccc; + padding: 0; + float: left; + min-width: 270px; + max-width: 270px; +} +.list:first-child { + margin-left: 5px; + border-left: none; +} +.card-details + .list { + border-left: none; +} +.list.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(4deg); + cursor: grabbing; +} +.list.ui-sortable-helper .list-header.ui-sortable-handle { + cursor: grabbing; +} +.list.placeholder { + background-color: rgba(0,0,0,0.2); + border-color: transparent; + box-shadow: none; + height: 100px; +} +.list.list-composer .open-list-composer, +.list .list-composer .open-list-composer { + color: #8c8c8c; +} +.list.list-composer .list-name-input, +.list .list-composer .list-name-input { + background: #fff; + margin: -3px 0 8px; +} +.list-header-add { + flex: 0 0 auto; + padding: 20px 12px 4px; + position: relative; + min-height: 20px; +} +.list-header { + flex: 0 0 auto; + padding: 20px 12px 4px; + position: relative; + min-height: 20px; + background-color: #e4e4e4; + border-bottom: 6px solid #e4e4e4; +} +.list-header.list-header-card-count { + min-height: 35px; + height: auto; +} +.list-header.ui-sortable-handle { + cursor: grab; +} +.list-header .list-header-left-icon { + display: none; +} +.list-header .list-header-name { + display: inline; + font-size: 16px; + line-height: 17px; + margin: 0; + font-weight: bold; + min-height: 9px; + min-width: 30px; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: break-word; +} +.list-header .list-header-watch-icon { + padding-left: 10px; + color: #a6a6a6; +} +.list-header .list-header-menu { + float: right; +} +.list-header .list-header-plus-top { + color: #a6a6a6; + margin-right: 15px; +} +.list-header .highlight { + color: #ce1414; +} +.list-header .cardCount { + color: #8c8c8c; + font-size: 12px; + font-weight: bold; +} +.list-header .list-header-plus-top, +.js-open-list-menu, +.list-header-menu a { + color: #4d4d4d; + padding-left: 4px; +} +.list-body { + flex: 1 1 auto; + flex-direction: column; + display: flex; + overflow-y: auto; + padding: 5px 11px; +} +.list-body .minicards { + flex-grow: 1; + flex-shrink: 0; +} +.list-body .minicards form { + margin-bottom: 9px; +} +.list-body .open-minicard-composer { + border-radius: 2px; + color: #8c8c8c; + display: block; + padding: 7px 10px; + position: relative; + text-decoration: none; + animation: fadeIn 0.3s; +} +.list-body .open-minicard-composer i.fa { + margin-right: 7px; +} +.list-body .open-minicard-composer:hover { + background: #fafafa; + color: #222; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} +#js-wip-limit-edit { + padding-top: 2%; +} +#js-wip-limit-edit p { + margin-bottom: 0; +} +#js-wip-limit-edit input { + display: inline-block; +} +#js-wip-limit-edit .wip-limit-value { + width: 20%; + margin-right: 5%; +} +#js-wip-limit-edit .wip-limit-error { + display: none; +} +#js-wip-limit-edit .soft-wip-limit { + margin-right: 8px; +} +#js-wip-limit-edit div { + float: left; +} +@media screen and (max-width: 800px) { + .mini-list { + flex: 0 0 60px; + height: auto; + width: 100%; + border-left: 0px; + border-bottom: 1px solid #ccc; + } + .list { + display: contents; + flex-basis: auto; + width: 100%; + border-left: 0px; + } + .list:first-child { + margin-left: 0px; + } + .list.ui-sortable-helper { + flex: 0 0 60px; + height: 60px; + width: 100%; + border-left: 0px; + border-bottom: 1px solid #ccc; + } + .list.ui-sortable-helper .list-header.ui-sortable-handle { + cursor: grabbing; + } + .list.placeholder { + flex: 0 0 60px; + height: 60px; + width: 100%; + border-left: 0px; + border-bottom: 1px solid #ccc; + } + .list-body { + padding: 15px 19px; + } + .list-header { + padding: 0 12px 0px; + border-bottom: 0px solid #e4e4e4; + height: 60px; + margin-top: 10px; + display: flex; + align-items: center; + } + .list-header .list-header-left-icon { + padding: 7px; + padding-right: 27px; + margin-top: 1px; + top: -7px; + left: -7px; + } + .list-header .list-header-menu-icon { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + right: 47px; + font-size: 20px; + } + .list-header .list-header-handle { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + right: 10px; + font-size: 24px; + } + .list-header { + display: grid; + grid-template-columns: 30px 5fr 1fr; + } + .list-header .list-header-left-icon { + display: grid; + grid-row: 1/3; + grid-column: 1; + } + .list-header .list-header-name { + grid-row: 1; + grid-column: 2; + align-self: end; + } + .list-header .cardCount { + grid-row: 2; + grid-column: 2; + align-self: start; + } + .list-header .list-header-menu { + grid-row: 1/3; + grid-column: 3; + } + .list-header .inlined-form { + grid-row: 1/3; + grid-column: 1/4; + } + .list-header .edit-controls { + align-items: initial; + } +} +.link-board-wrapper { + display: flex; + align-items: baseline; +} +.link-board-wrapper .js-link-board { + margin-left: 15px; +} +.search-card-results { + max-height: 250px; + overflow: hidden; +} +.sk-spinner-list { + margin-top: unset !important; +} +.list-header-white { + border-bottom: 6px solid #fff; + border: 1px solid #eee; +} +.list-header-green { + border-bottom: 6px solid #3cb500; +} +.list-header-yellow { + border-bottom: 6px solid #fad900; +} +.list-header-orange { + border-bottom: 6px solid #ff9f19; +} +.list-header-red { + border-bottom: 6px solid #eb4646; +} +.list-header-purple { + border-bottom: 6px solid #a632db; +} +.list-header-blue { + border-bottom: 6px solid #0079bf; +} +.list-header-pink { + border-bottom: 6px solid #ff78cb; +} +.list-header-sky { + border-bottom: 6px solid #00c2e0; +} +.list-header-black { + border-bottom: 6px solid #4d4d4d; +} +.list-header-lime { + border-bottom: 6px solid #51e898; +} +.list-header-silver { + border-bottom: 6px solid unset; +} +.list-header-peachpuff { + border-bottom: 6px solid #ffdab9; +} +.list-header-crimson { + border-bottom: 6px solid #dc143c; +} +.list-header-plum { + border-bottom: 6px solid #dda0dd; +} +.list-header-darkgreen { + border-bottom: 6px solid #006400; +} +.list-header-slateblue { + border-bottom: 6px solid #6a5acd; +} +.list-header-magenta { + border-bottom: 6px solid #f0f; +} +.list-header-gold { + border-bottom: 6px solid #ffd700; +} +.list-header-navy { + border-bottom: 6px solid #000080; +} +.list-header-gray { + border-bottom: 6px solid #808080; +} +.list-header-saddlebrown { + border-bottom: 6px solid #8b4513; +} +.list-header-paleturquoise { + border-bottom: 6px solid #afeeee; +} +.list-header-mistyrose { + border-bottom: 6px solid #ffe4e1; +} +.list-header-indigo { + border-bottom: 6px solid #4b0082; +} diff --git a/client/components/lists/list.styl b/client/components/lists/list.styl deleted file mode 100644 index ca394b9bb..000000000 --- a/client/components/lists/list.styl +++ /dev/null @@ -1,341 +0,0 @@ -@import 'nib' - -.list - box-sizing: border-box - display: flex - flex-direction: column - position: relative - // Even if this background color is the same as the body we can't leave it - // transparent, because that won't work during a list drag. - background: darken(white, 13%) - border-left: 1px solid darken(white, 20%) - padding: 0 - float: left - min-width: 270px - max-width: 270px - - &:first-child - margin-left: 5px - border-left: none - - .card-details + & - border-left: none - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(4deg) - cursor: grabbing - - .list-header.ui-sortable-handle - cursor: grabbing - - &.placeholder - background-color: rgba(0, 0, 0, .2) - border-color: transparent - box-shadow: none - height: 100px - - &.list-composer, & .list-composer - .open-list-composer - color: #8c8c8c - - .list-name-input - background: white - margin: -3px 0 8px - -.list-header-add - flex: 0 0 auto - padding: 20px 12px 4px - position: relative - min-height: 20px - -.list-header - flex: 0 0 auto - padding: 20px 12px 4px - position: relative - min-height: 20px - background-color: #e4e4e4; - border-bottom: 6px solid #e4e4e4; - - &.list-header-card-count - min-height: 35px - height: auto - - &.ui-sortable-handle - cursor: grab - - .list-header-left-icon - display: none - - .list-header-name - display: inline - font-size: 16px - line-height: 17px - margin: 0 - font-weight: bold - min-height: 9px - min-width: 30px - overflow: hidden - text-overflow: ellipsis - word-wrap: break-word - - - .list-header-watch-icon - padding-left: 10px - color: #a6a6a6 - - .list-header-menu - float: right - - .list-header-plus-top - color: #a6a6a6 - margin-right: 15px - - .highlight - color: #ce1414 - - .cardCount - color: #8c8c8c - font-size: 12px - font-weight: bold - -.list-header .list-header-plus-top, .js-open-list-menu, .list-header-menu a - color #4d4d4d - padding-left 4px - -.list-body - flex: 1 1 auto - flex-direction: column - display: flex - overflow-y: auto - padding: 5px 11px - - .minicards - flex-grow: 1 - flex-shrink: 0 - - form - margin-bottom: 9px - - .open-minicard-composer - border-radius: 2px - color: #8c8c8c - display: block - padding: 7px 10px - position: relative - text-decoration: none - animation: fadeIn 0.3s - - i.fa - margin-right: 7px - - &:hover - background: #fafafa - color: #222 - box-shadow: 0 1px 2px rgba(0,0,0,.2) - -#js-wip-limit-edit - padding-top: 2% - - p - margin-bottom: 0 - - input - display: inline-block - - .wip-limit-value - width: 20% - margin-right: 5% - - .wip-limit-error - display: none - - .soft-wip-limit - margin-right: 8px - - div - float: left - -@media screen and (max-width: 800px) - .mini-list - flex: 0 0 60px - height: auto - width: 100% - border-left: 0px - border-bottom: 1px solid darken(white, 20%) - - .list - display: contents - flex-basis: auto - width: 100% - border-left: 0px - &:first-child - margin-left: 0px - - &.ui-sortable-helper - flex: 0 0 60px - height: 60px - width: 100% - border-left: 0px - border-bottom: 1px solid darken(white, 20%) - - .list-header.ui-sortable-handle - cursor: grabbing - - &.placeholder - flex: 0 0 60px - height: 60px - width: 100% - border-left: 0px - border-bottom: 1px solid darken(white, 20%) - - .list-body - padding: 15px 19px; - - .list-header - padding: 0 12px 0px - border-bottom: 0px solid #e4e4e4 - height: 60px - margin-top: 10px - display: flex - align-items: center - .list-header-left-icon - padding: 7px - padding-right: 27px - margin-top: 1px - top: -@padding - left: -@padding - - .list-header-menu-icon - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - right: 47px - font-size: 20px - - .list-header-handle - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - right: 10px - font-size: 24px - - .list-header - display: grid - grid-template-columns: 30px 5fr 1fr - .list-header-left-icon - display: grid - grid-row: 1/3 - grid-column: 1 - .list-header-name - grid-row: 1 - grid-column: 2 - align-self: end - .cardCount - grid-row: 2 - grid-column: 2 - align-self: start - .list-header-menu - grid-row: 1/3 - grid-column: 3 - .inlined-form - grid-row: 1/3 - grid-column: 1/4 - .edit-controls - align-items: initial - -.link-board-wrapper - display: flex - align-items: baseline - - .js-link-board - margin-left: 15px - -.search-card-results - max-height: 250px - overflow: hidden - -.sk-spinner-list - margin-top: unset !important - -list-header-color(background, color...) - border-bottom: 6px solid background - -.list-header-white - list-header-color(#ffffff, #4d4d4d) //Black text for better visibility - border: 1px solid #eee - -.list-header-green - list-header-color(#3cb500, #ffffff) //White text for better visibility - -.list-header-yellow - list-header-color(#fad900, #4d4d4d) //Black text for better visibility - -.list-header-orange - list-header-color(#ff9f19, #4d4d4d) //Black text for better visibility - -.list-header-red - list-header-color(#eb4646, #ffffff) //White text for better visibility - -.list-header-purple - list-header-color(#a632db, #ffffff) //White text for better visibility - -.list-header-blue - list-header-color(#0079bf, #ffffff) //White text for better visibility - -.list-header-pink - list-header-color(#ff78cb, #4d4d4d) //Black text for better visibility - -.list-header-sky - list-header-color(#00c2e0, #ffffff) //White text for better visibility - -.list-header-black - list-header-color(#4d4d4d, #ffffff) //White text for better visibility - -.list-header-lime - list-header-color(#51e898, #4d4d4d) //Black text for better visibility - -.list-header-silver - list-header-color(unset, #4d4d4d) //Black text for better visibility - -.list-header-peachpuff - list-header-color(#ffdab9, #4d4d4d) //Black text for better visibility - -.list-header-crimson - list-header-color(#dc143c, #ffffff) //White text for better visibility - -.list-header-plum - list-header-color(#dda0dd, #4d4d4d) //Black text for better visibility - -.list-header-darkgreen - list-header-color(#006400, #ffffff) //White text for better visibility - -.list-header-slateblue - list-header-color(#6a5acd, #ffffff) //White text for better visibility - -.list-header-magenta - list-header-color(#ff00ff, #ffffff) //White text for better visibility - -.list-header-gold - list-header-color(#ffd700, #4d4d4d) //Black text for better visibility - -.list-header-navy - list-header-color(#000080, #ffffff) //White text for better visibility - -.list-header-gray - list-header-color(#808080, #ffffff) //White text for better visibility - -.list-header-saddlebrown - list-header-color(#8b4513, #ffffff) //White text for better visibility - -.list-header-paleturquoise - list-header-color(#afeeee, #4d4d4d) //Black text for better visibility - -.list-header-mistyrose - list-header-color(#ffe4e1, #4d4d4d) //Black text for better visibility - -.list-header-indigo - list-header-color(#4b0082, #ffffff) //White text for better visibility diff --git a/client/components/main/brokenCards.css b/client/components/main/brokenCards.css new file mode 100644 index 000000000..037730d22 --- /dev/null +++ b/client/components/main/brokenCards.css @@ -0,0 +1,28 @@ +.broken-cards-card-wrapper { + margin-top: 0; + margin-bottom: 10px; + border-width: 3px !important; + border-color: #808080 !important; + border-style: solid; + border-radius: 5px; + padding: 1.5rem; + background-color: #fff; +} +.broken-cards-wrapper { + max-width: 500px; + margin-right: auto; + margin-left: auto; +} +.broken-cards-card-title { + font-weight: bold; +} +.broken-cards-context { + display: inline-block; +} +.broken-cards-context-separator { + font-weight: bold; +} +.broken-cards-null { + color: #8b0000; + font-style: italic; +} diff --git a/client/components/main/brokenCards.styl b/client/components/main/brokenCards.styl deleted file mode 100644 index d9603cecb..000000000 --- a/client/components/main/brokenCards.styl +++ /dev/null @@ -1,31 +0,0 @@ -.broken-cards-card-wrapper - margin-top: 0 - margin-bottom: 10px - border-width: 3px !important - border-color: grey !important - border-style: solid - border-radius: 5px - padding: 1.5rem - background-color: white - -.broken-cards-wrapper - max-width: 500px - margin-right: auto - margin-left: auto - -.broken-cards-card-title - font-weight: bold - //padding: 10px - -.broken-cards-context - display: inline-block - -.broken-cards-context-separator - font-weight: bold - -.broken-cards-context-list - //margin-bottom: 0.7rem - -.broken-cards-null - color: darkred - font-style: italic diff --git a/client/components/main/dueCards.css b/client/components/main/dueCards.css new file mode 100644 index 000000000..34e8a5a17 --- /dev/null +++ b/client/components/main/dueCards.css @@ -0,0 +1,5 @@ +.due-cards-dueat-list-wrapper { + max-width: 500px; + margin-right: auto; + margin-left: auto; +} diff --git a/client/components/main/dueCards.styl b/client/components/main/dueCards.styl deleted file mode 100644 index 885555225..000000000 --- a/client/components/main/dueCards.styl +++ /dev/null @@ -1,4 +0,0 @@ -.due-cards-dueat-list-wrapper - max-width: 500px - margin-right: auto - margin-left: auto diff --git a/client/components/main/editor.css b/client/components/main/editor.css new file mode 100644 index 000000000..6883f903c --- /dev/null +++ b/client/components/main/editor.css @@ -0,0 +1,7 @@ +.new-comment a.fa.fa-copy, +.inlined-form a.fa.fa-copy { + float: right; + position: relative; + top: 20px; + right: 6px; +} diff --git a/client/components/main/editor.styl b/client/components/main/editor.styl deleted file mode 100644 index 07e1c627f..000000000 --- a/client/components/main/editor.styl +++ /dev/null @@ -1,7 +0,0 @@ -.new-comment, -.inlined-form - a.fa.fa-copy - float: right - position: relative - top: 20px - right: 6px diff --git a/client/components/main/fonts.css b/client/components/main/fonts.css new file mode 100644 index 000000000..d379569fb --- /dev/null +++ b/client/components/main/fonts.css @@ -0,0 +1,30 @@ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url("/fonts/roboto-regular.woff2") format('woff2'), url("/fonts/roboto-regular.woff") format('woff'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: local('Roboto Bold'), local('Roboto-Bold'), url("/fonts/roboto-bold.woff2") format('woff2'), url("/fonts/roboto-bold.woff") format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: local('Poppins'), local('Poppins-Regular'), url("/fonts/poppins-regular.woff") format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 500; + src: local('Poppins Medium'), local('Poppins-Medium'), url("/fonts/poppins-medium.woff") format('woff'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 700; + src: local('Poppins Bold'), local('Poppins-Bold'), url("/fonts/poppins-bold.woff") format('woff'); +} diff --git a/client/components/main/fonts.styl b/client/components/main/fonts.styl deleted file mode 100644 index 5d6fb558f..000000000 --- a/client/components/main/fonts.styl +++ /dev/null @@ -1,41 +0,0 @@ -@font-face - font-family: 'Roboto' - font-style: normal - font-weight: 400 - src: local('Roboto'), - local('Roboto-Regular'), - url('/fonts/roboto-regular.woff2') format('woff2'), - url('/fonts/roboto-regular.woff') format('woff') - -@font-face - font-family: 'Roboto' - font-style: normal - font-weight: 700 - src: local('Roboto Bold'), - local('Roboto-Bold'), - url('/fonts/roboto-bold.woff2') format('woff2'), - url('/fonts/roboto-bold.woff') format('woff') - -@font-face - font-family: 'Poppins' - font-style: normal - font-weight: 400 - src: local('Poppins'), - local('Poppins-Regular'), - url('/fonts/poppins-regular.woff') format('woff') - -@font-face - font-family: 'Poppins' - font-style: normal - font-weight: 500 - src: local('Poppins Medium'), - local('Poppins-Medium'), - url('/fonts/poppins-medium.woff') format('woff') - -@font-face - font-family: 'Poppins' - font-style: normal - font-weight: 700 - src: local('Poppins Bold'), - local('Poppins-Bold'), - url('/fonts/poppins-bold.woff') format('woff') diff --git a/client/components/main/globalSearch.css b/client/components/main/globalSearch.css new file mode 100644 index 000000000..c5a09060f --- /dev/null +++ b/client/components/main/globalSearch.css @@ -0,0 +1,117 @@ +.global-search-board-wrapper { + border-radius: 8px; + min-width: 400px; + border-width: 8px; + border-color: #808080; + border-style: solid; + margin-bottom: 2rem; + margin-right: auto; + margin-left: auto; +} +.global-search-board-title { + font-size: 1.4rem; + font-weight: bold; + padding: 0.5rem; + background-color: #808080; + color: #fff; +} +.global-search-swimlane-title { + font-size: 1.1rem; + font-weight: bold; + padding: 0.5rem; + padding-bottom: 0.4rem; + margin-top: 0; + margin-bottom: 0.5rem; + text-align: center; +} +.swimlane-default-color { + background-color: #d3d3d3; +} +.global-search-list-title { + font-weight: bold; + font-size: 1.1rem; + text-align: center; + margin-bottom: 0.7rem; +} +.global-search-list-wrapper { + margin: 1rem; + border-radius: 5px; + padding: 1.5rem; + padding-top: 0.75rem; + display: inline-block; + min-width: 250px; + max-width: 350px; +} +.global-search-card-wrapper { + margin-top: 0; + margin-bottom: 10px; +} +.global-search-results-list-wrapper { + max-width: 500px; + margin-right: auto; + margin-left: auto; +} +.global-search-field-name { + font-weight: bold; +} +.global-search-context { + display: inline-block; +} +.global-search-context-separator { + font-weight: bold; +} +.global-search-context-list { + margin-bottom: 0.7rem; +} +.global-search-error-messages { + color: #8b0000; +} +.global-search-page { + width: 40%; + min-width: 400px; + margin-right: auto; + margin-left: auto; + line-height: 150%; +} +.global-search-page h1 { + margin-top: 2rem; +} +.global-search-page h2 { + margin-top: 1rem; +} +.global-search-query-input { + width: 90% !important; + margin-right: auto; + margin-left: auto; +} +.global-search-operator { + font-family: Courier; +} +.global-search-value { + font-family: Courier; + font-style: italic; +} +code { + color: #000; + background-color: #d3d3d3; + padding: 0.1rem !important; + font-size: 0.8rem !important; +} +.list-title { + background-color: #a9a9a9; +} +.global-search-footer { + border: none; + width: 100%; +} +.global-search-next-page { + border: none; + text-align: right; +} +.global-search-previous-page { + border: none; + text-align: left; +} +.global-search-instructions li { + margin-bottom: 0.3rem; +} diff --git a/client/components/main/globalSearch.styl b/client/components/main/globalSearch.styl deleted file mode 100644 index 66115d86c..000000000 --- a/client/components/main/globalSearch.styl +++ /dev/null @@ -1,121 +0,0 @@ -.global-search-board-wrapper - border-radius: 8px - //padding: 0.5rem - min-width: 400px - border-width: 8px - border-color: grey - border-style: solid - margin-bottom: 2rem - margin-right: auto - margin-left: auto - -.global-search-board-title - font-size: 1.4rem - font-weight: bold - padding: 0.5rem - background-color: grey - color: white - -.global-search-swimlane-title - font-size: 1.1rem - font-weight: bold - padding: 0.5rem - padding-bottom: 0.4rem - margin-top: 0 - margin-bottom: 0.5rem - //border-top: black 1px solid - //border-bottom: black 1px solid - text-align: center - -.swimlane-default-color - background-color: lightgrey - -.global-search-list-title - font-weight: bold - font-size: 1.1rem - //padding-bottom: 0 - //margin-bottom: 0 - text-align: center - margin-bottom: 0.7rem - -.global-search-list-wrapper - margin: 1rem - border-radius: 5px - padding: 1.5rem - padding-top: 0.75rem - display: inline-block - min-width: 250px - max-width: 350px - -.global-search-card-wrapper - margin-top: 0 - margin-bottom: 10px - -.global-search-results-list-wrapper - max-width: 500px - margin-right: auto - margin-left: auto - -.global-search-field-name - font-weight: bold - -.global-search-context - display: inline-block - -.global-search-context-separator - font-weight: bold - -.global-search-context-list - margin-bottom: 0.7rem - -.global-search-error-messages - color: darkred - -.global-search-page - width: 40% - min-width: 400px - margin-right: auto - margin-left: auto - line-height: 150% - -.global-search-page h1 - margin-top: 2rem; - -.global-search-page h2 - margin-top: 1rem; - -.global-search-query-input - width: 90% !important - margin-right: auto - margin-left: auto - -.global-search-operator - font-family: Courier - -.global-search-value - font-family: Courier - font-style: italic - -code - color: black - background-color: lightgrey - padding: 0.1rem !important - font-size: 0.8rem !important - -.list-title - background-color: darkgray - -.global-search-footer - border: none - width: 100% - -.global-search-next-page - border: none - text-align: right; - -.global-search-previous-page - border: none - text-align: left; - -.global-search-instructions li - margin-bottom: 0.3rem diff --git a/client/components/main/header.css b/client/components/main/header.css new file mode 100644 index 000000000..712b94a6c --- /dev/null +++ b/client/components/main/header.css @@ -0,0 +1,266 @@ +#header { + color: #fff; + transition: background-color 0.4s; + background: #2980b9; + z-index: 17; +} +#header #header-main-bar { + height: 40px; + padding: 7px 10px 0; +} +#header #header-main-bar h1 { + font-size: 20px; + line-height: 1.7em; + padding: 0 10px; + margin: 0; + margin-right: 10px; + float: left; + border-radius: 3px; +} +#header #header-main-bar h1 .board-header-watch-icon { + padding-left: 7px; +} +#header #header-main-bar h1 a.fa, +#header #header-main-bar h1 a i.fa { + color: #fff; +} +#header #header-main-bar h1 .back-btn { + font-size: 0.9em; + margin-right: 10px; +} +#header #header-main-bar .wekan-logo { + margin: 3px auto auto; + width: 97px; + opacity: 0.6; + transition: opacity 0.15s; + float: right; +} +#header #header-main-bar .wekan-logo:hover { + opacity: 0.9; +} +#header #header-main-bar .board-header-btns { + display: block; + margin-top: 3px; + width: auto; +} +#header #header-main-bar .board-header-btns.left { + float: left; +} +#header #header-main-bar .board-header-btns.right { + float: right; +} +#header #header-main-bar .board-header-btn { + border-radius: 3px; + color: #f2f2f2; + padding: 0; + height: 28px; + font-size: 13px; + float: left; + overflow: hidden; + line-height: 28px; + margin: 0 2px; +} +#header #header-main-bar .board-header-btn i.fa { + float: left; + display: block; + line-height: 28px; + color: #f2f2f2; + margin: 0 10px; +} +#header #header-main-bar .board-header-btn i.fa + span { + display: inline-block; + margin-top: 1px; + margin-right: 10px; +} +#header #header-main-bar .board-header-btn .board-header-btn-close { + float: right; +} +#header #header-main-bar .board-header-btn .board-header-btn-close i.fa { + margin: 0 6px; +} +#header #header-main-bar .board-header-btn.is-active, +#header #header-main-bar h1.is-clickable.is-active, +#header #header-main-bar .board-header-btn:hover:not(.is-disabled), +#header #header-main-bar h1.is-clickable:hover:not(.is-disabled) { + background: rgba(0,0,0,0.15); +} +#header #header-main-bar .separator { + margin: 2px 4px; + border-left: 1px solid rgba(255,255,255,0.3); + height: 24px; + float: left; +} +#header-quick-access { + color: #fff; + transition: background-color 0.4s; + background: #2573a7; + height: 28px; + font-size: 12px; + display: flex; + z-index: 1000; + padding: 10px 0px; +} +#header-quick-access .allBoards { + font-size: 14px; + padding: 4px 15px; +} +#header-quick-access a { + text-decoration: none; +} +#header-quick-access #header-user-bar, +#header-quick-access #header-new-board-icon, +#header-quick-access ul li { + color: #d4d4d4; +} +#header-quick-access #header-user-bar .fa, +#header-quick-access #header-new-board-icon .fa, +#header-quick-access ul li .fa { + color: inherit; +} +#header-quick-access #header-user-bar a:hover, +#header-quick-access #header-new-board-icon a:hover, +#header-quick-access ul li a:hover, +#header-quick-access #header-user-bar a.is-active, +#header-quick-access #header-new-board-icon a.is-active, +#header-quick-access ul li a.is-active { + color: #fff; +} +#header-quick-access ul.header-quick-access-list { + transition: opacity 0.2s; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + padding: 10px; + margin: -10px; +} +#header-quick-access ul.header-quick-access-list li { + display: inline; + width: auto; + color: #d9d9d9; + padding: 12px 0px; + margin: -10px 0px; +} +#header-quick-access ul.header-quick-access-list li a { + padding: 12px 10px; + margin: -10px 0px; +} +#header-quick-access ul.header-quick-access-list li a .viewer { + display: inline; + white-space: nowrap; +} +#header-quick-access ul.header-quick-access-list li a .viewer p { + display: inline; + white-space: nowrap; +} +#header-quick-access ul.header-quick-access-list li.current { + color: #f2f2f2; +} +#header-quick-access ul.header-quick-access-list li.current.empty { + padding: 12px 10px 12px 10px; +} +#header-quick-access ul.header-quick-access-list li:first-child .fa-home, +#header-quick-access ul.header-quick-access-list li:nth-child(3) .fa-globe { + margin-right: 5px; +} +#header-quick-access ul.header-quick-access-list li a.js-create-board { + margin-left: 5px; +} +#header-quick-access #header-user-bar, +#header-quick-access #header-new-board-icon { + flex-shrink: 0; +} +#header-quick-access #header-user-bar { + margin: 2px 0; +} +#header-quick-access #header-user-bar .header-user-bar-avatar { + float: left; + position: relative; + top: -5px; + margin-right: 5px; +} +#header-quick-access #header-user-bar .header-user-bar-avatar .member { + width: 24px; + height: 24px; + margin: 0; + margin-top: 1px; +} +#header-quick-access #header-user-bar .header-user-bar-name { + margin: 4px 8px 0 0; + float: left; +} +#header-quick-access #header-user-bar .header-user-bar-name i.fa-chevron-down { + margin-right: 4px; +} +#header-quick-access #header-new-board-icon { + flex-grow: 1; + margin: 6px 5px 0; + width: 12px; +} +@media screen and (max-width: 800px) { + #header #header-main-bar { + height: 40px; + } + #header #header-main-bar .board-header-btns { + margin-top: 0px; + } + #header #header-main-bar .board-header-btn { + height: 32px; + line-height: 32px; + font-size: 15px; + } + #header #header-main-bar .board-header-btn i.fa { + line-height: 32px; + } + #header #header-main-bar .board-header-btn i.fa + span { + display: none; + } + #header-quick-access { + transition: background-color 0.4s; + width: 100%; + z-index: 30; + } + #header-quick-access ul { + width: calc(100% - 60px); + margin-right: 10px; + } + #header-quick-access ul li { + height: 100%; + } + #header-quick-access ul li a { + height: 100%; + } + #header-quick-access span .fa-home { + font-size: 26px; + margin-top: -2px; + margin-right: 10px; + margin-left: 10px; + } + #header-quick-access #header-new-board-icon { + display: none; + } + #header-quick-access #header-user-bar { + right: 0px; + padding: 10px; + margin: -8px 0 -10px -10px; + } +} +.announcement .viewer { + display: inline-block; +} +.announcement, +.offline-warning { + width: 100%; + text-align: center; + padding: 0; + margin: 0; + background: #f8ecbd; + clear: both; +} +.announcement p, +.offline-warning p { + margin: 7px; + padding: 0; +} +#headerIsSettingDatabaseCallDone { + display: none; +} diff --git a/client/components/main/header.styl b/client/components/main/header.styl deleted file mode 100644 index 6cfcdaf21..000000000 --- a/client/components/main/header.styl +++ /dev/null @@ -1,258 +0,0 @@ -@import 'nib' - -#header - color: white - transition: background-color 0.4s - background: #2980B9 - z-index: 17 - - #header-main-bar - height: 40px - padding: 7px 10px 0 - - h1 - font-size: 20px - line-height: 1.7em - padding: 0 10px - margin: 0 - margin-right: 10px - float: left - border-radius: 3px - - .board-header-watch-icon - padding-left: 7px - - a.fa, a i.fa - color: white - - .back-btn - font-size: 0.9em - margin-right: 10px - - .wekan-logo - margin: 3px auto auto - width: 97px - opacity: 0.6 - transition: opacity 0.15s - float: right - - &:hover - opacity: 0.9 - - .board-header-btns - display: block - margin-top: 3px - width: auto - - // XXX Use a flexbox instead of floats? - &.left - float: left - - &.right - float: right - - .board-header-btn - border-radius: 3px - color: darken(white, 5%) - padding: 0 - height: 28px - font-size: 13px - float: left - overflow: hidden - line-height: @height - margin: 0 2px - - i.fa - float: left - display: block - line-height: 28px - color: darken(white, 5%) - margin: 0 10px - - + span - display: inline-block - margin-top: 1px - margin-right: 10px - - .board-header-btn-close - float: right - - i.fa - margin: 0 6px - - .board-header-btn, - h1.is-clickable - &.is-active, - &:hover:not(.is-disabled) - background: rgba(0, 0, 0, .15) - - .separator - margin: 2px 4px - border-left: 1px solid rgba(255, 255, 255, .3) - height: 24px - float: left - -#header-quick-access - color: white - transition: background-color 0.4s - background: #2573a7 - height: 28px - font-size: 12px - display: flex - z-index: 1000 - padding: 10px 0px - - .allBoards - font-size: 14px - padding:4px 15px - a - text-decoration: none; - - #header-user-bar, - #header-new-board-icon, - ul li - color: darken(white, 17%) - - .fa - color: inherit - - a:hover, a.is-active - color: white - - ul.header-quick-access-list - transition: opacity 0.2s - overflow-x: auto - overflow-y: hidden - white-space: nowrap - padding: 10px - margin: -10px - - li - display: inline - width: auto - color: darken(white, 15%) - padding: 12px 0px - margin: -10px 0px - - a - padding: 12px 10px - margin: -10px 0px - - .viewer - display: inline - white-space: nowrap - - p - display: inline - white-space: nowrap - - &.current - color: darken(white, 5%) - - &.current.empty - padding: 12px 10px 12px 10px - - &:first-child .fa-home,&:nth-child(3) .fa-globe - margin-right: 5px - - a.js-create-board - margin-left: 5px - - #header-user-bar, - #header-new-board-icon - flex-shrink: 0 - - #header-user-bar - margin: 2px 0 - - .header-user-bar-avatar - float: left - position: relative - top: -5px - margin-right: 5px - - .member - width: 24px - height: @width - margin: 0 - margin-top: 1px - - .header-user-bar-name - margin: 4px 8px 0 0 - float: left - - i.fa-chevron-down - margin-right: 4px - - #header-new-board-icon - flex-grow: 1 - margin: 6px 5px 0 - width: 12px - -@media screen and (max-width: 800px) - #header - #header-main-bar - height: 40px - - .board-header-btns - margin-top: 0px - - .board-header-btn - height: 32px - line-height: @height - font-size: 15px - - i.fa - line-height: 32px - - + span - display: none - - #header-quick-access - transition: background-color 0.4s - width: 100% - z-index: 30 - - ul - width: calc(100% - 60px) - margin-right: 10px - - li - height: 100% - - a - height: 100% - - span - .fa-home - font-size: 26px - margin-top: -2px - margin-right: 10px - margin-left: 10px - - #header-new-board-icon - display: none - - #header-user-bar - right: 0px - padding: 10px - margin: -8px 0 -10px -10px - -.announcement .viewer - display: inline-block - -.announcement, -.offline-warning - width: 100% - text-align: center - padding: 0 - margin: 0 - background: #F8ECBD - clear: both - - p - margin: 7px - padding: 0 - -#headerIsSettingDatabaseCallDone - display: none; diff --git a/client/components/main/keyboardShortcuts.css b/client/components/main/keyboardShortcuts.css new file mode 100644 index 000000000..3391dcfc1 --- /dev/null +++ b/client/components/main/keyboardShortcuts.css @@ -0,0 +1,20 @@ +.shortcuts-list .shortcuts-list-item { + border-bottom: 1px solid #bfbfbf; + padding: 10px 5px; +} +.shortcuts-list .shortcuts-list-item:last-child { + border-bottom: none; +} +.shortcuts-list .shortcuts-list-item .shortcuts-list-item-keys { + margin-top: 5px; + float: right; +} +.shortcuts-list .shortcuts-list-item .shortcuts-list-item-keys kbd { + padding: 5px 8px; + margin: 5px; + font-size: 18px; +} +.shortcuts-list .shortcuts-list-item .shortcuts-list-item-action { + font-size: 1.4em; + margin: 5px; +} diff --git a/client/components/main/keyboardShortcuts.styl b/client/components/main/keyboardShortcuts.styl deleted file mode 100644 index f77d387fb..000000000 --- a/client/components/main/keyboardShortcuts.styl +++ /dev/null @@ -1,20 +0,0 @@ -.shortcuts-list - .shortcuts-list-item - border-bottom: 1px solid darken(white, 25%) - padding: 10px 5px - - &:last-child - border-bottom: none - - .shortcuts-list-item-keys - margin-top: 5px - float: right - - kbd - padding: 5px 8px - margin: 5px - font-size: 18px - - .shortcuts-list-item-action - font-size: 1.4em - margin: 5px diff --git a/client/components/main/layouts.css b/client/components/main/layouts.css new file mode 100644 index 000000000..4f0d2fbcd --- /dev/null +++ b/client/components/main/layouts.css @@ -0,0 +1,624 @@ +* { + -webkit-box-sizing: unset; + box-sizing: unset; +} +.note-popover .popover-content .note-color-palette div .note-color-btn, +.panel-heading.note-toolbar .note-color-palette div .note-color-btn { + background: none; +} +a:focus { + outline: unset; + outline-offset: unset; +} +a:hover, +a:focus { + color: unset; + text-decoration: unset; +} +.badge { + display: unset; + min-width: unset; + padding: unset; + font-size: unset; + font-weight: unset; + line-height: unset; + color: unset; + text-align: unset; + white-space: unset; + vertical-align: unset; + background-color: unset; + border-radius: unset; +} +html, +body, +input, +select, +textarea, +button { + font: 14px Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif; + line-height: 18px; + color: #4d4d4d; +} +html { + font-size: 100%; + max-height: 100%; + user-select: none; + -webkit-text-size-adjust: 100%; +} +body { + background: #dedede; + margin: 0; + position: relative; + z-index: 0; + overflow-y: auto; + display: flex; + flex-direction: column; + height: 100vh; +} +#content { + position: relative; + flex: 1; + overflow-x: hidden; +} +#content .sk-spinner { + margin-top: 30vh; +} +#content > .wrapper { + margin-top: 10px; + padding: 15px; +} +#modal { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0,0,0,0.6); + z-index: 100; + overflow-y: auto; +} +#modal .modal-content { + width: 500px; + min-height: 160px; + margin: 42px auto; + padding: 12px; + border-radius: 4px; + background: #dedede; + z-index: 110; +} +#modal .modal-content h2 { + margin-bottom: 25px; +} +#modal .modal-content .modal-close-btn { + display: block; + float: right; + font-size: 24px; +} +#modal .modal-content-wide { + width: 800px; + min-height: 0px; + margin: 42px auto; + padding: 12px; + border-radius: 4px; + background: #dedede; + z-index: 110; +} +#modal .modal-content-wide h2 { + margin-bottom: 25px; +} +#modal .modal-content-wide .modal-close-btn { + display: block; + float: right; + font-size: 24px; +} +h1 { + font-size: 22px; + line-height: 1.2em; + margin: 0 0 10px; +} +h2 { + font-size: 18px; + line-height: 1.2em; + margin: 0 0 9px; +} +h3, +h4, +h5, +h6 { + font-size: 16px; + line-height: 1.25em; + margin: 0 0 6px; +} +.quiet, +.quiet a { + color: #8c8c8c; +} +.error, +.error a { + color: #eb3800; +} +.no-items-message { + color: #666; + margin: 30px 0; + text-align: center; +} +.warning { + background: #f0ecdb; + border-radius: 3px; + color: #aa8f09; + padding: 6px 8px; +} +.warning a { + color: #aa8f09; +} +.small { + font-size: 0.8em; +} +a { + color: inherit; + cursor: pointer; + text-decoration: none; +} +a.is-disabled, +a.is-disabled:hover { + cursor: default; + text-decoration: none; +} +span a { + text-decoration: underline; +} +strong { + font-weight: bold; +} +p { + user-select: text; +} +p a { + text-decoration: underline; + word-wrap: break-word; +} +table, +p { + margin-bottom: 8px; +} +pre { + margin: 15px 0; + white-space: pre; + max-height: 516px; +} +pre, +code, +tt { + font-family: lucida console, monospace; + line-height: 1.25em; +} +blockquote { + margin: 8px 0 8px 8px; + border-left: 1px solid #ccc; + color: #666; + padding: 0 0 0 8px; +} +hr { + height: 1px; + border: 0; + border: none; + width: 100%; + background: #dbdbdb; + color: #dbdbdb; + margin: 15px 0; + padding: 0; +} +table, +td, +th { + vertical-align: top; + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; +} +td, +th { + padding: 5px; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} +th { + font-weight: 700; +} +thead { + background: #fff; + background: linear-gradient(to bottom, #fff 0, #f0f0f0 100%); +} +tbody { + background-color: #fff; +} +dl, +dt { + margin-bottom: 8px; +} +dd { + margin: 0 0 16px 24px; +} +kbd { + padding: 1px 3px; + margin: 3px; + font-weight: bold; + background: #fafafa; + border-radius: 3px; + border: 1px solid #e6e6e6; + color: unset; + box-shadow: 0px 2px 3px rgba(0,0,0,0.15); +} +.clear { + clear: both; +} +.hide { + display: none; +} +.show { + display: block; +} +.bold { + font-weight: 700; +} +.center { + text-align: center; +} +.left { + float: left; +} +.right { + float: right; +} +.first { + margin-left: 0; + padding-left: 0; +} +.last { + margin-right: 0; + padding-right: 0; +} +.top { + margin-top: 0; + padding-top: 0; +} +.bottom { + margin-bottom: 0; + padding-bottom: 0; +} +.wrapper { + width: calc(100% - 20px); + margin: 0 auto; +} +.relative { + position: relative; +} +.block { + display: block; +} +.inline { + display: inline; +} +.inline-block { + display: inline-block; +} +.pointer { + cursor: pointer; +} +.ellip { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.underline { + text-decoration: underline; +} +.lowercase { + text-transform: lowercase; +} +.invisible { + visibility: hidden; +} +.wrapword { + word-wrap: break-word; +} +.grab { + cursor: grab; +} +.grabbing { + cursor: grabbing; +} +.textcomplete-dropdown { + z-index: 2000 !important; +} +.fa.fa-times-thin:before { + content: '\00d7'; +} +.fa.fa-globe.colorful, +.fa.fa-bell.colorful { + color: #4caf50; +} +.fa.fa-lock.colorful, +.fa.fa-bell-slash.colorful { + color: #f44336; +} +.fa.fa-eye.colorful { + color: #4336f4; +} +.pop-over .pop-over-list li a:not(.disabled):hover .fa, +.pop-over .pop-over-list li a:not(.disabled):hover .fa.colorful { + color: #fff; +} +.pop-over .pop-over-list li a:not(.disabled):hover .fa:hover, +.pop-over .pop-over-list li a:not(.disabled):hover .fa.colorful:hover { + color: #fff; +} +a.fa, +a i.fa { + color: #a6a6a6; +} +a:not(.disabled):hover.fa, +a:not(.disabled).is-active.fa, +a:not(.disabled):hover i.fa, +a:not(.disabled).is-active i.fa { + color: #666; +} +.ui-draggable-dragging { + z-index: 200; +} +.atMention { + background: #dbdbdb; + border-radius: 3px; + padding: 1px 4px; + margin: -1px 0; + display: inline-block; +} +.atMention.me { + background: #cfdfe8; +} +.big-message { + display: block; + margin: 75px auto; + text-align: center; + max-width: 600px; +} +.big-message h1 { + font-size: 26px; + margin-bottom: 24px; +} +.big-message p { + font-size: 18px; + line-height: 22px; +} +.gutter { + margin-left: 38px; +} +.viewer { + min-height: 18px; + display: block; + word-wrap: break-word; +} +.viewer table { + word-wrap: normal; + word-break: normal; +} +.viewer ol { + list-style-type: decimal; + padding-left: 20px; + padding-bottom: 10px; +} +.viewer ul { + list-style-type: initial; + padding-left: 20px; + padding-bottom: 10px; +} +.viewer em { + font-style: italic; +} +.viewer pre { + padding: 10px 12px 7px; + background: #dedede; + overflow-y: auto; +} +.viewer a { + text-decoration: underline; +} +.viewer a:hover { + color: #333; +} +.basicTabs-container .tabs-content-container { + padding: 0; + padding-top: 15px; +} +@media screen and (max-width: 800px) { + #content { + margin: 1px 0px 0px 0px; + height: calc(100% - 0px); + } + #content > .wrapper { + margin-top: 0px; + } + .wrapper { + height: calc(100% - 31px); + margin: 0px; + } + .panel-default { + width: 83vw; + } +} +.inline-input { + height: 37px; + margin: 8px 10px 0 0; + width: 50px; +} +.select-authentication { + width: 100%; +} +.auth-layout { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +.auth-layout .auth-dialog { + margin: 0 !important; +} +.loadingText { + text-align: center; +} +.lds-roller { + display: block; + margin: auto; + position: relative; + width: 64px; + height: 64px; +} +.lds-roller div { + animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + transform-origin: 32px 32px; +} +.lds-roller div:after { + content: " "; + display: block; + position: absolute; + width: 6px; + height: 6px; + border-radius: 50%; + background: #dedede; + margin: -3px 0 0 -3px; +} +.lds-roller div:nth-child(1) { + animation-delay: -0.036s; +} +.lds-roller div:nth-child(1):after { + top: 50px; + left: 50px; +} +.lds-roller div:nth-child(2) { + animation-delay: -0.072s; +} +.lds-roller div:nth-child(2):after { + top: 54px; + left: 45px; +} +.lds-roller div:nth-child(3) { + animation-delay: -0.108s; +} +.lds-roller div:nth-child(3):after { + top: 57px; + left: 39px; +} +.lds-roller div:nth-child(4) { + animation-delay: -0.144s; +} +.lds-roller div:nth-child(4):after { + top: 58px; + left: 32px; +} +.lds-roller div:nth-child(5) { + animation-delay: -0.18s; +} +.lds-roller div:nth-child(5):after { + top: 57px; + left: 25px; +} +.lds-roller div:nth-child(6) { + animation-delay: -0.216s; +} +.lds-roller div:nth-child(6):after { + top: 54px; + left: 19px; +} +.lds-roller div:nth-child(7) { + animation-delay: -0.252s; +} +.lds-roller div:nth-child(7):after { + top: 50px; + left: 14px; +} +.lds-roller div:nth-child(8) { + animation-delay: -0.288s; +} +.lds-roller div:nth-child(8):after { + top: 45px; + left: 10px; +} +#isSettingDatabaseCallDone { + display: none; +} +.at-link { + color: #17683a; + text-decoration: underline; + text-decoration-color: #17683a; +} +@-moz-keyframes fadeIn { + from { + opacity: 0; + } +} +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } +} +@-o-keyframes fadeIn { + from { + opacity: 0; + } +} +@keyframes fadeIn { + from { + opacity: 0; + } +} +@-moz-keyframes flexGrowIn { + from { + height: 100%; + } +} +@-webkit-keyframes flexGrowIn { + from { + height: 100%; + } +} +@-o-keyframes flexGrowIn { + from { + height: 100%; + } +} +@keyframes flexGrowIn { + from { + height: 100%; + } +} +@-moz-keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@-webkit-keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@-o-keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl deleted file mode 100644 index b265ff9c1..000000000 --- a/client/components/main/layouts.styl +++ /dev/null @@ -1,552 +0,0 @@ -@import 'nib' - -global-reset() - -* - -webkit-box-sizing: unset - box-sizing: unset - -.note-popover .popover-content .note-color-palette div .note-color-btn, .panel-heading.note-toolbar .note-color-palette div .note-color-btn - background: none - -a:focus - outline: unset - outline-offset: unset - -a:hover,a:focus - color: unset - text-decoration: unset - -.badge - display: unset - min-width: unset - padding: unset - font-size: unset - font-weight: unset - line-height: unset - color: unset - text-align: unset - white-space: unset - vertical-align: unset - background-color: unset - border-radius: unset - -html, body, input, select, textarea, button - font: 14px Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif - line-height: 18px - color: #4d4d4d - -html - font-size: 100% - max-height: 100% - user-select: none - -webkit-text-size-adjust: 100% - -body - background: darken(white, 13%) - margin: 0 - position: relative - z-index: 0 - overflow-y: auto - display: flex - flex-direction: column - height: 100vh - -#content - position: relative - flex: 1 - overflow-x: hidden - - .sk-spinner - margin-top: 30vh - - > .wrapper - margin-top: 10px - padding: 15px - -#modal - position: absolute - top: 0 - bottom: 0 - left: 0 - right: 0 - background: rgba(0, 0, 0, 0.6) - z-index: 100 - overflow-y: auto - - .modal-content - width: 500px - min-height: 160px - margin: 42px auto - padding: 12px - border-radius: 4px - background: darken(white, 13%) - z-index: 110 - - h2 - margin-bottom: 25px - - .modal-close-btn - display: block - float: right - font-size: 24px - - .modal-content-wide - width: 800px - min-height: 0px - margin: 42px auto - padding: 12px - border-radius: 4px - background: darken(white, 13%) - z-index: 110 - - h2 - margin-bottom: 25px - - .modal-close-btn - display: block - float: right - font-size: 24px - -h1 - font-size: 22px - line-height: 1.2em - margin: 0 0 10px - -h2 - font-size: 18px - line-height: 1.2em - margin: 0 0 9px - -h3, h4, h5, h6 - font-size: 16px - line-height: 1.25em - margin: 0 0 6px - -.quiet, .quiet a - color: #8c8c8c - -.error, .error a - color: #eb3800 - -.no-items-message - color: darken(white, 60%) - margin: 30px 0 - text-align: center - -.warning - background: #f0ecdb - border-radius: 3px - color: #aa8f09 - padding: 6px 8px - - a - color: #aa8f09 - -.small - font-size: 0.8em - -a - color: inherit - cursor: pointer - text-decoration: none - - &.is-disabled, - &.is-disabled:hover - cursor: default - text-decoration: none - -span a - text-decoration: underline - -strong - font-weight: bold - -p - user-select: text - - a - text-decoration: underline - word-wrap: break-word - -table, p - margin-bottom: 8px - -pre - margin: 15px 0 - white-space: pre - max-height: 516px - -pre, -code, -tt - font-family: lucida console, monospace - line-height: 1.25em - -blockquote - margin: 8px 0 8px 8px - border-left: 1px solid #ccc - color: #666 - padding: 0 0 0 8px - -hr - height: 1px - border: 0 - border: none - width: 100% - background: #dbdbdb - color: #dbdbdb - margin: 15px 0 - padding: 0 - -table, td, th - vertical-align: top - border-top: 1px solid #ccc - border-left: 1px solid #ccc - -td, th - padding: 5px - border-right: 1px solid #ccc - border-bottom: 1px solid #ccc - -th - font-weight: 700 - -thead - background: #fff - background: linear-gradient(to bottom, #fff 0, #f0f0f0 100%) - -tbody - background-color: #fff - -dl, dt - margin-bottom: 8px - -dd - margin: 0 0 16px 24px - -kbd - padding: 1px 3px - margin: 3px - font-weight: bold - background: darken(white, 2%) - border-radius: 3px - border: 1px solid darken(white, 10%) - color: unset - box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.15) - -.clear - clear: both - -.clearfix - clearfix() - -.hide - display: none - -.show - display: block - -.bold - font-weight: 700 - -.center - text-align: center - -.left - float: left - -.right - float: right - -.first - margin-left: 0 - padding-left: 0 - -.last - margin-right: 0 - padding-right: 0 - -.top - margin-top: 0 - padding-top: 0 - -.bottom - margin-bottom: 0 - padding-bottom: 0 - -.wrapper - width: calc(100% - 20px) - margin: 0 auto - -.relative - position: relative - -.block - display: block - -.inline - display: inline - -.inline-block - display: inline-block - -.pointer - cursor: pointer - -.ellip - overflow: hidden - text-overflow: ellipsis - white-space: nowrap - -.underline - text-decoration: underline - -.lowercase - text-transform: lowercase - -.invisible - visibility: hidden - -.wrapword - word-wrap: break-word - -.grab - cursor: grab - -.grabbing - cursor: grabbing - -.textcomplete-dropdown - z-index: 2000 !important; - -// Implement a thiner close icon as suggested in -// https://github.com/FortAwesome/Font-Awesome/issues/1540#issuecomment-68689950 -.fa.fa-times-thin:before - content: '\00d7' - -.fa.fa-globe.colorful, .fa.fa-bell.colorful - color: #4caf50 - -.fa.fa-lock.colorful, .fa.fa-bell-slash.colorful - color: #f44336 - -.fa.fa-eye.colorful - color: #4336f4 - -.pop-over .pop-over-list li a:not(.disabled):hover - .fa, .fa.colorful - color: white - - &:hover - color: white - -a - &.fa, i.fa - color: darken(white, 35%) - - &:not(.disabled):hover, &:not(.disabled).is-active - &.fa, i.fa - color: darken(white, 60%) - -.ui-draggable-dragging - z-index: 200 - -.atMention - background: #dbdbdb - border-radius: 3px - padding: 1px 4px - margin: -1px 0 - display: inline-block - - &.me - background: #cfdfe8 - -.big-message - display: block - margin: 75px auto - text-align: center - max-width: 600px - - h1 - font-size: 26px - margin-bottom: 24px - - p - font-size: 18px - line-height: 22px - -.gutter - margin-left: 38px - -.viewer - min-height: 18px - display: block - word-wrap: break-word - - table - word-wrap: normal - word-break: normal - - ol - list-style-type: decimal - padding-left: 20px - padding-bottom: 10px - - ul - list-style-type: initial - padding-left: 20px - padding-bottom: 10px - - em - font-style : italic - - pre - padding: 10px 12px 7px - background: darken(white, 13%) - overflow-y: auto - - a - text-decoration: underline - &:hover - color: #333 - -.basicTabs-container .tabs-content-container - padding: 0 - padding-top: 15px - -@keyframes fadeIn - from - opacity: 0 - -@keyframes flexGrowIn - from - // Support IE11 https://github.com/wekan/wekan/pull/646 - height: 100% - -@media screen and (max-width: 800px) - #content - margin: 1px 0px 0px 0px - height: calc(100% - 0px) - - > .wrapper - margin-top: 0px - - .wrapper - height: calc(100% - 31px) - margin: 0px - - .panel-default - width: 83vw - -.inline-input - height: 37px - margin: 8px 10px 0 0 - width: 50px - -.select-authentication - width: 100% - -.auth-layout - display: flex - flex-direction: column - align-items: center - justify-content: center - - .auth-dialog - margin: 0 !important - -.loadingText - text-align: center - -.lds-roller - display: block - margin: auto - position: relative - width: 64px - height: 64px - - div - animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite - transform-origin: 32px 32px - - div:after - content: " " - display: block - position: absolute - width: 6px - height: 6px - border-radius: 50% - background: #dedede - margin: -3px 0 0 -3px - - div:nth-child(1) - animation-delay: -0.036s - - div:nth-child(1):after - top: 50px - left: 50px - - div:nth-child(2) - animation-delay: -0.072s - - div:nth-child(2):after - top: 54px - left: 45px - - div:nth-child(3) - animation-delay: -0.108s - - div:nth-child(3):after - top: 57px - left: 39px - - div:nth-child(4) - animation-delay: -0.144s - - div:nth-child(4):after - top: 58px - left: 32px - - div:nth-child(5) - animation-delay: -0.18s - - div:nth-child(5):after - top: 57px - left: 25px - - div:nth-child(6) - animation-delay: -0.216s - - div:nth-child(6):after - top: 54px - left: 19px - - div:nth-child(7) - animation-delay: -0.252s - - div:nth-child(7):after - top: 50px - left: 14px - - div:nth-child(8) - animation-delay: -0.288s - - div:nth-child(8):after - top: 45px - left: 10px - -@keyframes lds-roller - 0% - transform: rotate(0deg) - - 100% - transform: rotate(360deg) - -#isSettingDatabaseCallDone - display: none; - -.at-link - color: #17683a; - text-decoration: underline; - text-decoration-color: #17683a; diff --git a/client/components/main/myCards.css b/client/components/main/myCards.css new file mode 100644 index 000000000..4e2de1af1 --- /dev/null +++ b/client/components/main/myCards.css @@ -0,0 +1,73 @@ +.my-cards-board-wrapper { + border-radius: 0 0 4px 4px; + min-width: 400px; + margin-bottom: 2rem; + margin-right: auto; + margin-left: auto; + border-width: 2px; + border-style: solid; + border-color: #a2a2a2; +} +.my-cards-board-title { + font-size: 1.4rem; + font-weight: bold; + padding: 0.5rem; + background-color: #808080; + color: #fff; +} +.my-cards-swimlane-title { + font-size: 1.1rem; + font-weight: bold; + padding: 0.5rem; + padding-bottom: 0.4rem; + margin-top: 0; + margin-bottom: 0.5rem; + text-align: center; +} +.swimlane-default-color { + background-color: #d3d3d3; +} +.my-cards-list-title { + font-weight: bold; + font-size: 1.1rem; + text-align: center; + margin-bottom: 0.7rem; +} +.my-cards-list-wrapper { + margin: 1rem; + border-radius: 5px; + display: inline-grid; + min-width: 250px; + max-width: 350px; +} +.my-cards-card-wrapper { + margin-top: 0; + margin-bottom: 10px; +} +.my-cards-dueat-list-wrapper { + max-width: 500px; + margin-right: auto; + margin-left: auto; +} +.my-cards-board-table thead { + border-bottom: 3px solid #4d4d4d; + background-color: transparent; +} +.my-cards-board-table th, +.my-cards-board-table td { + border: 0; +} +.my-cards-board-table tr { + border-bottom: 2px solid #a2a2a2; +} +.my-cards-card-title-table { + font-weight: bold; + padding-left: 2px; +} +.my-cards-board-badge { + width: 36px; + height: 24px; + float: left; + border-radius: 5px; + margin-right: 5px; +} diff --git a/client/components/main/myCards.styl b/client/components/main/myCards.styl deleted file mode 100644 index e8c6ac1b8..000000000 --- a/client/components/main/myCards.styl +++ /dev/null @@ -1,77 +0,0 @@ -.my-cards-board-wrapper - border-radius: 0 0 4px 4px; - //padding: 0.5rem - min-width: 400px - margin-bottom: 2rem - margin-right: auto - margin-left: auto - border-width: 2px - border-style: solid - border-color: #a2a2a2 - -.my-cards-board-title - font-size: 1.4rem - font-weight: bold - padding: 0.5rem - background-color: grey - color: white - -.my-cards-swimlane-title - font-size: 1.1rem - font-weight: bold - padding: 0.5rem - padding-bottom: 0.4rem - margin-top: 0 - margin-bottom: 0.5rem - //border-top: black 1px solid - //border-bottom: black 1px solid - text-align: center - -.swimlane-default-color - background-color: lightgrey - -.my-cards-list-title - font-weight: bold - font-size: 1.1rem - //padding-bottom: 0 - //margin-bottom: 0 - text-align: center - margin-bottom: 0.7rem - -.my-cards-list-wrapper - margin: 1rem - border-radius: 5px - //padding: 1.5rem - //padding-top: 0.75rem - display: inline-grid - min-width: 250px - max-width: 350px - -.my-cards-card-wrapper - margin-top: 0 - margin-bottom: 10px - -.my-cards-dueat-list-wrapper - max-width: 500px - margin-right: auto - margin-left: auto - -.my-cards-board-table - thead - border-bottom: 3px solid #4d4d4d - background-color: transparent - th, td - border: 0 - tr - border-bottom: 2px solid #a2a2a2 - -.my-cards-card-title-table - font-weight: bold - padding-left: 2px - -.my-cards-board-badge - width:36px - height:24px - float:left - border-radius:5px - margin-right: 5px diff --git a/client/components/main/popup.css b/client/components/main/popup.css new file mode 100644 index 000000000..41c178904 --- /dev/null +++ b/client/components/main/popup.css @@ -0,0 +1,346 @@ +.pop-over { + background: #fff; + border-radius: 3px; + border: 1px solid #dbdbdb; + border-bottom-color: #c2c2c2; + box-shadow: 0 1px 6px rgba(0,0,0,0.3); + position: absolute; + width: 300px; + z-index: 99999; + margin-top: 5px; +} +.pop-over hr { + margin: 4px 0px; +} +.pop-over p, +.pop-over textarea, +.pop-over input[type="text"], +.pop-over input[type="email"], +.pop-over input[type="password"], +.pop-over input[type="file"] { + width: 100%; +} +.pop-over select { + width: 100%; + margin-bottom: 14px; +} +.pop-over textarea { + height: 72px; +} +.pop-over form a span { + padding: 0 0.5rem; +} +.pop-over .header { + height: 36px; + position: relative; + margin-bottom: 8px; + background: #f7f7f7; + border-bottom: 1px solid #dcdcdc; + color: #666; +} +.pop-over .header .header-title { + display: block; + line-height: 32px; + padding-top: 4px; + margin: 0 10px; + font-weight: bold; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.pop-over .header .back-btn { + float: left; + overflow: hidden; + width: 30px; + transition: width 0.2s; +} +.pop-over .header .back-btn i.fa { + margin: 10px; + margin-top: 12px; +} +.pop-over .header .back-btn.is-hidden { + width: 0; +} +.pop-over .header .close-btn { + padding: 10px 10px 10px 4px; + position: absolute; + top: 0; + right: 0; +} +.pop-over.no-title .header { + background: none; +} +.pop-over .content-wrapper { + width: 100%; + overflow: hidden; +} +.pop-over .content-container { + width: 5000px; + max-height: 550px; + transition: transform 0.2s; +} +.pop-over .content-container .content { + width: 280px; + padding: 0 10px 10px; + float: left; +} +.pop-over .content-container .content.no-height { + height: 20px; +} +.pop-over .quiet { + padding: 6px 6px 4px; +} +.pop-over.search-over { + background: #f0f0f0; + min-height: 114px; +} +.pop-over.search-over .header { + display: none; +} +.pop-over.search-over .content { + padding: 8px 4px 8px 10px; + margin-right: 8px; +} +.pop-over .at-form .at-error, +.pop-over .at-form .at-result { + padding: 8px 12px; + margin: -8px -10px 10px; +} +.pop-over .at-form .at-error { + background: #ef9a9a; +} +.pop-over .at-form .at-result { + background: #b2dfdb; +} +.pop-over .sk-spinner { + margin: 40px auto; +} +.pop-over .popup-container-depth-1 { + transform: translateX(-300px); +} +.pop-over .popup-container-depth-2 { + transform: translateX(-600px); +} +.pop-over .popup-container-depth-3 { + transform: translateX(-900px); +} +.pop-over .popup-container-depth-4 { + transform: translateX(-1200px); +} +.pop-over .popup-container-depth-5 { + transform: translateX(-1500px); +} +.pop-over .popup-container-depth-6 { + transform: translateX(-1800px); +} +.select-members-list, +.select-avatars-list { + margin-bottom: 8px; +} +.pop-over-list li { + display: block; + clear: both; +} +.pop-over-list li > a { + clear: both; + cursor: pointer; + display: block; + font-weight: 700; + padding: 1.5px 10px; + position: relative; + margin: 0 -10px; + text-decoration: none; + overflow: hidden; + line-height: 33px; +} +.pop-over-list li > a .item-name { + display: block; + width: auto; + padding-right: 22px; +} +.pop-over-list li > a:not(.disabled):hover { + background-color: #005377; + color: #fff; +} +.pop-over-list li > a:not(.disabled):hover .sub-name, +.pop-over-list li > a:not(.disabled):hover .quiet { + color: #eee; +} +.pop-over-list li > a:not(.disabled):hover .unread-indicator { + background: #fff; +} +.pop-over-list li > a .sub-name { + color: #8c8c8c; + display: block; + font-size: 12px; + font-weight: 400; + line-height: 15px; +} +.pop-over-list li > a.current { + background-color: #e2e6e9; +} +.pop-over-list li > a:active { + background-color: #2e85b8; +} +.pop-over-list li > a.disabled { + color: #8c8c8c; + cursor: default; +} +.pop-over-list li > a.disabled .vis-icon { + opacity: 0.35; +} +.pop-over-list li > a.disabled:hover { + background: none; +} +.pop-over-list li > a.disabled:hover .sub-name, +.pop-over-list li > a.disabled:hover .quiet { + color: #8c8c8c; +} +.pop-over-list li > a.disabled:active { + background: none; +} +.pop-over-list.inset li > a { + border-radius: 3px; + margin: 0; +} +.pop-over-list .pop-over-list.checkable .fa-check { + display: none; + position: absolute; + top: 6px; + right: 12px; +} +.pop-over-list .pop-over-list.checkable li.active a { + padding-right: 28px; +} +.pop-over-list .pop-over-list.checkable li.active a .fa-check { + display: block; +} +.pop-over.miniprofile .header { + border-bottom-color: transparent; + height: 30px; + position: absolute; + right: 0; + top: 0; + width: 60px; + z-index: 1; +} +.pop-over.miniprofile .header-title { + display: none; +} +.pop-over.miniprofile .pop-over-list { + padding-top: 8px; +} +.pop-over.miniprofile .miniprofile-header { + margin-top: 8px; + min-height: 56px; + position: relative; +} +.pop-over.miniprofile .miniprofile-header .member, +.pop-over.miniprofile .miniprofile-header .avatar { + position: absolute; + top: 2px; + left: 2px; + height: 50px; + width: 50px; +} +.pop-over.miniprofile .miniprofile-header .info { + margin: 0 0 0 64px; + word-wrap: break-word; +} +.pop-over.miniprofile .miniprofile-header .info h3 a { + text-decoration: none; +} +.pop-over.miniprofile .miniprofile-header .info h3 a:hover { + text-decoration: underline; +} +@media screen and (max-width: 800px) { + .pop-over { + width: 100%; + height: 100%; + overflow: hidden; + margin-top: 0px; + border: 0px solid #dbdbdb; + } + .pop-over .header { + color: #fff; + background: #2980b9; + height: 48px; + padding: 0px 0px; + border: 0px; + margin: 0px 0px; + width: 100%; + position: absolute; + top: 0px; + } + .pop-over .header .header-title { + font-size: 20px; + font-weight: normal; + padding-top: 8px; + } + .pop-over .header .back-btn { + width: 30px; + padding: 8px 12px 8px 12px; + } + .pop-over .header .back-btn i.fa { + color: #fff; + } + .pop-over .header .close-btn { + padding: 10px 12px; + } + .pop-over .header .close-btn i.fa { + font-size: 24px; + color: #fff; + } + .pop-over .content-wrapper { + width: 100%; + height: calc(100% - 48px); + overflow-y: scroll; + overflow-x: hidden; + margin: 48px 0px 0px 0px; + } + .pop-over .content-container { + width: 1000%; + height: 100%; + max-height: 100%; + } + .pop-over .content-container .content { + width: calc(10% - 20px); + height: calc(100% - 20px); + padding: 10px; + } + .pop-over .content-container .content form { + margin: 10px 10px; + width: calc(100% - 20px); + } + .pop-over .content-container .content p, + .pop-over .content-container .content textarea, + .pop-over .content-container .content input[type="text"], + .pop-over .content-container .content input[type="email"], + .pop-over .content-container .content input[type="password"], + .pop-over .content-container .content input[type="file"] { + width: 100%; + box-sizing: border-box; + } + .pop-over .pop-over-list li > a { + width: calc(100% - 20px); + margin: 0px 0px; + } + .pop-over .popup-container-depth-1 { + transform: translateX(-10%); + } + .pop-over .popup-container-depth-2 { + transform: translateX(-20%); + } + .pop-over .popup-container-depth-3 { + transform: translateX(-30%); + } + .pop-over .popup-container-depth-4 { + transform: translateX(-40%); + } + .pop-over .popup-container-depth-5 { + transform: translateX(-50%); + } + .pop-over .popup-container-depth-6 { + transform: translateX(-60%); + } +} diff --git a/client/components/main/popup.styl b/client/components/main/popup.styl deleted file mode 100644 index 24a864722..000000000 --- a/client/components/main/popup.styl +++ /dev/null @@ -1,324 +0,0 @@ -@import 'nib' - -$popupWidth = 300px - -.pop-over - background: #fff - border-radius: 3px - border: 1px solid #dbdbdb - border-bottom-color: #c2c2c2 - box-shadow: 0 1px 6px rgba(0, 0, 0, .3) - position: absolute - width: $popupWidth - z-index: 99999 - margin-top: 5px - - hr - margin: 4px 0px - - p, - textarea, - input[type="text"], - input[type="email"], - input[type="password"], - input[type="file"] - width: 100% - - select - width: 100% - margin-bottom: 14px - - textarea - height: 72px - - form a span - padding: 0 0.5rem - - .header - height: 36px - position: relative - margin-bottom: 8px - background: #F7F7F7 - border-bottom: 1px solid #dcdcdc - color: darken(white, 60%) - - .header-title - display: block - line-height: 32px - padding-top: 4px - margin: 0 10px - font-weight: bold - overflow: hidden - text-overflow: ellipsis - white-space: nowrap - - .back-btn - float: left - overflow: hidden - width: 30px - transition: width 0.2s - - i.fa - margin: 10px - margin-top: 12px - - &.is-hidden - width: 0 - - .close-btn - padding: 10px 10px 10px 4px - position: absolute - top: 0 - right: 0 - - &.no-title .header - background: none - - .content-wrapper - width: 100% - overflow: hidden - - .content-container - width: 5000px - max-height: 550px - transition: transform 0.2s - - .content - width: $popupWidth - 20px - padding: 0 10px 10px - float: left - - &.no-height - height: 20px - - .quiet - padding: 6px 6px 4px - - &.search-over - background: #f0f0f0 - min-height: 114px - - .header - display: none - - .content - padding: 8px 4px 8px 10px - margin-right: 8px - - .at-form - .at-error, .at-result - padding: 8px 12px - margin: -8px -10px 10px - - .at-error - background: #ef9a9a - - .at-result - background: #b2dfdb - - .sk-spinner - margin: 40px auto - - for depth in (1..6) - .popup-container-depth-{depth} - transform: translateX(- depth * $popupWidth) - -.select-members-list, -.select-avatars-list - margin-bottom: 8px - -.pop-over-list - li - display: block - clear: both - - li > a - clear: both - cursor: pointer - display: block - font-weight: 700 - padding: 1.5px 10px - position: relative - margin: 0 -10px - text-decoration: none - overflow:hidden - line-height:33px - - .item-name - display: block - width: auto - padding-right: 22px - - &:not(.disabled):hover - background-color: #005377 - color: #fff - - .sub-name, - .quiet - color: #eee - - .unread-indicator - background: #fff - - .sub-name - color: #8c8c8c - display: block - font-size: 12px - font-weight: 400 - line-height: 15px - - &.current - background-color: #e2e6e9 - - &:active - background-color: #2e85b8 - - &.disabled - color: #8c8c8c - cursor: default - - .vis-icon - opacity: .35 - - &:hover - background: none - - .sub-name, - .quiet - color: #8c8c8c - - &:active - background: none - - &.inset li > a - border-radius: 3px - margin: 0 - - .pop-over-list.checkable - .fa-check - display: none - position: absolute - top: 6px - right: 12px - - li.active a - padding-right: 28px - - .fa-check - display: block - -.pop-over.miniprofile - .header - border-bottom-color: transparent - height: 30px - position: absolute - right: 0 - top: 0 - width: 60px - z-index: 1 - - .header-title - display: none - - .pop-over-list - padding-top: 8px - - .miniprofile-header - margin-top: 8px - min-height: 56px - position: relative - - .member, - .avatar - position: absolute - top: 2px - left: 2px - height: 50px - width: @height - - .info - margin: 0 0 0 64px - word-wrap: break-word - - h3 a - text-decoration: none - - &:hover - text-decoration: underline - -@media screen and (max-width: 800px) - .pop-over - width: 100% - height: 100% - overflow: hidden - margin-top: 0px - border: 0px solid #dbdbdb - - .header - color: white - background: #2980B9 - height: 48px - padding: 0px 0px - border: 0px - margin: 0px 0px - width: 100% - position: absolute - top: 0px - - .header-title - font-size: 20px - font-weight: normal - padding-top: 8px - - .back-btn - width: 30px - padding: 8px 12px 8px 12px - - i.fa - color: white - - .close-btn - padding: 10px 12px - - i.fa - font-size: 24px - color: white - - .content-wrapper - width: 100% - height: calc(100% - 48px) - overflow-y: scroll - overflow-x: hidden - margin: 48px 0px 0px 0px - - .content-container - width: 1000% - height: 100% - max-height: 100% - - .content - width: calc(10% - 20px) - height: calc(100% - 20px) - padding: 10px - - form - margin: 10px 10px - width: calc(100% - 20px) - - p, - textarea, - input[type="text"], - input[type="email"], - input[type="password"], - input[type="file"] - width: 100% - box-sizing: border-box - - .pop-over-list - li > a - width: calc(100% - 20px) - margin: 0px 0px - - for depth in (1..6) - .popup-container-depth-{depth} - transform: translateX(- depth * 10%) diff --git a/client/components/main/spinner_bounce.css b/client/components/main/spinner_bounce.css new file mode 100644 index 000000000..8c3ecba55 --- /dev/null +++ b/client/components/main/spinner_bounce.css @@ -0,0 +1,70 @@ +.sk-spinner-bounce { + margin: 100px auto 0; + width: 70px; + text-align: center; +} +.sk-spinner-bounce div { + width: 18px; + height: 18px; + background-color: #333; + border-radius: 100%; + display: inline-block; + -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; + animation: sk-bouncedelay 1.4s infinite ease-in-out both; +} +.sk-spinner-bounce .sk-bounce1 { + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} +.sk-spinner-bounce .sk-bounce2 { + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} +@-webkit-keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} diff --git a/client/components/main/spinner_bounce.styl b/client/components/main/spinner_bounce.styl deleted file mode 100644 index 7d9ab0248..000000000 --- a/client/components/main/spinner_bounce.styl +++ /dev/null @@ -1,44 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-bounce { - margin: 100px auto 0; - width: 70px; - text-align: center; - - div { - width: 18px; - height: 18px; - background-color: #333; - - border-radius: 100%; - display: inline-block; - -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; - animation: sk-bouncedelay 1.4s infinite ease-in-out both; - } - - .sk-bounce1 { - -webkit-animation-delay: -0.32s; - animation-delay: -0.32s; - } - - .sk-bounce2 { - -webkit-animation-delay: -0.16s; - animation-delay: -0.16s; - } -} - -@-webkit-keyframes sk-bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0) } - 40% { -webkit-transform: scale(1.0) } -} - -@keyframes sk-bouncedelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } 40% { - -webkit-transform: scale(1.0); - transform: scale(1.0); - } -} diff --git a/client/components/main/spinner_cube.css b/client/components/main/spinner_cube.css new file mode 100644 index 000000000..8bd02464e --- /dev/null +++ b/client/components/main/spinner_cube.css @@ -0,0 +1,123 @@ +.sk-spinner-cube { + margin: 100px auto; + width: 40px; + height: 40px; + position: relative; +} +.sk-cube1, +.sk-cube2 { + background-color: #333; + width: 15px; + height: 15px; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-cubemove 1.8s infinite ease-in-out; + animation: sk-cubemove 1.8s infinite ease-in-out; +} +.sk-cube2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} +@-webkit-keyframes sk-cubemove { + 25% { + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } + 50% { + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } + 75% { + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } + 100% { + -webkit-transform: rotate(-360deg); + } +} +@-moz-keyframes sk-cubemove { + 25% { + transform: translateX(35px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } + 50% { + transform: translateX(35px) translateY(35px) rotate(-179deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); + } + 50.1% { + transform: translateX(35px) translateY(35px) rotate(-180deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } + 75% { + transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } + 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} +@-webkit-keyframes sk-cubemove { + 25% { + transform: translateX(35px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } + 50% { + transform: translateX(35px) translateY(35px) rotate(-179deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); + } + 50.1% { + transform: translateX(35px) translateY(35px) rotate(-180deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } + 75% { + transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } + 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} +@-o-keyframes sk-cubemove { + 25% { + transform: translateX(35px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } + 50% { + transform: translateX(35px) translateY(35px) rotate(-179deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); + } + 50.1% { + transform: translateX(35px) translateY(35px) rotate(-180deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } + 75% { + transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } + 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} +@keyframes sk-cubemove { + 25% { + transform: translateX(35px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } + 50% { + transform: translateX(35px) translateY(35px) rotate(-179deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); + } + 50.1% { + transform: translateX(35px) translateY(35px) rotate(-180deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } + 75% { + transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } + 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} diff --git a/client/components/main/spinner_cube.styl b/client/components/main/spinner_cube.styl deleted file mode 100644 index 92e6e2a11..000000000 --- a/client/components/main/spinner_cube.styl +++ /dev/null @@ -1,52 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-cube { - margin: 100px auto; - width: 40px; - height: 40px; - position: relative; -} - -.sk-cube1, .sk-cube2 { - background-color: #333; - width: 15px; - height: 15px; - position: absolute; - top: 0; - left: 0; - - -webkit-animation: sk-cubemove 1.8s infinite ease-in-out; - animation: sk-cubemove 1.8s infinite ease-in-out; -} - -.sk-cube2 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -@-webkit-keyframes sk-cubemove { - 25% { -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5) } - 50% { -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg) } - 75% { -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5) } - 100% { -webkit-transform: rotate(-360deg) } -} - -@keyframes sk-cubemove { - 25% { - transform: translateX(35px) rotate(-90deg) scale(0.5); - -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); - } 50% { - transform: translateX(35px) translateY(35px) rotate(-179deg); - -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); - } 50.1% { - transform: translateX(35px) translateY(35px) rotate(-180deg); - -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); - } 75% { - transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); - -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); - } 100% { - transform: rotate(-360deg); - -webkit-transform: rotate(-360deg); - } -} diff --git a/client/components/main/spinner_cube_grid.styl b/client/components/main/spinner_cube_grid.css similarity index 51% rename from client/components/main/spinner_cube_grid.styl rename to client/components/main/spinner_cube_grid.css index 042aa10fe..71e02af32 100644 --- a/client/components/main/spinner_cube_grid.styl +++ b/client/components/main/spinner_cube_grid.css @@ -1,64 +1,99 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit .sk-spinner-cube-grid { width: 40px; height: 40px; margin: 100px auto; } - .sk-spinner-cube-grid .sk-cube-grid { width: 33%; height: 33%; background-color: #333; float: left; -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; - animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; + animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; } .sk-spinner-cube-grid .sk-cube-grid1 { -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; } + animation-delay: 0.2s; +} .sk-spinner-cube-grid .sk-cube-grid2 { -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; } + animation-delay: 0.3s; +} .sk-spinner-cube-grid .sk-cube-grid3 { -webkit-animation-delay: 0.4s; - animation-delay: 0.4s; } + animation-delay: 0.4s; +} .sk-spinner-cube-grid .sk-cube-grid4 { -webkit-animation-delay: 0.1s; - animation-delay: 0.1s; } + animation-delay: 0.1s; +} .sk-spinner-cube-grid .sk-cube-grid5 { -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; } + animation-delay: 0.2s; +} .sk-spinner-cube-grid .sk-cube-grid6 { -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; } + animation-delay: 0.3s; +} .sk-spinner-cube-grid .sk-cube-grid7 { -webkit-animation-delay: 0s; - animation-delay: 0s; } + animation-delay: 0s; +} .sk-spinner-cube-grid .sk-cube-grid8 { -webkit-animation-delay: 0.1s; - animation-delay: 0.1s; } + animation-delay: 0.1s; +} .sk-spinner-cube-grid .sk-cube-grid9 { -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; } - + animation-delay: 0.2s; +} @-webkit-keyframes sk-cubeGridScaleDelay { 0%, 70%, 100% { -webkit-transform: scale3D(1, 1, 1); - transform: scale3D(1, 1, 1); - } 35% { + transform: scale3D(1, 1, 1); + } + 35% { -webkit-transform: scale3D(0, 0, 1); - transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} +@-moz-keyframes sk-cubeGridScaleDelay { + 0%, 70%, 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } + 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} +@-webkit-keyframes sk-cubeGridScaleDelay { + 0%, 70%, 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } + 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} +@-o-keyframes sk-cubeGridScaleDelay { + 0%, 70%, 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } + 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); } } - @keyframes sk-cubeGridScaleDelay { 0%, 70%, 100% { -webkit-transform: scale3D(1, 1, 1); - transform: scale3D(1, 1, 1); - } 35% { + transform: scale3D(1, 1, 1); + } + 35% { -webkit-transform: scale3D(0, 0, 1); - transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); } } diff --git a/client/components/main/spinner_dot.css b/client/components/main/spinner_dot.css new file mode 100644 index 000000000..13a264ce1 --- /dev/null +++ b/client/components/main/spinner_dot.css @@ -0,0 +1,104 @@ +.sk-spinner-dot { + margin: 100px auto; + width: 40px; + height: 40px; + position: relative; + text-align: center; + -webkit-animation: sk-rotate 2s infinite linear; + animation: sk-rotate 2s infinite linear; +} +.sk-dot1, +.sk-dot2 { + width: 40%; + height: 40%; + display: inline-block; + position: absolute; + top: 0; + background-color: #333; + border-radius: 100%; + -webkit-animation: sk-bounce 2s infinite ease-in-out; + animation: sk-bounce 2s infinite ease-in-out; +} +.sk-dot2 { + top: auto; + bottom: 0; + -webkit-animation-delay: -1s; + animation-delay: -1s; +} +@-webkit-keyframes sk-rotate { + 100% { + -webkit-transform: rotate(360deg); + } +} +@-webkit-keyframes sk-bounce { + 0%, 100% { + -webkit-transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes sk-rotate { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + } +} +@-webkit-keyframes sk-rotate { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + } +} +@-o-keyframes sk-rotate { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + } +} +@keyframes sk-rotate { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); + } +} +@-moz-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@-webkit-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@-o-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} diff --git a/client/components/main/spinner_dot.styl b/client/components/main/spinner_dot.styl deleted file mode 100644 index 5f2e36da4..000000000 --- a/client/components/main/spinner_dot.styl +++ /dev/null @@ -1,51 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-dot { - margin: 100px auto; - width: 40px; - height: 40px; - position: relative; - text-align: center; - - -webkit-animation: sk-rotate 2.0s infinite linear; - animation: sk-rotate 2.0s infinite linear; -} - -.sk-dot1, .sk-dot2 { - width: 40%; - height: 40%; - display: inline-block; - position: absolute; - top: 0; - background-color: #333; - border-radius: 100%; - - -webkit-animation: sk-bounce 2.0s infinite ease-in-out; - animation: sk-bounce 2.0s infinite ease-in-out; -} - -.sk-dot2 { - top: auto; - bottom: 0; - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; -} - -@-webkit-keyframes sk-rotate { 100% { -webkit-transform: rotate(360deg) }} -@keyframes sk-rotate { 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg) }} - -@-webkit-keyframes sk-bounce { - 0%, 100% { -webkit-transform: scale(0.0) } - 50% { -webkit-transform: scale(1.0) } -} - -@keyframes sk-bounce { - 0%, 100% { - transform: scale(0.0); - -webkit-transform: scale(0.0); - } 50% { - transform: scale(1.0); - -webkit-transform: scale(1.0); - } -} diff --git a/client/components/main/spinner_double_bounce.css b/client/components/main/spinner_double_bounce.css new file mode 100644 index 000000000..5631c199a --- /dev/null +++ b/client/components/main/spinner_double_bounce.css @@ -0,0 +1,71 @@ +.sk-spinner-double-bounce { + width: 40px; + height: 40px; + position: relative; + margin: 100px auto; +} +.sk-double-bounce1, +.sk-double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #333; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-bounce 2s infinite ease-in-out; + animation: sk-bounce 2s infinite ease-in-out; +} +.sk-double-bounce2 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} +@-webkit-keyframes sk-bounce { + 0%, 100% { + -webkit-transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@-webkit-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@-o-keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} diff --git a/client/components/main/spinner_double_bounce.styl b/client/components/main/spinner_double_bounce.styl deleted file mode 100644 index 2ef000361..000000000 --- a/client/components/main/spinner_double_bounce.styl +++ /dev/null @@ -1,44 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-double-bounce { - width: 40px; - height: 40px; - - position: relative; - margin: 100px auto; -} - -.sk-double-bounce1, .sk-double-bounce2 { - width: 100%; - height: 100%; - border-radius: 50%; - background-color: #333; - opacity: 0.6; - position: absolute; - top: 0; - left: 0; - - -webkit-animation: sk-bounce 2.0s infinite ease-in-out; - animation: sk-bounce 2.0s infinite ease-in-out; -} - -.sk-double-bounce2 { - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; -} - -@-webkit-keyframes sk-bounce { - 0%, 100% { -webkit-transform: scale(0.0) } - 50% { -webkit-transform: scale(1.0) } -} - -@keyframes sk-bounce { - 0%, 100% { - transform: scale(0.0); - -webkit-transform: scale(0.0); - } 50% { - transform: scale(1.0); - -webkit-transform: scale(1.0); - } -} diff --git a/client/components/main/spinner_rotateplane.css b/client/components/main/spinner_rotateplane.css new file mode 100644 index 000000000..4313a4c7a --- /dev/null +++ b/client/components/main/spinner_rotateplane.css @@ -0,0 +1,81 @@ +.sk-spinner-rotateplane { + width: 40px; + height: 40px; + text-align: center; + margin: 100px auto; + -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out; + animation: sk-rotateplane 1.2s infinite ease-in-out; +} +.sk-spinner-rotateplane div { + background-color: #333; + height: 100%; + width: 100%; + display: inline-block; +} +@-webkit-keyframes sk-rotateplane { + 0% { + -webkit-transform: perspective(120px); + } + 50% { + -webkit-transform: perspective(120px) rotateY(180deg); + } + 100% { + -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg); + } +} +@-moz-keyframes sk-rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} +@-webkit-keyframes sk-rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} +@-o-keyframes sk-rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} +@keyframes sk-rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} diff --git a/client/components/main/spinner_rotateplane.styl b/client/components/main/spinner_rotateplane.styl deleted file mode 100644 index 1f43d37e3..000000000 --- a/client/components/main/spinner_rotateplane.styl +++ /dev/null @@ -1,38 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-rotateplane { - width: 40px; - height: 40px; - text-align: center; - - margin: 100px auto; - -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out; - animation: sk-rotateplane 1.2s infinite ease-in-out; - - div { - background-color: #333; - height: 100%; - width: 100%; - display: inline-block; - } -} - -@-webkit-keyframes sk-rotateplane { - 0% { -webkit-transform: perspective(120px) } - 50% { -webkit-transform: perspective(120px) rotateY(180deg) } - 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) } -} - -@keyframes sk-rotateplane { - 0% { - transform: perspective(120px) rotateX(0deg) rotateY(0deg); - -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg) - } 50% { - transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); - -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg) - } 100% { - transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - } -} diff --git a/client/components/main/spinner_scaleout.css b/client/components/main/spinner_scaleout.css new file mode 100644 index 000000000..d3def5bfa --- /dev/null +++ b/client/components/main/spinner_scaleout.css @@ -0,0 +1,68 @@ +.sk-spinner-scaleout { + width: 40px; + height: 40px; + text-align: center; + margin: 100px auto; + border-radius: 100%; + -webkit-animation: sk-scaleout 1s infinite ease-in-out; + animation: sk-scaleout 1s infinite ease-in-out; +} +.sk-spinner-scaleout div { + background-color: #333; + height: 100%; + width: 100%; + display: inline-block; +} +@-webkit-keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + opacity: 0; + } +} +@-moz-keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} +@-webkit-keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} +@-o-keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} +@keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} diff --git a/client/components/main/spinner_scaleout.styl b/client/components/main/spinner_scaleout.styl deleted file mode 100644 index deb73b68e..000000000 --- a/client/components/main/spinner_scaleout.styl +++ /dev/null @@ -1,40 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-scaleout { - width: 40px; - height: 40px; - text-align: center; - - margin: 100px auto; - - border-radius: 100%; - -webkit-animation: sk-scaleout 1.0s infinite ease-in-out; - animation: sk-scaleout 1.0s infinite ease-in-out; - - div { - background-color: #333; - height: 100%; - width: 100%; - display: inline-block; - } -} - -@-webkit-keyframes sk-scaleout { - 0% { -webkit-transform: scale(0) } - 100% { - -webkit-transform: scale(1.0); - opacity: 0; - } -} - -@keyframes sk-scaleout { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } 100% { - -webkit-transform: scale(1.0); - transform: scale(1.0); - opacity: 0; - } -} diff --git a/client/components/main/spinner_wave.css b/client/components/main/spinner_wave.css new file mode 100644 index 000000000..2855ffbb0 --- /dev/null +++ b/client/components/main/spinner_wave.css @@ -0,0 +1,58 @@ +.sk-spinner-wave { + width: 50px; + height: 50px; + margin: auto; + text-align: center; + font-size: 10px; +} +.sk-spinner-wave div { + background-color: #333; + height: 100%; + width: 6px; + display: inline-block; + animation: sk-waveStretchDelay 1.2s infinite ease-in-out; +} +.sk-spinner-wave .sk-rect2 { + animation-delay: -1.1s; +} +.sk-spinner-wave .sk-rect3 { + animation-delay: -1s; +} +.sk-spinner-wave .sk-rect4 { + animation-delay: -0.9s; +} +.sk-spinner-wave .sk-rect5 { + animation-delay: -0.8s; +} +@-moz-keyframes sk-waveStretchDelay { + 0%, 40%, 100% { + transform: scaleY(0.4); + } + 20% { + transform: scaleY(1); + } +} +@-webkit-keyframes sk-waveStretchDelay { + 0%, 40%, 100% { + transform: scaleY(0.4); + } + 20% { + transform: scaleY(1); + } +} +@-o-keyframes sk-waveStretchDelay { + 0%, 40%, 100% { + transform: scaleY(0.4); + } + 20% { + transform: scaleY(1); + } +} +@keyframes sk-waveStretchDelay { + 0%, 40%, 100% { + transform: scaleY(0.4); + } + 20% { + transform: scaleY(1); + } +} diff --git a/client/components/main/spinner_wave.styl b/client/components/main/spinner_wave.styl deleted file mode 100644 index a82d39496..000000000 --- a/client/components/main/spinner_wave.styl +++ /dev/null @@ -1,29 +0,0 @@ -@import 'nib' - -// From https://github.com/tobiasahlin/SpinKit -.sk-spinner-wave { - width: 50px; - height: 50px; - margin: auto; - text-align: center; - font-size: 10px; - - div { - background-color: #333; - height: 100%; - width: 6px; - display: inline-block; - - animation: sk-waveStretchDelay 1.2s infinite ease-in-out; - } - - .sk-rect2 { animation-delay: -1.1s } - .sk-rect3 { animation-delay: -1.0s } - .sk-rect4 { animation-delay: -0.9s } - .sk-rect5 { animation-delay: -0.8s } -} - -@keyframes sk-waveStretchDelay { - 0%, 40%, 100% { transform: scaleY(0.4) } - 20% { transform: scaleY(1.0) } -} diff --git a/client/components/notifications/notification.css b/client/components/notifications/notification.css new file mode 100644 index 000000000..601015c81 --- /dev/null +++ b/client/components/notifications/notification.css @@ -0,0 +1,67 @@ +#notifications-drawer.show-read .notification.read { + display: flex; +} +#notifications-drawer .notification { + display: flex; + float: none; + padding: 15px 8px 8px; + color: #000; + border-bottom: 1px solid #dbdbdb; +} +#notifications-drawer .notification.read { + display: none; +} +#notifications-drawer .notification .read-status { + width: 30px; + padding: 0px 10px 0px 0px; +} +#notifications-drawer .notification .read-status input { + width: 24px; + height: 24px; +} +#notifications-drawer .notification .read-status .activity-type { + margin: 16px 0 0; + width: 17px; + height: 17px; + font-size: 17px; + display: block; + color: #bbb; +} +#notifications-drawer .notification .details .activity a.member { + margin: 0px 0px 0px 0px; + padding: 0px; +} +#notifications-drawer .notification .details .activity a.member svg { + padding: 3px; +} +#notifications-drawer .notification .details .activity .activity-desc { + margin: 0px 0px 0px 5px; +} +#notifications-drawer .notification .details .activity .activity-comment { + display: block; + width: 100%; + border-radius: 3px; + background: #fff; + text-decoration: none; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + margin-top: 5px; + padding: 5px; +} +#notifications-drawer .notification .details .activity .activity-meta { + display: block; + font-size: 0.8em; + color: #999; + font-style: italic; +} +#notifications-drawer .notification .remove a:hover { + color: #eb4646 !important; +} +@media screen and (max-width: 800px) { + #notifications-drawer .notification { + height: auto; + } + #notifications-drawer .notification .details .activity a.member { + height: 36px; + width: 36px; + } +} diff --git a/client/components/notifications/notification.styl b/client/components/notifications/notification.styl deleted file mode 100644 index b573fa6c7..000000000 --- a/client/components/notifications/notification.styl +++ /dev/null @@ -1,72 +0,0 @@ -#notifications-drawer - &.show-read .notification.read - display: flex - - .notification - display: flex - float: none - padding: 15px 8px 8px - color: black - border-bottom: 1px solid #dbdbdb - - &.read - display: none - - .read-status - width: 30px - padding: 0px 10px 0px 0px - - input - width: 24px - height: 24px - - .activity-type - margin: 16px 0 0 - width: 17px - height: 17px - font-size: 17px - display: block - color: #bbb - - .details - .activity - a.member - margin: 0px 0px 0px 0px - padding: 0px - - svg - padding: 3px - - .activity-desc - margin: 0px 0px 0px 5px - - .activity-comment - display: block - width: 100% - border-radius: 3px - background: #fff - text-decoration: none - box-shadow: 0 1px 2px rgba(0,0,0,0.2) - margin-top: 5px - padding: 5px - - .activity-meta - display: block - font-size: 0.8em - color: #999 - font-style: italic - - .remove - a:hover - color #eb4646 !important - -@media screen and (max-width: 800px) - #notifications-drawer - .notification - height: auto - - .details - .activity - a.member - height: 36px - width: 36px diff --git a/client/components/notifications/notifications.css b/client/components/notifications/notifications.css new file mode 100644 index 000000000..1fddb553d --- /dev/null +++ b/client/components/notifications/notifications.css @@ -0,0 +1,17 @@ +#notifications { + position: relative; +} +#notifications .notifications-drawer-toggle { + display: block; + line-height: 28px; + color: #f2f2f2; + margin: 0 10px; + width: 28px; + height: 28px; + text-align: center; + border: 0; + padding: 0; +} +#notifications .notifications-drawer-toggle.alert { + background-color: #eb4646; +} diff --git a/client/components/notifications/notifications.styl b/client/components/notifications/notifications.styl deleted file mode 100644 index 710cd3f92..000000000 --- a/client/components/notifications/notifications.styl +++ /dev/null @@ -1,17 +0,0 @@ -#notifications - position: relative - - .notifications-drawer-toggle - display: block - line-height: 28px - color: #f2f2f2 - margin: 0 10px - width: 28px - height: 28px - text-align: center - border: 0 - padding: 0 - - &.alert - background-color: #eb4646; - diff --git a/client/components/notifications/notificationsDrawer.css b/client/components/notifications/notificationsDrawer.css new file mode 100644 index 000000000..d8ffcb153 --- /dev/null +++ b/client/components/notifications/notificationsDrawer.css @@ -0,0 +1,67 @@ +section#notifications-drawer { + position: fixed; + top: 48px; + right: 0; + width: 400px; + background-color: #fafafa; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); + border-radius: 2px; + max-height: calc(100vh - 28px - 36px); + color: #000; + padding-top: 36px; +} +section#notifications-drawer a:hover { + color: #2980b9 !important; +} +section#notifications-drawer .header { + position: fixed; + top: 48px; + right: 0; + width: calc(400px - 32px); + padding: 8px 16px; + background: #ededed; + border-bottom: 1px solid #dbdbdb; + z-index: 2; +} +section#notifications-drawer .header .toggle-read { + position: absolute; + left: 16px; + top: calc(50% - 8px); + color: #2980b9; +} +section#notifications-drawer .header h5 { + text-align: center; + margin: 0; +} +section#notifications-drawer .header .close { + position: absolute; + top: calc(50% - 12px); + right: 12px; + font-size: 24px; + height: 24px; + line-height: 24px; + opacity: 1; +} +section#notifications-drawer .all-read, +section#notifications-drawer .remove-read { + color: #2980b9; + background-color: #fafafa; + margin: 8px 16px 12px; + display: inline-block; +} +section#notifications-drawer .remove-read { + float: right; +} +section#notifications-drawer .remove-read:hover { + color: #eb4646 !important; +} +section#notifications-drawer .remove-read:hover i.fa { + color: inherit; +} +section#notifications-drawer ul.notifications { + display: block; + padding: 0px 16px 0px 16px; + margin: 0; + height: calc(100vh - 122px); + overflow-y: scroll; +} diff --git a/client/components/notifications/notificationsDrawer.styl b/client/components/notifications/notificationsDrawer.styl deleted file mode 100644 index 6414da683..000000000 --- a/client/components/notifications/notificationsDrawer.styl +++ /dev/null @@ -1,69 +0,0 @@ -belize = #2980b9 - -section#notifications-drawer - position: fixed - top: 48px - right: 0 - width: 400px - background-color: #fafafa - box-shadow: 0 1px 2px rgba(0,0,0,0.15) - border-radius: 2px - max-height: calc(100vh - 28px - 36px) - color: black - padding-top 36px - - a:hover - color: belize !important - - .header - position: fixed - top 48px - right 0 - width calc(400px - 32px) - padding: 8px 16px - background: #ededed - border-bottom: 1px solid #dbdbdb - z-index 2 - - .toggle-read - position absolute - left 16px - top calc(50% - 8px) - color belize - - h5 - text-align: center - margin: 0 - - .close - position: absolute - top: calc(50% - 12px) - right: 12px - font-size: 24px - height: 24px - line-height: 24px - opacity 1 - - .all-read, - .remove-read - color belize - background-color: #fafafa - margin 8px 16px 12px - display inline-block - - .remove-read - float right - - &:hover - color #eb4646 !important - - i.fa - color inherit - - - ul.notifications - display: block - padding: 0px 16px 0px 16px - margin: 0 - height: calc(100vh - 122px) - overflow-y: scroll diff --git a/client/components/rules/rules.css b/client/components/rules/rules.css new file mode 100644 index 000000000..47e746afa --- /dev/null +++ b/client/components/rules/rules.css @@ -0,0 +1,217 @@ +.rules-list { + overflow: hidden; + overflow-y: scroll; + max-height: 400px; + padding-right: 5px; +} +.rules-lists-item { + display: block; + position: relative; + overflow: auto; + border-bottom: 1px solid #bfbfbf; +} +.rules-lists-item p { + display: inline-block; + float: left; + margin: revert; +} +.hide-element { + display: none !important; +} +.user-details { + display: inline-block; +} +.rules-btns-group { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.rules-btns-group button { + margin: auto; +} +.rules-add { + display: block; + overflow: auto; + margin-top: 15px; + margin-bottom: 5px; +} +.rules-add input { + display: inline-block; + float: right; + margin: auto; + margin-right: 10px; +} +.rules-add button { + display: inline-block; + float: right; + margin: auto; +} +.rules-back { + display: block; + overflow: auto; + margin-top: 15px; + margin-bottom: 5px; +} +.rules-back button { + display: inline-block; + float: right; + margin: auto; + margin-right: 14px; +} +.flex, +.triggers-content .triggers-body .triggers-side-menu ul li a { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; +} +.triggers-content { + color: #727479; + background: #dedede; +} +.triggers-content .triggers-body { + display: flex; + padding-top: 15px; + height: 100%; +} +.triggers-content .triggers-body .triggers-side-menu { + background-color: #f7f7f7; + border: 1px solid #f0f0f0; + border-radius: 4px; + height: intrinsic; + box-shadow: inset -1px -1px 3px rgba(0,0,0,0.05); +} +.triggers-content .triggers-body .triggers-side-menu ul li { + margin: 0.1rem 0.2rem; + width: 50px; + height: 50px; + text-align: center; + font-size: 25px; + position: relative; +} +.triggers-content .triggers-body .triggers-side-menu ul li i { + position: absolute; + top: 50%; + left: 50%; + box-shadow: none; + transform: translate(-50%, -50%); +} +.triggers-content .triggers-body .triggers-side-menu ul li.active { + background: #fff; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); +} +.triggers-content .triggers-body .triggers-side-menu ul li:hover { + background: #fff; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); +} +.triggers-content .triggers-body .triggers-side-menu ul li a { + padding: 1rem 0 1rem 1rem; + width: 95%; +} +.triggers-content .triggers-body .triggers-side-menu ul li a span { + font-size: 13px; +} +.triggers-content .triggers-body .triggers-main-body { + padding: 0.1em 1em; + width: 100%; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item { + overflow: auto; + padding: 10px; + height: 100px; + margin-bottom: 5px; + border-radius: 3px; + position: relative; + background-color: #fff; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 10px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-text { + font-size: 16px; + display: inline-block; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-inline-button { + font-size: 16px; + display: inline; + padding: 6px; + border: 1px solid #eee; + border-radius: 4px; + box-shadow: inset -1px -1px 3px rgba(0,0,0,0.05); +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-inline-button:hover, +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-inline-button.is-active { + box-shadow: 0 0 0 2px #666 inset; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-text.trigger-text-email { + margin-left: 5px; + margin-top: 10px; + margin-bottom: 10px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-dropdown { + display: inline-block; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-dropdown select { + width: auto; + height: 30px; + margin: 0px; + margin-left: 5px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content .trigger-dropdown input { + display: inline-block; + width: 80px; + margin: 0; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-content-mail { + left: 20px; + right: 100px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 30px; + height: 30px; + border: 1px solid #eee; + border-radius: 4px; + box-shadow: inset -1px -1px 3px rgba(0,0,0,0.05); + text-align: center; + font-size: 20px; + right: 10px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button i { + position: absolute; + top: 50%; + left: 50%; + box-shadow: none; + transform: translate(-50%, -50%); +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button:hover, +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button.is-active { + box-shadow: 0 0 0 2px #666 inset; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button.trigger-button-email { + top: 30px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button.trigger-button-person { + right: -40px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item .trigger-button.trigger-button-color { + top: unset; + position: unset; + transform: unset; + font-size: 16px; + width: auto; + padding-left: 10px; + padding-right: 10px; + height: 40px; +} +.triggers-content .triggers-body .triggers-main-body .trigger-item.trigger-item-mail { + height: 300px; +} diff --git a/client/components/rules/rules.styl b/client/components/rules/rules.styl deleted file mode 100644 index 6af4eeae2..000000000 --- a/client/components/rules/rules.styl +++ /dev/null @@ -1,192 +0,0 @@ -.rules-list - overflow:hidden - overflow-y:scroll - max-height: 400px - padding-right: 5px -.rules-lists-item - display: block - position: relative - overflow: auto - border-bottom: 1px solid #bfbfbf - p - display: inline-block - float: left - margin: revert -.hide-element - display:none !important -.user-details - display:inline-block -.rules-btns-group - position: absolute - right: 0 - top: 50% - transform: translateY(-50%) - button - margin: auto -.rules-add - display: block - overflow: auto - margin-top: 15px - margin-bottom: 5px - input - display: inline-block - float: right - margin: auto - margin-right: 10px - button - display: inline-block - float: right - margin: auto -.rules-back - display: block - overflow: auto - margin-top: 15px - margin-bottom: 5px - button - display: inline-block - float: right - margin: auto - margin-right:14px - -.flex - display: -webkit-box - display: -moz-box - display: -webkit-flex - display: -moz-flex - display: -ms-flexbox - display: flex - - - -.triggers-content - color: #727479 - background: #dedede - .triggers-body - display flex - padding-top 15px - height 100% - - .triggers-side-menu - background-color: #f7f7f7 - border: 1px solid #f0f0f0 - border-radius: 4px - height: intrinsic - box-shadow: inset -1px -1px 3px rgba(0,0,0,.05) - - ul - - li - margin: 0.1rem 0.2rem; - width:50px - height:50px - text-align:center - font-size: 25px - position: relative - - i - position: absolute; - top: 50%; - left: 50%; - box-shadow: none - transform: translate(-50%,-50%); - - - &.active - background #fff - box-shadow 0 1px 2px rgba(0,0,0,0.15); - - &:hover - background #fff - box-shadow 0 1px 2px rgba(0,0,0,0.15); - a - @extends .flex - padding: 1rem 0 1rem 1rem - width: 100% - 5rem - - - span - font-size: 13px - .triggers-main-body - padding: 0.1em 1em - width:100% - .trigger-item - overflow:auto - padding:10px - height:100px - margin-bottom:5px - border-radius: 3px - position: relative - background-color: white - .trigger-content - position:absolute - top:50% - transform: translateY(-50%) - left:10px - .trigger-text - font-size: 16px - display:inline-block - .trigger-inline-button - font-size: 16px - display: inline; - padding: 6px; - border: 1px solid #eee - border-radius: 4px - box-shadow: inset -1px -1px 3px rgba(0,0,0,.05) - &:hover, &.is-active - box-shadow: 0 0 0 2px darken(white, 60%) inset - .trigger-text.trigger-text-email - margin-left: 5px; - margin-top: 10px; - margin-bottom: 10px; - .trigger-dropdown - display:inline-block - select - width:auto - height:30px - margin:0px - margin-left:5px - input - display: inline-block - width: 80px; - margin: 0; - .trigger-content-mail - left:20px - right:100px - .trigger-button - position:absolute - top:50% - transform: translateY(-50%) - width:30px - height:30px - border: 1px solid #eee - border-radius: 4px - box-shadow: inset -1px -1px 3px rgba(0,0,0,.05) - text-align:center - font-size: 20px - right:10px - i - position: absolute - top: 50% - left: 50% - box-shadow: none - transform: translate(-50%,-50%) - &:hover, &.is-active - box-shadow: 0 0 0 2px darken(white, 60%) inset - .trigger-button.trigger-button-email - top:30px - .trigger-button.trigger-button-person - right:-40px - .trigger-button.trigger-button-color - top: unset - position: unset - transform: unset - font-size: 16px - width:auto - padding-left: 10px - padding-right: 10px - height:40px - .trigger-item.trigger-item-mail - height:300px - - - diff --git a/client/components/settings/attachments.css b/client/components/settings/attachments.css new file mode 100644 index 000000000..a78dfa99f --- /dev/null +++ b/client/components/settings/attachments.css @@ -0,0 +1,8 @@ +.move-attachment-buttons { + display: flex; + gap: 10px; +} +.attachments-content hr { + height: 0px; + border: 1px solid #000; +} diff --git a/client/components/settings/attachments.styl b/client/components/settings/attachments.styl deleted file mode 100644 index df3635995..000000000 --- a/client/components/settings/attachments.styl +++ /dev/null @@ -1,8 +0,0 @@ -.move-attachment-buttons - display: flex - gap: 10px - -.attachments-content - hr - height: 0px - border: 1px solid black diff --git a/client/components/settings/peopleBody.css b/client/components/settings/peopleBody.css new file mode 100644 index 000000000..5d426ce37 --- /dev/null +++ b/client/components/settings/peopleBody.css @@ -0,0 +1,91 @@ +.main-body { + overflow: scroll; +} +table { + color: #000; +} +table td, +table th { + border: 1px solid #d2d0d0; + text-align: left; + padding: 8px; +} +table tr:nth-child(even) { + background-color: #ddd; +} +.ext-box { + display: flex; + flex-direction: row; + height: 34px; +} +.ext-box .ext-box-left { + display: flex; + width: 100%; + gap: 10px; +} +.ext-box span { + vertical-align: center; + line-height: 34px; +} +.ext-box input, +.ext-box button { + padding: 0; +} +.ext-box button { + min-width: 90px; +} +.content-wrapper { + margin-top: 10px; +} +.buttonsContainer { + display: flex; +} +.buttonsContainer input { + margin: 0; +} +.buttonsContainer div { + margin: auto; +} +.more-settings-user, +.more-settings-team, +.more-settings-org { + margin-left: 10px; +} +.js-orgs, +.js-orgsNewUser { + display: none; +} +.js-teams, +.js-teamsNewUser { + display: none; +} +.selectUserChkBox, +.allUserChkBox { + position: static !important; + visibility: visible !important; + left: 0 !important; + display: block !important; +} +#divAddOrRemoveTeam { + background: #008000; + display: none; +} +#addOrRemoveTeam { + background: #008000; + color: #fff; +} +#divAddOrRemoveTeamContainer { + display: none; + margin: auto; + width: 50%; + border: 3px solid #008000; + padding: 10px; +} +#cancelBtn { + margin-left: 5% !important; + background: #ffa500; + color: #fff; +} +#deleteAction { + margin-left: 5% !important; +} diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl deleted file mode 100644 index 2d524b336..000000000 --- a/client/components/settings/peopleBody.styl +++ /dev/null @@ -1,83 +0,0 @@ -.main-body - overflow: scroll; - -table - color: #000; - - td, th - border: 1px solid #d2d0d0; - text-align: left; - padding: 8px; - - tr:nth-child(even) - background-color: #dddddd; - -.ext-box - display: flex; - flex-direction: row; - height: 34px; - - .ext-box-left - display: flex; - width: 100% - gap: 10px - - span - vertical-align: center; - line-height: 34px; - - input, button - padding: 0; - - button - min-width: 90px; - -.content-wrapper - margin-top: 10px - -.buttonsContainer - display: flex - - input - margin: 0 - - div - margin: auto - -.more-settings-user,.more-settings-team,.more-settings-org - margin-left: 10px; - -.js-orgs,.js-orgsNewUser - display: none; - -.js-teams,.js-teamsNewUser - display: none; - -.selectUserChkBox,.allUserChkBox - position: static !important; - visibility: visible !important; - left: 0 !important; - display: block !important; - -#divAddOrRemoveTeam - background: green; - display: none; - -#addOrRemoveTeam - background: green; - color: white; - -#divAddOrRemoveTeamContainer - display: none; - margin: auto; - width: 50%; - border: 3px solid green; - padding: 10px; - -#cancelBtn - margin-left: 5% !important; - background: orange; - color: white; - -#deleteAction - margin-left: 5% !important; diff --git a/client/components/settings/settingBody.css b/client/components/settings/settingBody.css new file mode 100644 index 000000000..11abe1d6d --- /dev/null +++ b/client/components/settings/settingBody.css @@ -0,0 +1,128 @@ +.flex, +.setting-content .content-body .side-menu ul li a, +.option { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; +} +.setting-content { + color: #727479; + background: #dedede; + width: 100%; + position: absolute; +} +.setting-content .content-title { + font-size: 20px; +} +.setting-content .content-body { + display: flex; + padding-top: 15px; + height: 100%; + gap: 10px; +} +.setting-content .content-body .side-menu { + background-color: #f7f7f7; + border: 1px solid #f0f0f0; + border-radius: 4px; + width: 250px; + box-shadow: inset -1px -1px 3px rgba(0,0,0,0.05); +} +.setting-content .content-body .side-menu ul li { + margin: 0.1rem 0.2rem; +} +.setting-content .content-body .side-menu ul li.active { + background: #fff; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); +} +.setting-content .content-body .side-menu ul li:hover { + background: #fff; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); +} +.setting-content .content-body .side-menu ul li a { + padding: 1rem 0 1rem 1rem; + width: 95%; +} +.setting-content .content-body .side-menu ul li a span { + font-size: 13px; +} +.setting-content .content-body .side-menu ul li a i { + margin-right: 20px; +} +.setting-content .content-body .main-body { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} +.setting-content .content-body .main-body ul li { + padding: 0.5rem 0.5rem; +} +.setting-content .content-body .main-body ul li a .is-checked { + border-bottom: 2px solid #2980b9; + border-right: 2px solid #2980b9; +} +.setting-content .content-body .main-body ul li a span { + padding: 0 0.5rem; +} +.setting-content .content-body .main-body ul li .admin-announcement, +.setting-content .content-body .main-body ul li .invite-people, +.setting-content .content-body .main-body ul li .layout { + padding-left: 20px; +} +.setting-content .content-body .main-body ul li .admin-announcement li, +.setting-content .content-body .main-body ul li .invite-people li, +.setting-content .content-body .main-body ul li .layout li { + min-width: 500px; +} +.setting-content .content-body .main-body ul li .admin-announcement li ul.no-margin-bottom, +.setting-content .content-body .main-body ul li .invite-people li ul.no-margin-bottom, +.setting-content .content-body .main-body ul li .layout li ul.no-margin-bottom { + margin-bottom: 0; +} +.setting-content .content-body .main-body ul li .admin-announcement li .bg-white a, +.setting-content .content-body .main-body ul li .invite-people li .bg-white a, +.setting-content .content-body .main-body ul li .layout li .bg-white a { + background: #f7f7f7; +} +.setting-content .content-body .main-body ul li .admin-announcement li .bg-white a.is-checked, +.setting-content .content-body .main-body ul li .invite-people li .bg-white a.is-checked, +.setting-content .content-body .main-body ul li .layout li .bg-white a.is-checked { + background: #fff; +} +.setting-content .content-body .main-body ul li input[type=radio] { + margin: 4px; +} +.option { + -webkit-border-radius: 3px; + border-radius: 3px; + background: #fff; + text-decoration: none; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + margin-top: 5px; + padding: 5px; +} +.title { + font-weight: 700; + margin-bottom: 0.5rem; +} +.description { + margin-bottom: 0.5rem; +} +.bg-white { + background: #f9fbfc; +} +.wekan-form-control.has-error { + border-color: #a94442; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} +li.has-error { + color: #a94442; +} +li.has-error .form-group .wekan-form-control { + border-color: #a94442; + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl deleted file mode 100644 index 6905f6182..000000000 --- a/client/components/settings/settingBody.styl +++ /dev/null @@ -1,121 +0,0 @@ -.flex - display: -webkit-box - display: -moz-box - display: -webkit-flex - display: -moz-flex - display: -ms-flexbox - display: flex - -.setting-content - color: #727479 - background: #dedede - width 100% - position: absolute; - - .content-title - font-size 20px - - .content-body - display flex - padding-top 15px - height 100% - gap: 10px; - - .side-menu - background-color: #f7f7f7; - border: 1px solid #f0f0f0; - border-radius: 4px; - width: 250px; - box-shadow: inset -1px -1px 3px rgba(0,0,0,.05); - - ul - - li - margin: 0.1rem 0.2rem; - - &.active - background #fff - box-shadow 0 1px 2px rgba(0,0,0,0.15); - - &:hover - background #fff - box-shadow 0 1px 2px rgba(0,0,0,0.15); - - a - @extends .flex - padding: 1rem 0 1rem 1rem - width: 100% - 5rem - - span - font-size: 13px - - i - margin-right: 20px - - .main-body - -webkit-user-select: text // Safari 3.1+ - -moz-user-select: text // Firefox 2+ - -ms-user-select: text // IE 10+ - user-select: text // Standard syntax - - ul - li - padding: 0.5rem 0.5rem; - - a - .is-checked - border-bottom: 2px solid #2980b9; - border-right: 2px solid #2980b9; - - span - padding: 0 0.5rem - - .admin-announcement, - .invite-people, - .layout - padding-left 20px; - li - min-width: 500px; - - ul.no-margin-bottom - margin-bottom: 0; - - .bg-white - a - background #f7f7f7 - &.is-checked - background #fff - - input[type=radio] - margin: 4px - -.option - @extends .flex - -webkit-border-radius: 3px; - border-radius: 3px; - background: #fff; - text-decoration: none; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); - box-shadow: 0 1px 2px rgba(0,0,0,0.2); - margin-top: 5px; - padding: 5px; - -.title - font-weight 700; - margin-bottom 0.5rem; -.description - margin-bottom 0.5rem; -.bg-white - background #f9fbfc; - -.wekan-form-control.has-error - border-color: #a94442; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075); - -li.has-error - color #a94442 - .form-group - .wekan-form-control - border-color: #a94442; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075); - diff --git a/client/components/settings/settingHeader.css b/client/components/settings/settingHeader.css new file mode 100644 index 000000000..dbd8582e3 --- /dev/null +++ b/client/components/settings/settingHeader.css @@ -0,0 +1,27 @@ +#header #header-main-bar .setting-header-btn { + color: #f2f2f2; + margin-left: 20px; + padding-right: 10px; + height: 28px; + font-size: 13px; + float: left; + overflow: hidden; + line-height: 28px; + margin: 0 2px; +} +#header #header-main-bar .setting-header-btn.active, +#header #header-main-bar .setting-header-btn:hover:not(.is-disabled) { + background: rgba(0,0,0,0.15); +} +#header #header-main-bar .setting-header-btn i.fa { + float: left; + display: block; + line-height: 28px; + color: #f2f2f2; + margin: 0 10px; +} +#header #header-main-bar .setting-header-btn + span { + display: inline-block; + margin-top: 1px; + margin-right: 10px; +} diff --git a/client/components/settings/settingHeader.styl b/client/components/settings/settingHeader.styl deleted file mode 100644 index 3699f180a..000000000 --- a/client/components/settings/settingHeader.styl +++ /dev/null @@ -1,25 +0,0 @@ -#header #header-main-bar .setting-header-btn - &.active, - &:hover:not(.is-disabled) - background: rgba(0, 0, 0, .15) - color: darken(white, 5%) - margin-left: 20px; - padding-right: 10px; - height: 28px; - font-size: 13px; - float: left; - overflow: hidden; - line-height: @height; - margin: 0 2px; - - i.fa - float: left - display: block - line-height: 28px - color: darken(white, 5%) - margin: 0 10px - - + span - display: inline-block - margin-top: 1px - margin-right: 10px diff --git a/client/components/sidebar/sidebar.css b/client/components/sidebar/sidebar.css new file mode 100644 index 000000000..c25e9bbac --- /dev/null +++ b/client/components/sidebar/sidebar.css @@ -0,0 +1,252 @@ +.sidebar { + position: absolute; + top: 0; + bottom: 0; + right: 0; +} +.sidebar .sidebar-shadow { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + background: #f7f7f7; + box-shadow: -10px 0px 5px -10px #b3b3b3; + z-index: 10; +} +.sidebar .sidebar-content { + padding: 12px; + margin-bottom: 1.6em; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + overflow-x: hidden; + overflow-y: auto; +} +.sidebar .sidebar-content .hide-btn { + display: none; +} +.sidebar .sidebar-content h3 { + color: #808080; + font-size: 1em; + margin-bottom: 10px; + font-weight: bold; +} +.sidebar .sidebar-content h3 i.fa { + margin-right: 3px; +} +.sidebar .sidebar-content hr { + margin: 13px 0; +} +.sidebar .sidebar-content ul.sidebar-list { + display: flex; + flex-direction: column; +} +.sidebar .sidebar-content ul.sidebar-list li > a { + display: flex; + height: 30px; + margin: 0; + padding: 4px; + border-radius: 3px; + align-items: center; +} +.sidebar .sidebar-content ul.sidebar-list li > a:hover, +.sidebar .sidebar-content ul.sidebar-list li > a:hover i, +.sidebar .sidebar-content ul.sidebar-list li > a:hover .quiet { + color: #fff; +} +.sidebar .sidebar-content ul.sidebar-list li > a .member, +.sidebar .sidebar-content ul.sidebar-list li > a .card-label { + margin-right: 7px; + margin-top: 5px; +} +.sidebar .sidebar-content ul.sidebar-list li > a .minicard-edit-button { + float: right; + padding: 8px; + border-radius: 3px; +} +.sidebar .sidebar-content ul.sidebar-list li > a .sidebar-list-item-description { + flex: 1; + overflow: ellipsis; +} +.sidebar .sidebar-content ul.sidebar-list li > a .fa.fa-check { + margin: 0 4px; +} +.sidebar .sidebar-content ul.sidebar-list li .minicard { + padding: 6px 8px 4px; +} +.sidebar .sidebar-content ul.sidebar-list li .minicard .minicard-edit-button { + float: right; + padding: 4px; + border-radius: 3px; +} +.sidebar .sidebar-content ul.sidebar-list li .minicard .minicard-edit-button:hover { + background: #dbdbdb; +} +.sidebar .sidebar-content .sidebar-btn { + display: block; + margin: 5px 0; + padding: 10px; + border-radius: 3px; + background: #e6e6e6; +} +.sidebar .sidebar-content .sidebar-btn:hover * { + color: #fff; +} +.sidebar .sidebar-content .sidebar-btn i.fa { + margin-right: 10px; +} +.sidebar .sidebar-shortcuts { + position: absolute; + margin-left: 40%; + padding: 0; + top: 7px; + font-size: 0.8em; + line-height: 1.6em; + color: #999; +} +.board-sidebar { + width: 548px; + right: -548px; + transition: top 0.1s, right 0.1s, width 0.1s; +} +.board-sidebar.is-open { + right: 0; +} +.board-widget h4 { + margin: 5px 0; +} +.board-widget-activity { + margin-right: -4px; +} +.sidebar-tongue { + display: block; + width: 30px; + height: 30px; + left: -30px; + position: absolute; + top: 0px; + z-index: 15; + background: #f7f7f7; + border-bottom-left-radius: 3px; + box-shadow: -4px 0px 7px -4px #b3b3b3; + color: #808080; + transition: left 0.1s; +} +.sidebar-tongue i.fa { + padding: 3px 9px; + font-size: 24px; + transition: transform 0.5s; +} +.board-sidebar.is-open .sidebar-tongue { + left: -28px; +} +.board-sidebar.is-open .sidebar-tongue:hover { + left: -25px; +} +.board-sidebar.is-open .sidebar-tongue i.fa { + transform: rotate(180deg); +} +.sidebar-tongue.is-hidden, +.board-sidebar.is-open .sidebar-tongue.is-hidden { + z-index: 0; + left: 5px; +} +.archived-lists .archived-lists-item { + border-top: 1px solid #ccc; + clear: both; + padding: 5px 0; +} +.archived-lists .archived-lists-item:first-child { + border-top: none; +} +.archived-lists .archived-lists-item button { + float: right; + margin: 0; + margin: 0 0 5px 5px; + padding: 0 10px 0 10px; +} +@media screen and (max-width: 800px) { + .board-sidebar { + width: 100%; + right: -100%; + } + .board-sidebar .sidebar-content .hide-btn { + width: 40px; + height: 40px; + position: absolute; + right: 5px; + top: 5px; + display: block; + z-index: 15; + background: #f7f7f7; + transition: left 0.1s; + color: #808080; + border-radius: 50%; + border: 1px solid #b3b3b3; + box-shadow: 0 1px 6px rgba(0,0,0,0.3); + color: #808080; + } + .board-sidebar .sidebar-content .hide-btn i.fa { + padding: 8px 16px; + font-size: 24px; + font-weight: bold; + } + .sidebar-tongue { + width: 40px; + height: 40px; + left: -47px; + top: 5px; + display: block; + border-radius: 50%; + border: 1px solid #b3b3b3; + box-shadow: 0 1px 6px rgba(0,0,0,0.3); + color: #808080; + } + .board-sidebar.is-open .sidebar-tongue { + display: none; + } + .sidebar-tongue i.fa { + padding: 8px 0px 8px 16px; + font-weight: bold; + } +} +#jsBoardOrgs, +#jsBoardTeams { + width: 90%; +} +.leaveBoardBtn { + background-color: #008000 !important; +} +.cancelLeaveBoardBtn { + margin-left: 5% !important; + background-color: #f00 !important; +} +.addTeamsLabel, +.addOrganizationsLabel { + font-weight: normal; +} +.js-manage-board-removeTeam:hover, +.js-manage-board-removeTeam.is-active, +.js-manage-board-removeOrg:hover, +.js-manage-board-removeOrg.is-active { + box-shadow: 0 0 0 2px #e23210 inset !important; +} +.js-manage-board-addTeam:hover, +.js-manage-board-addTeam.is-active, +.js-manage-board-addOrg:hover, +.js-manage-board-addOrg.is-active { + box-shadow: 0 0 0 2px #73ea10 inset !important; +} +.addTeamFaPlus { + color: #008000 !important; +} +.removeTeamFaMinus { + color: #f00 !important; +} +.divaddfaplusminus { + padding-top: 5px; + margin-left: 40px; +} diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl deleted file mode 100644 index 1f0c03d70..000000000 --- a/client/components/sidebar/sidebar.styl +++ /dev/null @@ -1,247 +0,0 @@ -@import 'nib' - -.sidebar - position: absolute - top: 0 - bottom: 0 - right: 0 - - .sidebar-shadow - position: absolute - top: 0 - bottom: 0 - right: 0 - left: 0 - background: darken(white, 3%) - box-shadow: -10px 0px 5px -10px darken(white, 30%) - z-index: 10 - - .sidebar-content - padding: 12px - margin-bottom: 1.6em - position: absolute - top: 0 - bottom: 0 - right: 0 - left: 0 - overflow-x: hidden - overflow-y: auto - - .hide-btn - display: none - - h3 - color: darken(white, 50%) - font-size: 1em - margin-bottom: 10px - font-weight: bold - - i.fa - margin-right: 3px - - hr - margin: 13px 0 - - ul.sidebar-list - display: flex - flex-direction: column - - li - & > a - display: flex - height: 30px - margin: 0 - padding: 4px - border-radius: 3px - align-items: center - - &:hover - &, i, .quiet - color white - - .member, .card-label - margin-right: 7px - margin-top: 5px - - .minicard-edit-button - float: right - padding: 8px - border-radius: 3px - - .sidebar-list-item-description - flex: 1 - overflow: ellipsis - - .fa.fa-check - margin: 0 4px - - .minicard - padding: 6px 8px 4px - - .minicard-edit-button - float: right - padding: 4px - border-radius: 3px - - &:hover - background: #dbdbdb - - .sidebar-btn - display: block - margin: 5px 0 - padding: 10px - border-radius: 3px - background: darken(white, 10%) - - &:hover * - color: white - - i.fa - margin-right: 10px - - .sidebar-shortcuts - position: absolute - margin-left: 40% - padding: 0 - top: 7px - font-size: 0.8em - line-height: 1.6em - color: darken(white, 40%) - -.board-sidebar - width: 548px - right: -@width - transition: top .1s, right .1s, width .1s - - &.is-open - right: 0 - -.board-widget h4 - margin: 5px 0 - -.board-widget-activity - margin-right: -4px - -.sidebar-tongue - display: block - width: 30px - height: @width - left: -@width - position: absolute - top: 0px - z-index: 15 - background: darken(white, 3%) - border-bottom-left-radius: 3px - box-shadow: -4px 0px 7px -4px darken(white, 30%) - color: darken(white, 50%) - transition: left .1s - - i.fa - padding: 3px 9px - font-size: 24px - transition: transform 0.5s - - .board-sidebar.is-open & - left: -@width + 2px - - // XXX Bug: we should add a padding left - &:hover - left: -@width + 5px - - i.fa - transform: rotate(180deg) - - &.is-hidden, - .board-sidebar.is-open &.is-hidden - z-index: 0 - left: 5px - -.archived-lists .archived-lists-item - border-top: 1px solid darken(white, 20%) - clear: both - padding: 5px 0 - - &:first-child - border-top: none - - button - float: right - margin: 0 - margin: 0 0 5px 5px - padding: 0 10px 0 10px - -@media screen and (max-width: 800px) - .board-sidebar - width: 100% - right: -@width - - .sidebar-content - .hide-btn - width: 40px - height: @width - position: absolute - right: 5px - top: 5px - display: block - z-index: 15 - background: darken(white, 3%) - transition: left .1s - color: darken(white, 50%) - border-radius: 50% - border: 1px solid darken(white, 30%) - box-shadow: 0 1px 6px rgba(0, 0, 0, .3) - color: darken(white, 50%) - - i.fa - padding: 8px 16px - font-size: 24px - font-weight: bold - - .sidebar-tongue - width: 40px - height: @width - left: -@width - 7px - top: 5px - display: block - border-radius: 50% - border: 1px solid darken(white, 30%) - box-shadow: 0 1px 6px rgba(0, 0, 0, .3) - color: darken(white, 50%) - - .board-sidebar.is-open & - display: none - - i.fa - padding: 8px 0px 8px 16px - font-weight: bold - -#jsBoardOrgs, #jsBoardTeams - width: 90% - -.leaveBoardBtn - background-color: green !important - -.cancelLeaveBoardBtn - margin-left: 5% !important - background-color: red !important - -.addTeamsLabel, .addOrganizationsLabel - font-weight: normal - -.js-manage-board-removeTeam:hover, .js-manage-board-removeTeam.is-active, -.js-manage-board-removeOrg:hover, .js-manage-board-removeOrg.is-active - box-shadow: 0 0 0 2px #e23210 inset !important - -.js-manage-board-addTeam:hover, .js-manage-board-addTeam.is-active, -.js-manage-board-addOrg:hover , .js-manage-board-addOrg.is-active - box-shadow: 0 0 0 2px #73ea10 inset !important - -.addTeamFaPlus - color: green !important - -.removeTeamFaMinus - color: red !important - -.divaddfaplusminus - padding-top: 5px; - margin-left: 40px; diff --git a/client/components/sidebar/sidebarSearches.css b/client/components/sidebar/sidebarSearches.css new file mode 100644 index 000000000..a3c900ef6 --- /dev/null +++ b/client/components/sidebar/sidebarSearches.css @@ -0,0 +1,3 @@ +input { + max-width: 100%; +} diff --git a/client/components/sidebar/sidebarSearches.styl b/client/components/sidebar/sidebarSearches.styl deleted file mode 100644 index 6b8ad904f..000000000 --- a/client/components/sidebar/sidebarSearches.styl +++ /dev/null @@ -1,2 +0,0 @@ -input - max-width: 100% diff --git a/client/components/swimlanes/swimlanes.css b/client/components/swimlanes/swimlanes.css new file mode 100644 index 000000000..96cad9fe1 --- /dev/null +++ b/client/components/swimlanes/swimlanes.css @@ -0,0 +1,220 @@ +/* +// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp + +.accordion + cursor: pointer + width: 30px + height: 20px + border: none + outline: none + font-size: 18px + transition: 0.4s + padding-top: 0px + margin-top: 0px + +.accordion:after + // Unicode triagle right: + content: '\25B6' + color: #777 + font-weight: bold + float: left + +.active:after + // Unicode triangle down: + content: '\25BC' + +.panel + width: 100% + max-height: 0 + overflow: hidden + transition: max-height 0.2s ease-out + margin: 0px + padding: 0px + +// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp +*/ +@media screen and (min-width: 801px) { + .swimlane.ui-sortable { + width: max-content; + } +} +[class=swimlane] { + position: sticky; + left: 0; +} +.swimlane { + background: #dedede; + display: flex; + flex-direction: row; + overflow: 0; + max-height: calc(100% - 26px); +} +.swimlane.placeholder { + background-color: rgba(0,0,0,0.2); + border-color: transparent; + box-shadow: none; + height: 100px; +} +.swimlane.ui-sortable-helper { + box-shadow: -2px 2px 8px rgba(0,0,0,0.3), 0 0 1px rgba(0,0,0,0.5); + transform: rotate(2deg); + cursor: grabbing; +} +.swimlane.ui-sortable-helper .swimlane-header.ui-sortable-handle { + cursor: grabbing; +} +.swimlane .swimlane-header-wrap { + display: flex; + flex-direction: row; + flex: 1 0 100%; + background-color: #ccc; +} +.swimlane .swimlane-header-wrap .swimlane-header { + font-size: 14px; + padding: 5px 5px; + font-weight: bold; + min-height: 9px; + width: 100%; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + word-wrap: break-word; + text-align: center; +} +.swimlane .swimlane-header-wrap .swimlane-header-menu { + position: absolute; + padding: 5px 5px; + font-size: 22px; +} +.swimlane .swimlane-header-wrap .swimlane-header-plus-icon { + margin-left: 5px; + padding-right: 20px; + font-size: 22px; +} +.swimlane .swimlane-header-wrap .swimlane-header-menu-icon { + padding-right: 20px; + font-size: 22px; +} +.swimlane .swimlane-header-wrap .swimlane-header-handle { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + left: 230px; + font-size: 18px; +} +.swimlane .swimlane-header-wrap .swimlane-header-miniscreen-handle { + position: absolute; + padding: 7px; + top: 50%; + transform: translateY(-50%); + left: 87vw; + font-size: 24px; +} +.list-group { + height: 100%; +} +.moving-swimlane { + display: none; +} +.swimlane-white { + background: #fff !important; + color: #4d4d4d !important; + border: 1px solid #eee; +} +.swimlane-green { + background: #3cb500 !important; + color: #fff !important; +} +.swimlane-yellow { + background: #fad900 !important; + color: #4d4d4d !important; +} +.swimlane-orange { + background: #ff9f19 !important; + color: #4d4d4d !important; +} +.swimlane-red { + background: #eb4646 !important; + color: #fff !important; +} +.swimlane-purple { + background: #a632db !important; + color: #fff !important; +} +.swimlane-blue { + background: #0079bf !important; + color: #fff !important; +} +.swimlane-pink { + background: #ff78cb !important; + color: #4d4d4d !important; +} +.swimlane-sky { + background: #00c2e0 !important; + color: #fff !important; +} +.swimlane-black { + background: #4d4d4d !important; + color: #fff !important; +} +.swimlane-lime { + background: #51e898 !important; + color: #4d4d4d !important; +} +.swimlane-silver { + background: unset !important; + color: #4d4d4d !important; +} +.swimlane-peachpuff { + background: #ffdab9 !important; + color: #4d4d4d !important; +} +.swimlane-crimson { + background: #dc143c !important; + color: #fff !important; +} +.swimlane-plum { + background: #dda0dd !important; + color: #4d4d4d !important; +} +.swimlane-darkgreen { + background: #006400 !important; + color: #fff !important; +} +.swimlane-slateblue { + background: #6a5acd !important; + color: #fff !important; +} +.swimlane-magenta { + background: #f0f !important; + color: #fff !important; +} +.swimlane-gold { + background: #ffd700 !important; + color: #4d4d4d !important; +} +.swimlane-navy { + background: #000080 !important; + color: #fff !important; +} +.swimlane-gray { + background: #808080 !important; + color: #fff !important; +} +.swimlane-saddlebrown { + background: #8b4513 !important; + color: #fff !important; +} +.swimlane-paleturquoise { + background: #afeeee !important; + color: #4d4d4d !important; +} +.swimlane-mistyrose { + background: #ffe4e1 !important; + color: #4d4d4d !important; +} +.swimlane-indigo { + background: #4b0082 !important; + color: #fff !important; +} diff --git a/client/components/swimlanes/swimlanes.styl b/client/components/swimlanes/swimlanes.styl deleted file mode 100644 index c57e0ec41..000000000 --- a/client/components/swimlanes/swimlanes.styl +++ /dev/null @@ -1,205 +0,0 @@ -@import 'nib' - -/* -// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp - -.accordion - cursor: pointer - width: 30px - height: 20px - border: none - outline: none - font-size: 18px - transition: 0.4s - padding-top: 0px - margin-top: 0px - -.accordion:after - // Unicode triagle right: - content: '\25B6' - color: #777 - font-weight: bold - float: left - -.active:after - // Unicode triangle down: - content: '\25BC' - -.panel - width: 100% - max-height: 0 - overflow: hidden - transition: max-height 0.2s ease-out - margin: 0px - padding: 0px - -// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp -*/ - -@media screen and (min-width: 801px) - .swimlane.ui-sortable - // swimlane must have max width, otherwise lists are not sortable if there are too much lists and the swimlane "scrollable" - width: max-content - -[class=swimlane] - position: sticky - left: 0 - -.swimlane - // Even if this background color is the same as the body we can't leave it - // transparent, because that won't work during a swimlane drag. - background: darken(white, 13%) - display: flex - flex-direction: row - overflow: 0; - max-height: calc(100% - 26px) - - &.placeholder - background-color: rgba(0, 0, 0, .2) - border-color: transparent - box-shadow: none - height: 100px - - &.ui-sortable-helper - box-shadow: -2px 2px 8px rgba(0, 0, 0, .3), - 0 0 1px rgba(0, 0, 0, .5) - transform: rotate(2deg) - cursor: grabbing - - .swimlane-header.ui-sortable-handle - cursor: grabbing - - .swimlane-header-wrap - display: flex - flex-direction: row - flex: 1 0 100% - background-color: #ccc - - .swimlane-header - font-size: 14px - padding: 5px 5px - font-weight: bold - min-height: 9px - width: 100% - overflow: hidden - -o-text-overflow: ellipsis - text-overflow: ellipsis - word-wrap: break-word - text-align: center - - .swimlane-header-menu - position: absolute - padding: 5px 5px - font-size: 22px - - .swimlane-header-plus-icon - margin-left: 5px - padding-right: 20px - font-size: 22px - - .swimlane-header-menu-icon - padding-right: 20px - font-size: 22px - - .swimlane-header-handle - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - left: 230px - font-size: 18px - - .swimlane-header-miniscreen-handle - position: absolute - padding: 7px - top: 50% - transform: translateY(-50%) - left: 87vw - font-size: 24px - -.list-group - height: 100% - -.moving-swimlane - display: none - -swimlane-color(background, color...) - background: background !important - if color - color: color !important //overwrite text for better visibility - -.swimlane-white - swimlane-color(#ffffff, #4d4d4d) //Black text for better visibility - border: 1px solid #eee - -.swimlane-green - swimlane-color(#3cb500, #ffffff) //White text for better visibility - -.swimlane-yellow - swimlane-color(#fad900, #4d4d4d) //Black text for better visibility - -.swimlane-orange - swimlane-color(#ff9f19, #4d4d4d) //Black text for better visibility - -.swimlane-red - swimlane-color(#eb4646, #ffffff) //White text for better visibility - -.swimlane-purple - swimlane-color(#a632db, #ffffff) //White text for better visibility - -.swimlane-blue - swimlane-color(#0079bf, #ffffff) //White text for better visibility - -.swimlane-pink - swimlane-color(#ff78cb, #4d4d4d) //Black text for better visibility - -.swimlane-sky - swimlane-color(#00c2e0, #ffffff) //White text for better visibility - -.swimlane-black - swimlane-color(#4d4d4d, #ffffff) //White text for better visibility - -.swimlane-lime - swimlane-color(#51e898, #4d4d4d) //Black text for better visibility - -.swimlane-silver - swimlane-color(unset, #4d4d4d) //Black text for better visibility - -.swimlane-peachpuff - swimlane-color(#ffdab9, #4d4d4d) //Black text for better visibility - -.swimlane-crimson - swimlane-color(#dc143c, #ffffff) //White text for better visibility - -.swimlane-plum - swimlane-color(#dda0dd, #4d4d4d) //Black text for better visibility - -.swimlane-darkgreen - swimlane-color(#006400, #ffffff) //White text for better visibility - -.swimlane-slateblue - swimlane-color(#6a5acd, #ffffff) //White text for better visibility - -.swimlane-magenta - swimlane-color(#ff00ff, #ffffff) //White text for better visibility - -.swimlane-gold - swimlane-color(#ffd700, #4d4d4d) //Black text for better visibility - -.swimlane-navy - swimlane-color(#000080, #ffffff) //White text for better visibility - -.swimlane-gray - swimlane-color(#808080, #ffffff) //White text for better visibility - -.swimlane-saddlebrown - swimlane-color(#8b4513, #ffffff) //White text for better visibility - -.swimlane-paleturquoise - swimlane-color(#afeeee, #4d4d4d) //Black text for better visibility - -.swimlane-mistyrose - swimlane-color(#ffe4e1, #4d4d4d) //Black text for better visibility - -.swimlane-indigo - swimlane-color(#4b0082, #ffffff) //White text for better visibility diff --git a/client/components/users/userAvatar.css b/client/components/users/userAvatar.css new file mode 100644 index 000000000..a26ed10e4 --- /dev/null +++ b/client/components/users/userAvatar.css @@ -0,0 +1,116 @@ +.member { + border-radius: 3px; + display: block; + position: relative; + float: left; + height: 30px; + width: 30px; + cursor: pointer; + user-select: none; + z-index: 1; + text-decoration: none; + border-radius: 50%; +} +.member .avatar { + overflow: hidden; + border-radius: 50%; +} +.member .avatar.avatar-initials { + height: 70%; + width: 70%; + padding: 15%; + background-color: #dbdbdb; + color: #444; + position: absolute; +} +.member .avatar.avatar-image { + object-fit: cover; + object-position: center; + height: 100%; + width: 100%; +} +.member .member-presence-status { + background-color: #b3b3b3; + border: 1px solid #fff; + border-radius: 50%; + height: 7px; + width: 7px; + position: absolute; + right: -1px; + bottom: -1px; + border: 1px solid #fff; + z-index: 15; +} +.member .member-presence-status.active { + background: #64c464; + border-color: #daf1da; +} +.member .member-presence-status.idle { + background: #e4e467; + border-color: #f7f7d4; +} +.member .member-presence-status.disconnected { + background: #bdbdbd; + border-color: #ededed; +} +.member .member-presence-status.pending { + background: #e44242; + border-color: #f1dada; +} +.member .edit-avatar { + position: absolute; + top: 0; + height: 100%; + width: 100%; + border-radius: 50%; + background: #000; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; +} +.member .edit-avatar:hover { + opacity: 0.6; +} +.member .edit-avatar i.fa-pencil { + color: #fff; +} +.member.add-member { + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0 0 2px #bfbfbf inset; +} +.member.add-member:hover, +.member.add-member.is-active { + box-shadow: 0 0 0 2px #666 inset; +} +.atMention { + background: #dbdbdb; + border-radius: 3px; + padding: 1px 4px; + margin: -1px 0; + display: inline-block; +} +.atMention.me { + background: #cfdfe8; +} +.mini-profile-info { + margin-top: 10px; +} +.mini-profile-info .info { + padding-top: 5px; +} +.mini-profile-info .info h3, +.mini-profile-info .info p { + margin-bottom: 0; + padding-left: 0; +} +.mini-profile-info .info p { + padding-top: 0; +} +.mini-profile-info .member { + width: 50px; + height: 50px; + margin-right: 10px; +} diff --git a/client/components/users/userAvatar.styl b/client/components/users/userAvatar.styl deleted file mode 100644 index 8dca90535..000000000 --- a/client/components/users/userAvatar.styl +++ /dev/null @@ -1,118 +0,0 @@ -@import 'nib' - -avatar-radius = 50% - -.member - border-radius: 3px - display: block - position: relative - float: left - height: 30px - width: @height - cursor: pointer - user-select: none - z-index: 1 - text-decoration: none - border-radius: avatar-radius - - .avatar - overflow: hidden - border-radius: avatar-radius - - &.avatar-initials - height: 70% - width: @height - padding: 15% - background-color: #dbdbdb - color: #444444 - position: absolute - - &.avatar-image - object-fit: cover; - object-position: center; - height: 100% - width: @height - - .member-presence-status - background-color: #b3b3b3 - border: 1px solid #fff - border-radius: 50% - height: 7px - width: @height - position: absolute - right: -1px - bottom: -1px - border: 1px solid white - z-index: 15 - - &.active - background: #64c464 - border-color: #daf1da - - &.idle - background: #e4e467 - border-color: #f7f7d4 - - &.disconnected - background: #bdbdbd - border-color: #ededed - - &.pending - background: #e44242 - border-color: #f1dada - - .edit-avatar - position: absolute - top: 0 - height: 100% - width: 100% - border-radius: avatar-radius - background: black - display: flex - align-items: center - justify-content: center - opacity: 0 - - &:hover - opacity: 0.6 - - i.fa-pencil - color: white - - - &.add-member - display: flex - align-items: center - justify-content: center - box-shadow: 0 0 0 2px darken(white, 25%) inset - - &:hover, &.is-active - box-shadow: 0 0 0 2px darken(white, 60%) inset - -.atMention - background: #dbdbdb - border-radius: 3px - padding: 1px 4px - margin: -1px 0 - display: inline-block - - &.me - background: #cfdfe8 - -.mini-profile-info - margin-top: 10px - - .info - padding-top: 5px - - h3, p - margin-bottom: 0 - padding-left: 0 - - p - padding-top: 0 - - .member - width: 50px - height: @width - margin-right: 10px diff --git a/client/components/users/userForm.css b/client/components/users/userForm.css new file mode 100644 index 000000000..e2f5420a0 --- /dev/null +++ b/client/components/users/userForm.css @@ -0,0 +1,94 @@ +.auth-layout .at-form-landing-logo { + width: 249px; + margin: auto; + margin-top: 50px; + margin-bottom: 20px; +} +.auth-layout .auth-dialog { + width: 275px; + padding: 25px; + margin: auto; + margin-bottom: 20px; + background: #fff; + border-radius: 3px; + border: 1px solid #dbdbdb; + border-bottom-color: #c2c2c2; + box-shadow: 0 1px 6px rgba(0,0,0,0.3); +} +.auth-layout .auth-dialog .at-form .at-link { + color: #17683a; +} +.auth-layout .auth-dialog .at-form label { + margin-bottom: 3px; +} +.auth-layout .auth-dialog .at-form input { + width: 100%; +} +.auth-layout .auth-dialog .at-form button { + width: 100%; + background: #216694; + color: #fff; +} +.auth-layout .auth-dialog .at-form .at-title { + background: #f7f7f7; + margin: -25px; + padding: 15px 25px 5px; + margin-bottom: 20px; + border-bottom: 1px solid #dcdcdc; + color: #4d4d4d; + font-weight: bold; +} +.auth-layout .auth-dialog .at-form .at-signup-link, +.auth-layout .auth-dialog .at-form .at-signin-link, +.auth-layout .auth-dialog .at-form .at-forgotPwd { + font-size: 0.9em; + margin-top: 15px; + color: #4d4d4d; +} +.auth-layout .auth-dialog .at-form .at-signup-link .at-signUp, +.auth-layout .auth-dialog .at-form .at-signin-link .at-signUp, +.auth-layout .auth-dialog .at-form .at-forgotPwd .at-signUp, +.auth-layout .auth-dialog .at-form .at-signup-link .at-signIn, +.auth-layout .auth-dialog .at-form .at-signin-link .at-signIn, +.auth-layout .auth-dialog .at-form .at-forgotPwd .at-signIn { + font-weight: bold; +} +.auth-layout .auth-dialog .at-form-lang { + margin-top: 0px; +} +.auth-layout .auth-dialog .at-form-lang .select-lang { + width: 100%; + margin-top: 10px; +} +@media screen and (max-width: 800px) { + .auth-layout { + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; + } + .auth-layout .at-form-landing-logo { + width: 125px; + position: absolute; + top: 0px; + right: 20px; + margin-top: 5px; + margin-bottom: 5px; + } + .auth-layout .at-form-landing-logo img { + width: 125px; + } + .auth-layout .auth-dialog { + width: calc(100% - 50px); + height: calc(100% - 50px); + padding: 25px; + min-height: 380px; + margin: 0px; + margin-bottom: 0px; + border: 0px; + } + .auth-layout .auth-dialog .at-form .at-title h3 { + width: calc(100% - 125px); + overflow-x: hidden; + } +} diff --git a/client/components/users/userForm.styl b/client/components/users/userForm.styl deleted file mode 100644 index 6788bf599..000000000 --- a/client/components/users/userForm.styl +++ /dev/null @@ -1,95 +0,0 @@ -@import 'nib' - -.auth-layout - .at-form-landing-logo - width: 249px - margin: auto - margin-top: 50px - margin-bottom: 20px - - .auth-dialog - width: 275px - padding: 25px - margin: auto - margin-bottom: 20px - background: #fff - border-radius: 3px - border: 1px solid #dbdbdb - border-bottom-color: #c2c2c2 - box-shadow: 0 1px 6px rgba(0, 0, 0, .3) - - .at-form - - .at-link - color: darken(#27AE60, 40%) - - label - margin-bottom: 3px - - input - width: 100% - - button - width: 100% - background: #216694 - color: #fff - - .at-title - background: #F7F7F7 - margin: -25px - padding: 15px 25px 5px - margin-bottom: 20px - border-bottom: 1px solid #dcdcdc - color: darken(white, 70%) - font-weight: bold - - .at-signup-link, - .at-signin-link, - .at-forgotPwd - font-size: 0.9em - margin-top: 15px - color: darken(white, 70%) - - .at-signUp, - .at-signIn - font-weight: bold - - .at-form-lang - margin-top: 0px - - .select-lang - width: 100% - margin-top: 10px - -@media screen and (max-width: 800px) - .auth-layout - width: 100% - height: 100% - margin: 0px - padding: 0px - - .at-form-landing-logo - width: 125px - position: absolute - top: 0px - right: 20px - margin-top: 5px - margin-bottom: 5px - - img - width: 125px - - .auth-dialog - width: calc(100% - 50px) - height: calc(100% - 50px) - padding: 25px - min-height: 380px - margin: 0px - margin-bottom: 0px - border: 0px - - .at-form - .at-title - h3 - width: calc(100% - 125px) - overflow-x: hidden diff --git a/releases/stylus-to-css.sh b/releases/stylus-to-css.sh new file mode 100755 index 000000000..139f9eb8a --- /dev/null +++ b/releases/stylus-to-css.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Convert Stylus to CSS. +# npm -g install stylus +# +sed -i "s|@import 'nib'|//@import 'nib'|g" *.styl +ls *.styl | xargs stylus From 27f8356b542d2bf37ff44c4c7b721c0e0fcb60b9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 12:40:24 +0300 Subject: [PATCH 130/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6f25c0ee..f83d3d884 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,8 @@ and fixes the following bugs: [Part 2](https://github.com/wekan/wekan/commit/2e5ec0308f2ac8059af6219693177e294197776a), [Part 3](https://github.com/wekan/wekan/commit/441b3e9c0a50b21da2c875946ff1059a14ce04e4). Thanks to mfilser. +- [Converted Stylus to CSS. Removed Stylus. This change removed many error messages](https://github.com/wekan/wekan/commit/072778b9aaefd7fcaa7519b1ce1cafc1704d646d). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 6af581422c45120f746a6ca3dd8a253d130ea76e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 12:44:46 +0300 Subject: [PATCH 131/246] Updated translations. --- imports/i18n/data/ar.i18n.json | 86 +++++++++++++++++----------------- imports/i18n/data/it.i18n.json | 2 +- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index fd9844f7b..3c2295efb 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -748,7 +748,7 @@ "r-added-to": "Added to", "r-removed-from": "Removed from", "r-the-board": "the board", - "r-list": "list", + "r-list": "قائمة", "list": "List", "set-filter": "Set Filter", "r-moved-to": "Moved to", @@ -779,9 +779,9 @@ "r-unarchive": "Restore from Archive", "r-card": "card", "r-add": "أضف", - "r-remove": "Remove", + "r-remove": "إزالة", "r-label": "label", - "r-member": "member", + "r-member": "عضو", "r-remove-all": "Remove all members from the card", "r-set-color": "Set color to", "r-checklist": "checklist", @@ -834,9 +834,9 @@ "r-set": "Set", "r-update": "Update", "r-datefield": "date field", - "r-df-start-at": "start", + "r-df-start-at": "بداية", "r-df-due-at": "due", - "r-df-end-at": "end", + "r-df-end-at": "نهاية", "r-df-received-at": "received", "r-to-current-datetime": "to current date/time", "r-remove-value-from": "Remove value from", @@ -941,7 +941,7 @@ "myCardsViewChange-title": "My Cards View", "myCardsViewChangePopup-title": "My Cards View", "myCardsViewChange-choice-boards": "لوحات", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "جدول", "myCardsSortChange-title": "My Cards Sort", "myCardsSortChangePopup-title": "My Cards Sort", "myCardsSortChange-choice-board": "By Board", @@ -949,8 +949,8 @@ "dueCards-title": "Due Cards", "dueCardsViewChange-title": "Due Cards View", "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-me": "انا", + "dueCardsViewChange-choice-all": "كل المستخدمين", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", @@ -967,17 +967,17 @@ "one-card-found": "One Card Found", "n-cards-found": "%s Cards Found", "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", + "operator-board": "لوح", "operator-board-abbrev": "b", "operator-swimlane": "swimlane", "operator-swimlane-abbrev": "s", - "operator-list": "list", + "operator-list": "قائمة", "operator-list-abbrev": "l", "operator-label": "label", "operator-label-abbrev": "#", - "operator-user": "user", + "operator-user": "مستخدم", "operator-user-abbrev": "@", - "operator-member": "member", + "operator-member": "عضو", "operator-member-abbrev": "m", "operator-assignee": "assignee", "operator-assignee-abbrev": "a", @@ -992,26 +992,26 @@ "operator-limit": "limit", "operator-debug": "debug", "operator-org": "org", - "operator-team": "team", + "operator-team": "فريق", "predicate-archived": "archived", "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", + "predicate-ended": "انتهى", + "predicate-all": "كل", "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", + "predicate-week": "اسبوع", + "predicate-month": "شهر", "predicate-quarter": "quarter", - "predicate-year": "year", + "predicate-year": "سنة", "predicate-due": "due", "predicate-modified": "modified", "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", + "predicate-attachment": "ملحق", + "predicate-description": "وصف", "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", + "predicate-start": "بداية", + "predicate-end": "نهاية", "predicate-assignee": "assignee", - "predicate-member": "member", + "predicate-member": "عضو", "predicate-public": "public", "predicate-private": "private", "predicate-selector": "selector", @@ -1023,9 +1023,9 @@ "operator-has-invalid": "%s is not a valid existence check", "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", + "next-page": "الصفحة اللاحقة", + "previous-page": "الصفحة السابقة", + "heading-notes": "ملاحظات", "globalSearch-instructions-heading": "Search Instructions", "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", "globalSearch-instructions-operators": "Available operators:", @@ -1069,12 +1069,12 @@ "sort-cards": "Sort Cards", "cardsSortPopup-title": "Sort Cards", "due-date": "Due Date", - "server-error": "Server Error", + "server-error": "خطأ بالخادم", "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", "title-alphabetically": "Title (Alphabetically)", "created-at-newest-first": "Created At (Newest First)", "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", + "links-heading": "روابط", "hide-system-messages-of-all-users": "Hide system messages of all users", "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", "move-swimlane": "Move Swimlane", @@ -1105,28 +1105,28 @@ "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", + "subject": "موضوع", + "details": "تفاصيل", "carbon-copy": "Carbon Copy (Cc:)", "ticket": "Ticket", "tickets": "Tickets", "ticket-number": "Ticket Number", - "open": "Open", + "open": "مفتوح", "pending": "Pending", - "closed": "Closed", + "closed": "مقفل", "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", + "cancelled": "الغاء", + "history": "تاريخ", "request": "Request", "requests": "Requests", "help-request": "Help Request", "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", + "cardDetailsPopup-title": "نقاصيل البطاقة", + "add-teams": "اضافة فرق", "add-teams-label": "Added teams are displayed below:", "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", + "confirm-btn": "تأكيد", + "remove-btn": "إزالة", "filter-card-title-label": "Filter by card title", "invite-people-success": "Invitation to register sent with success", "invite-people-error": "Error while sending invitation to register", @@ -1152,9 +1152,9 @@ "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", + "acceptance_of_our_legalNotice": "بالاستمرار سوف توافق على", + "legalNotice": "إشعار قانوني", + "copied": "تم النسخ!", "checklistActionsPopup-title": "Checklist Actions", "moveChecklist": "Move Checklist", "moveChecklistPopup-title": "Move Checklist", @@ -1173,8 +1173,8 @@ "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", "path": "Path", "version-name": "Version-Name", - "size": "Size", + "size": "حجم", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "عنوان اللوح" } \ No newline at end of file diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json index 72b224f58..859779d6d 100644 --- a/imports/i18n/data/it.i18n.json +++ b/imports/i18n/data/it.i18n.json @@ -1176,5 +1176,5 @@ "size": "Size", "storage": "Storage", "action": "Azione", - "board-title": "Board Title" + "board-title": "Titolo della Bacheca" } \ No newline at end of file From 77d72ae20acf3c96d7e864bf0fd8a159f9456823 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 13:21:34 +0300 Subject: [PATCH 132/246] Use MongoDB 5 at docker-compose.yml. Thanks to MongoDB ! --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index b1f454cfc..909c3461b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -98,7 +98,7 @@ services: # Quay image does work: # image: quay.io/wekan/mongo:4.4.2-bionic # Docker Hub MongoDB image does work: - image: mongo:4.4 + image: mongo:5 #------------------------------------------------------------------------------------- container_name: wekan-db restart: always From 55815aac715f46558973e816b3bfe5a908f3e916 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 13:23:07 +0300 Subject: [PATCH 133/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f83d3d884..36869d282 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ This release adds the following updates: Thanks to imajus. - [Added 30 new languages, now about 105 total](https://github.com/wekan/wekan/commit/28317c7cf3fea7f1c7cf0860ccebb7322000d132). Thanks to translators and xet7. +- [Use MongoDB 5 at docker-compose.yml](https://github.com/wekan/wekan/commit/77d72ae20acf3c96d7e864bf0fd8a159f9456823). + Thanks to MongoDB. and fixes the following bugs: From f4fe33fb05858f729ba4387035e5518d0fbfddb9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 May 2022 13:46:35 +0300 Subject: [PATCH 134/246] v6.23 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36869d282..8112f52f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.23 2022-05-17 WeKan ® release This release adds the following updates: diff --git a/Stackerfile.yml b/Stackerfile.yml index f30dc3f56..200a17b68 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.21.0" +appVersion: "v6.23.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index 92bea3e15..ff9ec9728 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.21" +appVersion: "6.23" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 6dccb838e..cec6c26d4 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.21 + tag: v6.23 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index fcea632b4..22224a4e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.20.0", + "version": "v6.23.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2eafd058f..ebae6a4b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.20.0", + "version": "v6.23.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index ddee17bba..edf66f968 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.21 + Wekan REST API v6.23 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    • - Wekan REST API v6.21 + Wekan REST API v6.23
    • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      -

      Wekan REST API v6.21

      +

      Wekan REST API v6.23

      Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

      diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 9376446da..b09016cff 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.21 + version: v6.23 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 938c833e4..6ef813339 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 621, + appVersion = 623, # Increment this for every release. - appMarketingVersion = (defaultText = "6.21.0~2022-04-28"), + appMarketingVersion = (defaultText = "6.23.0~2022-05-17"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 8c6b92850..d9399f773 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.21' +version: '6.23' summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. From 3ed1fc3e6bdf90ecdc3593468d68a29807ed52b5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 May 2022 11:46:01 +0300 Subject: [PATCH 135/246] Fix redirects needs to be done in sync. Thanks to nebulade and xet7 ! Fixes #4514 --- packages/kadira-flow-router/client/triggers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/kadira-flow-router/client/triggers.js b/packages/kadira-flow-router/client/triggers.js index 7733332ca..b1ae7197e 100644 --- a/packages/kadira-flow-router/client/triggers.js +++ b/packages/kadira-flow-router/client/triggers.js @@ -93,9 +93,13 @@ Triggers.runTriggers = function(triggers, context, redirectFn, after) { throw new Error("already redirected"); } + /* + // Commenting out, so that redirects work when not in sync. + // https://github.com/wekan/wekan/issues/4514 if(!inCurrentLoop) { throw new Error("redirect needs to be done in sync"); } + */ if(!url) { throw new Error("trigger redirect requires an URL"); @@ -109,4 +113,4 @@ Triggers.runTriggers = function(triggers, context, redirectFn, after) { function doStop() { abort = true; } -}; \ No newline at end of file +}; From 58da992a0ce750c050a8f87064587d28383854c5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 May 2022 11:49:27 +0300 Subject: [PATCH 136/246] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8112f52f2..73b1cc533 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release fixes the following bugs: + +- [Fix redirects needs to be done in sync](https://github.com/wekan/wekan/commit/3ed1fc3e6bdf90ecdc3593468d68a29807ed52b5). + Thanks to nebulade and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.23 2022-05-17 WeKan ® release This release adds the following updates: From 8964a18e765699e2a5060a72c3ca66d27e1c2ffd Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 May 2022 12:12:45 +0300 Subject: [PATCH 137/246] Added missing 'import nib' stylesheet reset that removes extra li bullet points. Thanks to mfilser and xet7 ! Related https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536 --- client/components/boards/boardsList.css | 1 - client/components/main/layouts.css | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/client/components/boards/boardsList.css b/client/components/boards/boardsList.css index f5890f23a..67de283cd 100644 --- a/client/components/boards/boardsList.css +++ b/client/components/boards/boardsList.css @@ -3,7 +3,6 @@ } .board-list li { float: left; - color: #dedede; /* li same color as background grey */ width: 20%; box-sizing: border-box; position: relative; diff --git a/client/components/main/layouts.css b/client/components/main/layouts.css index 4f0d2fbcd..3d095ac6a 100644 --- a/client/components/main/layouts.css +++ b/client/components/main/layouts.css @@ -2,6 +2,23 @@ -webkit-box-sizing: unset; box-sizing: unset; } +/* Fixed missing 'import nib' stylesheet reset and extra li bullet points + * https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536 + */ +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, +code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, +h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, +q, s, samp, small, span, strike, strong, sub, sup, +table, tbody, td, tfoot, th, thread, tr, tt, ul, var { + margin: 0; + padding: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-family: inherit; + font-size: 100%; + vertical-align: baseline; +} .note-popover .popover-content .note-color-palette div .note-color-btn, .panel-heading.note-toolbar .note-color-palette div .note-color-btn { background: none; From 1dd7388783feacfaeb99bbb445811463f83edd91 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 May 2022 12:19:28 +0300 Subject: [PATCH 138/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73b1cc533..510d916bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This release fixes the following bugs: - [Fix redirects needs to be done in sync](https://github.com/wekan/wekan/commit/3ed1fc3e6bdf90ecdc3593468d68a29807ed52b5). Thanks to nebulade and xet7. +- [Added missing 'import nib' stylesheet reset that removes extra li bullet points](https://github.com/wekan/wekan/commit/8964a18e765699e2a5060a72c3ca66d27e1c2ffd). + Thanks to mfilser and xet7. Thanks to above GitHub users for their contributions and translators for their translations. From a2968d74d7cb5b8763201c4fadab53b63eb8cd87 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 May 2022 12:29:28 +0300 Subject: [PATCH 139/246] v6.24 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- releases/release.sh | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 510d916bc..2195948e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.24 2022-05-18 WeKan ® release This release fixes the following bugs: diff --git a/Stackerfile.yml b/Stackerfile.yml index 200a17b68..6a283677b 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.23.0" +appVersion: "v6.24.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index ff9ec9728..4791f2ae1 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.23" +appVersion: "6.24" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index cec6c26d4..b495176e0 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.23 + tag: v6.24 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index 22224a4e5..35d35e778 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.23.0", + "version": "v6.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ebae6a4b8..75e38c69f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.23.0", + "version": "v6.24.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index edf66f968..2cde35919 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.23 + Wekan REST API v6.24 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      • - Wekan REST API v6.23 + Wekan REST API v6.24
      • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
        -

        Wekan REST API v6.23

        +

        Wekan REST API v6.24

        Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

        diff --git a/public/api/wekan.yml b/public/api/wekan.yml index b09016cff..f6cfc670c 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.23 + version: v6.24 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/releases/release.sh b/releases/release.sh index 6d8dfe394..ba53bc5a8 100755 --- a/releases/release.sh +++ b/releases/release.sh @@ -28,7 +28,7 @@ git push ~/repos/wekan/releases/release-bundle.sh $1 # 6) Build Sandstorm -~/repos/wekan/releases/release-sandstorm.sh $1 +#~/repos/wekan/releases/release-sandstorm.sh $1 # Build Snap #./release-snap.sh $1 diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 6ef813339..7a333950a 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 623, + appVersion = 624, # Increment this for every release. - appMarketingVersion = (defaultText = "6.23.0~2022-05-17"), + appMarketingVersion = (defaultText = "6.24.0~2022-05-18"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index d9399f773..f26eb84a2 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.23' +version: '6.24' summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. From 985c2cdbfdb38eb43852f3aa257859bbd3f817b9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 19 May 2022 08:02:23 +0300 Subject: [PATCH 140/246] Fix Bullets in label selection popup. Related to import nib css reset. Thanks to AuspeXeu, mfilser and xet7 ! Fixes #4516 Related #4512 --- client/components/boards/boardsList.css | 2 + public/css/reset.css | 59 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 public/css/reset.css diff --git a/client/components/boards/boardsList.css b/client/components/boards/boardsList.css index 67de283cd..4dce7862a 100644 --- a/client/components/boards/boardsList.css +++ b/client/components/boards/boardsList.css @@ -1,3 +1,5 @@ +@import url("css/reset.css") print, screen; + .board-list { margin: 0 8px; } diff --git a/public/css/reset.css b/public/css/reset.css new file mode 100644 index 000000000..3839cb35c --- /dev/null +++ b/public/css/reset.css @@ -0,0 +1,59 @@ +/* Fixed missing 'import nib' stylesheet reset and extra li bullet points + * https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536 + * https://github.com/stylus/nib/blob/master/lib/nib/reset.styl + */ +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, +code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, +h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, +q, s, samp, small, span, strike, strong, sub, sup, +table, tbody, td, tfoot, th, thread, tr, tt, ul, var { + margin: 0; + padding: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-family: inherit; + font-size: 100%; + vertical-align: baseline; +} +ol, ul { + list-style: none; +} +a img { + border: none; +} +/* reset body */ +body { + line-height: 1; + color: black; + background: white; +} +/* reset table cell */ +table { + border-collapse: separate; + border-spacing: 0; + vertical-align: middle; +} +caption, td, th { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +/* reset html5 */ +article, aside, canvas, details, figcaption, + figure, footer, header, hgroup, menu, nav, + section, summary, main { + display: block; +} +audio, canvas, video { + display inline-block; + *display inline; + *zoom 1; +} +audio:not([controls]),[hidden] { + display: none; +} + + + + From 21c09c67e41906f5f7239522cdc746dcf11d10da Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 19 May 2022 08:06:24 +0300 Subject: [PATCH 141/246] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2195948e7..d8ebe43c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release fixes the following bugs: + +- [Fix Bullets in label selection popup. Related to import nib css reset](https://github.com/wekan/wekan/commit/985c2cdbfdb38eb43852f3aa257859bbd3f817b9). + Thanks to AuspeXeu, mfilser and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.24 2022-05-18 WeKan ® release This release fixes the following bugs: From 26e1c1dc4a2a4971a3e2aef48cf1a5a34ff1e28f Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Sun, 24 Apr 2022 17:12:31 +0200 Subject: [PATCH 142/246] Attachment file rename is now possible - Relates to: #2099 --- client/components/cards/attachments.jade | 8 +++++++ client/components/cards/attachments.js | 25 +++++++++++++++++++++ imports/i18n/data/en.i18n.json | 3 ++- models/attachments.js | 9 +++++++- models/lib/fileStoreStrategy.js | 28 ++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 2 deletions(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 975d21e84..cce2419bb 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -69,6 +69,9 @@ template(name="attachmentActionsPopup") else | {{_ 'add-cover'}} if currentUser.isBoardAdmin + a.js-rename + i.fa.fa-pencil-square-o + | {{_ 'rename'}} a.js-confirm-delete i.fa.fa-close | {{_ 'delete'}} @@ -85,3 +88,8 @@ template(name="attachmentActionsPopup") a.js-move-storage-gridfs i.fa.fa-arrow-right | {{_ 'attachment-move-storage-gridfs'}} + +template(name="attachmentRenamePopup") + input.js-edit-attachment-name(type='text' autofocus value=name dir="auto") + .edit-controls.clearfix + button.primary.confirm.js-submit-edit-attachment-name(type="submit") {{_ 'save'}} diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index 8c78b363d..84424cbaa 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -134,6 +134,7 @@ BlazeComponent.extendComponent({ events() { return [ { + 'click .js-rename': Popup.open('attachmentRename'), 'click .js-confirm-delete': Popup.afterConfirm('attachmentDelete', function() { Attachments.remove(this._id); Popup.back(2); @@ -158,3 +159,27 @@ BlazeComponent.extendComponent({ ] } }).register('attachmentActionsPopup'); + +BlazeComponent.extendComponent({ + events() { + return [ + { + 'keydown input.js-edit-attachment-name'(evt) { + // enter = save + if (evt.keyCode === 13) { + this.find('button[type=submit]').click(); + } + }, + 'click button.js-submit-edit-attachment-name'(event) { + // save button pressed + event.preventDefault(); + const name = this.$('.js-edit-attachment-name')[0] + .value + .trim(); + Meteor.call('renameAttachment', this.data()._id, name); + Popup.back(); + }, + } + ] + } +}).register('attachmentRenamePopup'); diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index a4f2d204c..8e706103b 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -1177,5 +1177,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } diff --git a/models/attachments.js b/models/attachments.js index 22e3c979f..73c5f58b1 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -4,7 +4,7 @@ import { createBucket } from './lib/grid/createBucket'; import fs from 'fs'; import path from 'path'; import { AttachmentStoreStrategyFilesystem, AttachmentStoreStrategyGridFs} from '/models/lib/attachmentStoreStrategy'; -import FileStoreStrategyFactory, {moveToStorage, STORAGE_NAME_FILESYSTEM, STORAGE_NAME_GRIDFS} from '/models/lib/fileStoreStrategy'; +import FileStoreStrategyFactory, {moveToStorage, rename, STORAGE_NAME_FILESYSTEM, STORAGE_NAME_GRIDFS} from '/models/lib/fileStoreStrategy'; let attachmentBucket; let storagePath; @@ -87,6 +87,13 @@ if (Meteor.isServer) { const fileObj = Attachments.findOne({_id: fileObjId}); moveToStorage(fileObj, storageDestination, fileStoreStrategyFactory); }, + renameAttachment(fileObjId, newName) { + check(fileObjId, String); + check(newName, String); + + const fileObj = Attachments.findOne({_id: fileObjId}); + rename(fileObj, newName, fileStoreStrategyFactory); + }, }); Meteor.startup(() => { diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index ebfbb4c9a..e6805e9b7 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -114,6 +114,13 @@ class FileStoreStrategy { unlink() { } + /** rename the file (physical) + * @li at database the filename is updated after this method + * @param newFilePath the new file path + */ + rename(newFilePath) { + } + /** return the storage name * @return the storage name */ @@ -287,6 +294,14 @@ export class FileStoreStrategyFilesystem extends FileStoreStrategy { fs.unlink(filePath, () => {}); } + /** rename the file (physical) + * @li at database the filename is updated after this method + * @param newFilePath the new file path + */ + rename(newFilePath) { + fs.renameSync(this.fileObj.versions[this.versionName].path, newFilePath); + } + /** return the storage name * @return the storage name */ @@ -389,3 +404,16 @@ export const copyFile = function(fileObj, newCardId, fileStoreStrategyFactory) { readStream.pipe(writeStream); }; + +export const rename = function(fileObj, newName, fileStoreStrategyFactory) { + Object.keys(fileObj.versions).forEach(versionName => { + const strategy = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName); + const newFilePath = strategy.getNewPath(fileStoreStrategyFactory.storagePath, newName); + strategy.rename(newFilePath); + + Attachments.update({ _id: fileObj._id }, { $set: { + "name": newName, + [`versions.${versionName}.path`]: newFilePath, + } }); + }); +}; From 11f8b17a05fc72bcf42a05987166adff82038958 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 26 Apr 2022 19:27:22 +0200 Subject: [PATCH 143/246] Attachment rename now without filename extension --- client/components/cards/attachments.jade | 2 +- client/components/cards/attachments.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index cce2419bb..f915e8bb5 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -90,6 +90,6 @@ template(name="attachmentActionsPopup") | {{_ 'attachment-move-storage-gridfs'}} template(name="attachmentRenamePopup") - input.js-edit-attachment-name(type='text' autofocus value=name dir="auto") + input.js-edit-attachment-name(type='text' autofocus value="{{getNameWithoutExtension}}" dir="auto") .edit-controls.clearfix button.primary.confirm.js-submit-edit-attachment-name(type="submit") {{_ 'save'}} diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index 84424cbaa..2279ae932 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -161,6 +161,10 @@ BlazeComponent.extendComponent({ }).register('attachmentActionsPopup'); BlazeComponent.extendComponent({ + getNameWithoutExtension() { + const ret = this.data().name.replace(new RegExp("\." + this.data().extension + "$"), ""); + return ret; + }, events() { return [ { @@ -175,9 +179,9 @@ BlazeComponent.extendComponent({ event.preventDefault(); const name = this.$('.js-edit-attachment-name')[0] .value - .trim(); + .trim() + this.data().extensionWithDot; Meteor.call('renameAttachment', this.data()._id, name); - Popup.back(); + Popup.back(2); }, } ] From b6374dac3dbd61072a04d85061a420c480a407ed Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 26 Apr 2022 19:30:27 +0200 Subject: [PATCH 144/246] Attachment selection, simpler code logic --- models/cards.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/models/cards.js b/models/cards.js index 0b926f4b6..73b0d48a1 100644 --- a/models/cards.js +++ b/models/cards.js @@ -739,17 +739,15 @@ Cards.helpers({ }, attachments() { + let id = this._id; if (this.isLinkedCard()) { - return Attachments.find( - { 'meta.cardId': this.linkedId }, - { sort: { uploadedAt: -1 } }, - ).each(); - } else { - return Attachments.find( - { 'meta.cardId': this._id }, - { sort: { uploadedAt: -1 } }, - ).each(); + id = this.linkedId; } + let ret = Attachments.find( + { 'meta.cardId': id }, + { sort: { uploadedAt: -1 } }, + ).each(); + return ret; }, cover() { From ddca4b55a7be42ec60a1d22c5ba3a5c3f2cefd00 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 20 May 2022 22:43:24 +0300 Subject: [PATCH 145/246] Update translations. --- imports/i18n/data/en.i18n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index 8e706103b..bedffe666 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -1178,5 +1178,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } From 24bed7bdb25900fd13d3c0b0172880f33f9710f7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 20 May 2022 22:47:17 +0300 Subject: [PATCH 146/246] Updated translations. --- imports/i18n/data/ar-EG.i18n.json | 3 ++- imports/i18n/data/ar.i18n.json | 3 ++- imports/i18n/data/bg.i18n.json | 3 ++- imports/i18n/data/br.i18n.json | 3 ++- imports/i18n/data/ca.i18n.json | 3 ++- imports/i18n/data/cs-CZ.i18n.json | 3 ++- imports/i18n/data/cs.i18n.json | 3 ++- imports/i18n/data/cy-GB.i18n.json | 3 ++- imports/i18n/data/cy.i18n.json | 3 ++- imports/i18n/data/da.i18n.json | 3 ++- imports/i18n/data/de-AT.i18n.json | 3 ++- imports/i18n/data/de-CH.i18n.json | 3 ++- imports/i18n/data/de.i18n.json | 3 ++- imports/i18n/data/el-GR.i18n.json | 3 ++- imports/i18n/data/en-BR.i18n.json | 3 ++- imports/i18n/data/en-DE.i18n.json | 3 ++- imports/i18n/data/en-GB.i18n.json | 3 ++- imports/i18n/data/en-IT.i18n.json | 3 ++- imports/i18n/data/en-YS.i18n.json | 3 ++- imports/i18n/data/eo.i18n.json | 3 ++- imports/i18n/data/es-AR.i18n.json | 3 ++- imports/i18n/data/es-CL.i18n.json | 3 ++- imports/i18n/data/es-LA.i18n.json | 3 ++- imports/i18n/data/es-MX.i18n.json | 3 ++- imports/i18n/data/es-PE.i18n.json | 3 ++- imports/i18n/data/es-PY.i18n.json | 3 ++- imports/i18n/data/es.i18n.json | 3 ++- imports/i18n/data/et-EE.i18n.json | 3 ++- imports/i18n/data/eu.i18n.json | 3 ++- imports/i18n/data/fa-IR.i18n.json | 3 ++- imports/i18n/data/fa.i18n.json | 3 ++- imports/i18n/data/fi.i18n.json | 3 ++- imports/i18n/data/fr-CH.i18n.json | 3 ++- imports/i18n/data/fr.i18n.json | 3 ++- imports/i18n/data/fy-NL.i18n.json | 3 ++- imports/i18n/data/fy.i18n.json | 3 ++- imports/i18n/data/gl-ES.i18n.json | 3 ++- imports/i18n/data/gl.i18n.json | 3 ++- imports/i18n/data/gu-IN.i18n.json | 3 ++- imports/i18n/data/he-IL.i18n.json | 3 ++- imports/i18n/data/he.i18n.json | 3 ++- imports/i18n/data/hi-IN.i18n.json | 3 ++- imports/i18n/data/hi.i18n.json | 3 ++- imports/i18n/data/hr.i18n.json | 3 ++- imports/i18n/data/hu.i18n.json | 3 ++- imports/i18n/data/hy.i18n.json | 3 ++- imports/i18n/data/id.i18n.json | 3 ++- imports/i18n/data/ig.i18n.json | 3 ++- imports/i18n/data/it.i18n.json | 3 ++- imports/i18n/data/ja.i18n.json | 3 ++- imports/i18n/data/ka.i18n.json | 3 ++- imports/i18n/data/km.i18n.json | 3 ++- imports/i18n/data/ko-KR.i18n.json | 3 ++- imports/i18n/data/ko.i18n.json | 3 ++- imports/i18n/data/lt.i18n.json | 3 ++- imports/i18n/data/lv.i18n.json | 3 ++- imports/i18n/data/mk.i18n.json | 3 ++- imports/i18n/data/mn.i18n.json | 3 ++- imports/i18n/data/ms-MY.i18n.json | 3 ++- imports/i18n/data/nb.i18n.json | 3 ++- imports/i18n/data/nl-NL.i18n.json | 3 ++- imports/i18n/data/nl.i18n.json | 3 ++- imports/i18n/data/oc.i18n.json | 3 ++- imports/i18n/data/pa.i18n.json | 3 ++- imports/i18n/data/pl-PL.i18n.json | 3 ++- imports/i18n/data/pl.i18n.json | 3 ++- imports/i18n/data/pt-BR.i18n.json | 3 ++- imports/i18n/data/pt.i18n.json | 3 ++- imports/i18n/data/ro.i18n.json | 3 ++- imports/i18n/data/ru-UA.i18n.json | 3 ++- imports/i18n/data/ru.i18n.json | 3 ++- imports/i18n/data/sk.i18n.json | 3 ++- imports/i18n/data/sl.i18n.json | 3 ++- imports/i18n/data/sr.i18n.json | 3 ++- imports/i18n/data/sv.i18n.json | 3 ++- imports/i18n/data/sw.i18n.json | 3 ++- imports/i18n/data/ta.i18n.json | 3 ++- imports/i18n/data/th.i18n.json | 3 ++- imports/i18n/data/tr.i18n.json | 3 ++- imports/i18n/data/ug.i18n.json | 3 ++- imports/i18n/data/uk-UA.i18n.json | 3 ++- imports/i18n/data/uk.i18n.json | 3 ++- imports/i18n/data/uz-AR.i18n.json | 3 ++- imports/i18n/data/uz-LA.i18n.json | 3 ++- imports/i18n/data/uz-UZ.i18n.json | 3 ++- imports/i18n/data/uz.i18n.json | 3 ++- imports/i18n/data/ve-CC.i18n.json | 3 ++- imports/i18n/data/ve-PP.i18n.json | 3 ++- imports/i18n/data/ve.i18n.json | 3 ++- imports/i18n/data/vi-VN.i18n.json | 3 ++- imports/i18n/data/vi.i18n.json | 3 ++- imports/i18n/data/vl-SS.i18n.json | 3 ++- imports/i18n/data/vo.i18n.json | 3 ++- imports/i18n/data/wa-RR.i18n.json | 3 ++- imports/i18n/data/wa.i18n.json | 3 ++- imports/i18n/data/wo.i18n.json | 3 ++- imports/i18n/data/xh.i18n.json | 3 ++- imports/i18n/data/yi.i18n.json | 3 ++- imports/i18n/data/yo.i18n.json | 3 ++- imports/i18n/data/zh-CN.i18n.json | 3 ++- imports/i18n/data/zh-HK.i18n.json | 3 ++- imports/i18n/data/zh-TW.i18n.json | 3 ++- imports/i18n/data/zu-ZA.i18n.json | 3 ++- imports/i18n/data/zu.i18n.json | 3 ++- 104 files changed, 208 insertions(+), 104 deletions(-) diff --git a/imports/i18n/data/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ar-EG.i18n.json +++ b/imports/i18n/data/ar-EG.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index 3c2295efb..ed6452b29 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -1176,5 +1176,6 @@ "size": "حجم", "storage": "Storage", "action": "Action", - "board-title": "عنوان اللوح" + "board-title": "عنوان اللوح", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/bg.i18n.json b/imports/i18n/data/bg.i18n.json index a79e545df..80fd6afcb 100644 --- a/imports/i18n/data/bg.i18n.json +++ b/imports/i18n/data/bg.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Действие", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/br.i18n.json b/imports/i18n/data/br.i18n.json index c2cf58a6d..cd9f34e0f 100644 --- a/imports/i18n/data/br.i18n.json +++ b/imports/i18n/data/br.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ca.i18n.json b/imports/i18n/data/ca.i18n.json index 589db2ff6..63ab8ca03 100644 --- a/imports/i18n/data/ca.i18n.json +++ b/imports/i18n/data/ca.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/cs-CZ.i18n.json b/imports/i18n/data/cs-CZ.i18n.json index 610942303..53d30202f 100644 --- a/imports/i18n/data/cs-CZ.i18n.json +++ b/imports/i18n/data/cs-CZ.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Akce", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/cs.i18n.json b/imports/i18n/data/cs.i18n.json index 9396e539f..5dd9ca643 100644 --- a/imports/i18n/data/cs.i18n.json +++ b/imports/i18n/data/cs.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Akce", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/cy-GB.i18n.json b/imports/i18n/data/cy-GB.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/cy-GB.i18n.json +++ b/imports/i18n/data/cy-GB.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/cy.i18n.json b/imports/i18n/data/cy.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/cy.i18n.json +++ b/imports/i18n/data/cy.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/da.i18n.json b/imports/i18n/data/da.i18n.json index 6e55cbc2f..e826fd769 100644 --- a/imports/i18n/data/da.i18n.json +++ b/imports/i18n/data/da.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json index d54337a2e..6eb6e8ae0 100644 --- a/imports/i18n/data/de-AT.i18n.json +++ b/imports/i18n/data/de-AT.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Aktion", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json index fd93752ac..d9a9c7fa9 100644 --- a/imports/i18n/data/de-CH.i18n.json +++ b/imports/i18n/data/de-CH.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Aktion", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index 059e1a056..d42501596 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -1176,5 +1176,6 @@ "size": "Größe", "storage": "Speicher", "action": "Aktion", - "board-title": "Board-Titel" + "board-title": "Board-Titel", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json index 1db29cbaf..74ccfc5fc 100644 --- a/imports/i18n/data/el-GR.i18n.json +++ b/imports/i18n/data/el-GR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Ενέργεια", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-BR.i18n.json b/imports/i18n/data/en-BR.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/en-BR.i18n.json +++ b/imports/i18n/data/en-BR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json index 69b88f264..6346fd30c 100644 --- a/imports/i18n/data/en-DE.i18n.json +++ b/imports/i18n/data/en-DE.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json index cd36a7111..7dc8c3642 100644 --- a/imports/i18n/data/en-GB.i18n.json +++ b/imports/i18n/data/en-GB.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/en-IT.i18n.json +++ b/imports/i18n/data/en-IT.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-YS.i18n.json b/imports/i18n/data/en-YS.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/en-YS.i18n.json +++ b/imports/i18n/data/en-YS.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/eo.i18n.json b/imports/i18n/data/eo.i18n.json index 3644ca02c..2a7f2c784 100644 --- a/imports/i18n/data/eo.i18n.json +++ b/imports/i18n/data/eo.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json index 6269c3f82..97d2c6241 100644 --- a/imports/i18n/data/es-AR.i18n.json +++ b/imports/i18n/data/es-AR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json index ac3a41022..745cc4f1e 100644 --- a/imports/i18n/data/es-CL.i18n.json +++ b/imports/i18n/data/es-CL.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/es-LA.i18n.json +++ b/imports/i18n/data/es-LA.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json index 0a9b15f24..a1e41ff2c 100644 --- a/imports/i18n/data/es-MX.i18n.json +++ b/imports/i18n/data/es-MX.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json index 342fe6400..ba5c4b552 100644 --- a/imports/i18n/data/es-PE.i18n.json +++ b/imports/i18n/data/es-PE.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Acción", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/es-PY.i18n.json +++ b/imports/i18n/data/es-PY.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index 5687dbda5..d811f6bbb 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "acción", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json index 00aa843e7..92a0aeb36 100644 --- a/imports/i18n/data/et-EE.i18n.json +++ b/imports/i18n/data/et-EE.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Tegevus", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/eu.i18n.json b/imports/i18n/data/eu.i18n.json index 257c75485..7de750c65 100644 --- a/imports/i18n/data/eu.i18n.json +++ b/imports/i18n/data/eu.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json index b482b08ad..4c9a8acb9 100644 --- a/imports/i18n/data/fa-IR.i18n.json +++ b/imports/i18n/data/fa-IR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fa.i18n.json b/imports/i18n/data/fa.i18n.json index 0c7dfb083..09dc8a59d 100644 --- a/imports/i18n/data/fa.i18n.json +++ b/imports/i18n/data/fa.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "عملیات", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fi.i18n.json b/imports/i18n/data/fi.i18n.json index 12135e83b..06e6c6a37 100644 --- a/imports/i18n/data/fi.i18n.json +++ b/imports/i18n/data/fi.i18n.json @@ -1176,5 +1176,6 @@ "size": "Koko", "storage": "Tallennustila", "action": "Toimi", - "board-title": "Taulun otsikko" + "board-title": "Taulun otsikko", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/fr-CH.i18n.json +++ b/imports/i18n/data/fr-CH.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json index 595b81e7a..39953ca86 100644 --- a/imports/i18n/data/fr.i18n.json +++ b/imports/i18n/data/fr.i18n.json @@ -1176,5 +1176,6 @@ "size": "Taille", "storage": "Stockage", "action": "Action", - "board-title": "Titre du tableau" + "board-title": "Titre du tableau", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fy-NL.i18n.json b/imports/i18n/data/fy-NL.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/fy-NL.i18n.json +++ b/imports/i18n/data/fy-NL.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fy.i18n.json b/imports/i18n/data/fy.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/fy.i18n.json +++ b/imports/i18n/data/fy.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json index cc55305ff..a2d9749c2 100644 --- a/imports/i18n/data/gl-ES.i18n.json +++ b/imports/i18n/data/gl-ES.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gl.i18n.json b/imports/i18n/data/gl.i18n.json index cc55305ff..a2d9749c2 100644 --- a/imports/i18n/data/gl.i18n.json +++ b/imports/i18n/data/gl.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/gu-IN.i18n.json +++ b/imports/i18n/data/gu-IN.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/he-IL.i18n.json b/imports/i18n/data/he-IL.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/he-IL.i18n.json +++ b/imports/i18n/data/he-IL.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index 8930e536d..a26fac560 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -1176,5 +1176,6 @@ "size": "גודל", "storage": "אחסון", "action": "פעולה", - "board-title": "כותרת לוח" + "board-title": "כותרת לוח", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json index 170457419..980d94632 100644 --- a/imports/i18n/data/hi-IN.i18n.json +++ b/imports/i18n/data/hi-IN.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hi.i18n.json b/imports/i18n/data/hi.i18n.json index 170457419..980d94632 100644 --- a/imports/i18n/data/hi.i18n.json +++ b/imports/i18n/data/hi.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hr.i18n.json b/imports/i18n/data/hr.i18n.json index 9338ee7ef..69167c886 100644 --- a/imports/i18n/data/hr.i18n.json +++ b/imports/i18n/data/hr.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hu.i18n.json b/imports/i18n/data/hu.i18n.json index 1f17576db..e2c60b68c 100644 --- a/imports/i18n/data/hu.i18n.json +++ b/imports/i18n/data/hu.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Művelet", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hy.i18n.json b/imports/i18n/data/hy.i18n.json index 7df47fe8e..df87d3e61 100644 --- a/imports/i18n/data/hy.i18n.json +++ b/imports/i18n/data/hy.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/id.i18n.json b/imports/i18n/data/id.i18n.json index eab65b88d..2e330998a 100644 --- a/imports/i18n/data/id.i18n.json +++ b/imports/i18n/data/id.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ig.i18n.json b/imports/i18n/data/ig.i18n.json index 3b8d6d3da..294659fd6 100644 --- a/imports/i18n/data/ig.i18n.json +++ b/imports/i18n/data/ig.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json index 859779d6d..89f7bac5c 100644 --- a/imports/i18n/data/it.i18n.json +++ b/imports/i18n/data/it.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Azione", - "board-title": "Titolo della Bacheca" + "board-title": "Titolo della Bacheca", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ja.i18n.json b/imports/i18n/data/ja.i18n.json index cc658880b..05feffb7e 100644 --- a/imports/i18n/data/ja.i18n.json +++ b/imports/i18n/data/ja.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "操作", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ka.i18n.json b/imports/i18n/data/ka.i18n.json index 5bdf6d13a..8f009d901 100644 --- a/imports/i18n/data/ka.i18n.json +++ b/imports/i18n/data/ka.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/km.i18n.json b/imports/i18n/data/km.i18n.json index 8a9f94792..de2782d7c 100644 --- a/imports/i18n/data/km.i18n.json +++ b/imports/i18n/data/km.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ko-KR.i18n.json b/imports/i18n/data/ko-KR.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ko-KR.i18n.json +++ b/imports/i18n/data/ko-KR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json index 506282ef8..7c41d51cb 100644 --- a/imports/i18n/data/ko.i18n.json +++ b/imports/i18n/data/ko.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "동작", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/lt.i18n.json b/imports/i18n/data/lt.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/lt.i18n.json +++ b/imports/i18n/data/lt.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/lv.i18n.json b/imports/i18n/data/lv.i18n.json index e5669d3ad..dd4a9ea2c 100644 --- a/imports/i18n/data/lv.i18n.json +++ b/imports/i18n/data/lv.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Darbība", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/mk.i18n.json b/imports/i18n/data/mk.i18n.json index ee0e27dc5..776135106 100644 --- a/imports/i18n/data/mk.i18n.json +++ b/imports/i18n/data/mk.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/mn.i18n.json b/imports/i18n/data/mn.i18n.json index 80d813da3..69fe7bb17 100644 --- a/imports/i18n/data/mn.i18n.json +++ b/imports/i18n/data/mn.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ms-MY.i18n.json +++ b/imports/i18n/data/ms-MY.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/nb.i18n.json b/imports/i18n/data/nb.i18n.json index 784149458..651ddbb76 100644 --- a/imports/i18n/data/nb.i18n.json +++ b/imports/i18n/data/nb.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Aksjon", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json index 46b0043f1..d38d0de53 100644 --- a/imports/i18n/data/nl-NL.i18n.json +++ b/imports/i18n/data/nl-NL.i18n.json @@ -1176,5 +1176,6 @@ "size": "Grootte", "storage": "Opslag", "action": "Actie", - "board-title": "Bord Titel" + "board-title": "Bord Titel", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/nl.i18n.json b/imports/i18n/data/nl.i18n.json index 9f3d6fd05..2610c75ef 100644 --- a/imports/i18n/data/nl.i18n.json +++ b/imports/i18n/data/nl.i18n.json @@ -1176,5 +1176,6 @@ "size": "Grootte", "storage": "Opslag", "action": "Actie", - "board-title": "Bord Titel" + "board-title": "Bord Titel", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/oc.i18n.json b/imports/i18n/data/oc.i18n.json index 2ea4b0b89..381dc587b 100644 --- a/imports/i18n/data/oc.i18n.json +++ b/imports/i18n/data/oc.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pa.i18n.json b/imports/i18n/data/pa.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/pa.i18n.json +++ b/imports/i18n/data/pa.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json index 1fd351b2d..c7c260100 100644 --- a/imports/i18n/data/pl-PL.i18n.json +++ b/imports/i18n/data/pl-PL.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Reakcja", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pl.i18n.json b/imports/i18n/data/pl.i18n.json index 77dc487de..3791e18af 100644 --- a/imports/i18n/data/pl.i18n.json +++ b/imports/i18n/data/pl.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Reakcja", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json index afdf5516e..a52557629 100644 --- a/imports/i18n/data/pt-BR.i18n.json +++ b/imports/i18n/data/pt-BR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Tamanho", "storage": "Armazenamento", "action": "Ação", - "board-title": "Título do Quadro" + "board-title": "Título do Quadro", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pt.i18n.json b/imports/i18n/data/pt.i18n.json index 6eb29925f..11ef25f57 100644 --- a/imports/i18n/data/pt.i18n.json +++ b/imports/i18n/data/pt.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Ação", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ro.i18n.json b/imports/i18n/data/ro.i18n.json index 3c5b7ff9f..4d1654d76 100644 --- a/imports/i18n/data/ro.i18n.json +++ b/imports/i18n/data/ro.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json index c5f327174..06646d575 100644 --- a/imports/i18n/data/ru-UA.i18n.json +++ b/imports/i18n/data/ru-UA.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Действие", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ru.i18n.json b/imports/i18n/data/ru.i18n.json index c446b7f86..2d0265c37 100644 --- a/imports/i18n/data/ru.i18n.json +++ b/imports/i18n/data/ru.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Действие", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sk.i18n.json b/imports/i18n/data/sk.i18n.json index 1ef45e4bc..fc10cf58f 100644 --- a/imports/i18n/data/sk.i18n.json +++ b/imports/i18n/data/sk.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sl.i18n.json b/imports/i18n/data/sl.i18n.json index 77e5f8598..15f4f5183 100644 --- a/imports/i18n/data/sl.i18n.json +++ b/imports/i18n/data/sl.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sr.i18n.json b/imports/i18n/data/sr.i18n.json index 014d59728..cdb0f3fc4 100644 --- a/imports/i18n/data/sr.i18n.json +++ b/imports/i18n/data/sr.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sv.i18n.json b/imports/i18n/data/sv.i18n.json index e00aedf8b..436de6e3a 100644 --- a/imports/i18n/data/sv.i18n.json +++ b/imports/i18n/data/sv.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Åtgärd", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sw.i18n.json b/imports/i18n/data/sw.i18n.json index 3f2fc0e4c..d343d100c 100644 --- a/imports/i18n/data/sw.i18n.json +++ b/imports/i18n/data/sw.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ta.i18n.json b/imports/i18n/data/ta.i18n.json index 862ee1187..443a5dec1 100644 --- a/imports/i18n/data/ta.i18n.json +++ b/imports/i18n/data/ta.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/th.i18n.json b/imports/i18n/data/th.i18n.json index cccc93fbb..dff75dbc6 100644 --- a/imports/i18n/data/th.i18n.json +++ b/imports/i18n/data/th.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/tr.i18n.json b/imports/i18n/data/tr.i18n.json index 98ba7c939..e5ce3ccf4 100644 --- a/imports/i18n/data/tr.i18n.json +++ b/imports/i18n/data/tr.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Aksiyon", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ug.i18n.json b/imports/i18n/data/ug.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ug.i18n.json +++ b/imports/i18n/data/ug.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uk-UA.i18n.json b/imports/i18n/data/uk-UA.i18n.json index bb3fc945e..0e1c9aef5 100644 --- a/imports/i18n/data/uk-UA.i18n.json +++ b/imports/i18n/data/uk-UA.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uk.i18n.json b/imports/i18n/data/uk.i18n.json index d474bc28e..a6ed3fd81 100644 --- a/imports/i18n/data/uk.i18n.json +++ b/imports/i18n/data/uk.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz-AR.i18n.json b/imports/i18n/data/uz-AR.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/uz-AR.i18n.json +++ b/imports/i18n/data/uz-AR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz-LA.i18n.json b/imports/i18n/data/uz-LA.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/uz-LA.i18n.json +++ b/imports/i18n/data/uz-LA.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz-UZ.i18n.json b/imports/i18n/data/uz-UZ.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/uz-UZ.i18n.json +++ b/imports/i18n/data/uz-UZ.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz.i18n.json b/imports/i18n/data/uz.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/uz.i18n.json +++ b/imports/i18n/data/uz.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve-CC.i18n.json b/imports/i18n/data/ve-CC.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ve-CC.i18n.json +++ b/imports/i18n/data/ve-CC.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve-PP.i18n.json b/imports/i18n/data/ve-PP.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ve-PP.i18n.json +++ b/imports/i18n/data/ve-PP.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve.i18n.json b/imports/i18n/data/ve.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/ve.i18n.json +++ b/imports/i18n/data/ve.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vi-VN.i18n.json b/imports/i18n/data/vi-VN.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/vi-VN.i18n.json +++ b/imports/i18n/data/vi-VN.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vi.i18n.json b/imports/i18n/data/vi.i18n.json index 9b52ccae9..271f1f72e 100644 --- a/imports/i18n/data/vi.i18n.json +++ b/imports/i18n/data/vi.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Hoạt động", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vl-SS.i18n.json b/imports/i18n/data/vl-SS.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/vl-SS.i18n.json +++ b/imports/i18n/data/vl-SS.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vo.i18n.json b/imports/i18n/data/vo.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/vo.i18n.json +++ b/imports/i18n/data/vo.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wa-RR.i18n.json b/imports/i18n/data/wa-RR.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/wa-RR.i18n.json +++ b/imports/i18n/data/wa-RR.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wa.i18n.json b/imports/i18n/data/wa.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/wa.i18n.json +++ b/imports/i18n/data/wa.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wo.i18n.json b/imports/i18n/data/wo.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/wo.i18n.json +++ b/imports/i18n/data/wo.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/xh.i18n.json b/imports/i18n/data/xh.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/xh.i18n.json +++ b/imports/i18n/data/xh.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/yi.i18n.json b/imports/i18n/data/yi.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/yi.i18n.json +++ b/imports/i18n/data/yi.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/yo.i18n.json b/imports/i18n/data/yo.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/yo.i18n.json +++ b/imports/i18n/data/yo.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zh-CN.i18n.json b/imports/i18n/data/zh-CN.i18n.json index 823f0d0ff..d7a6911e8 100644 --- a/imports/i18n/data/zh-CN.i18n.json +++ b/imports/i18n/data/zh-CN.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "操作", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zh-HK.i18n.json b/imports/i18n/data/zh-HK.i18n.json index bfaf461ae..c3446af94 100644 --- a/imports/i18n/data/zh-HK.i18n.json +++ b/imports/i18n/data/zh-HK.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zh-TW.i18n.json b/imports/i18n/data/zh-TW.i18n.json index 9963befad..d5f071942 100644 --- a/imports/i18n/data/zh-TW.i18n.json +++ b/imports/i18n/data/zh-TW.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "操作", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zu-ZA.i18n.json b/imports/i18n/data/zu-ZA.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/zu-ZA.i18n.json +++ b/imports/i18n/data/zu-ZA.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zu.i18n.json b/imports/i18n/data/zu.i18n.json index a25f0dc38..bc9b38449 100644 --- a/imports/i18n/data/zu.i18n.json +++ b/imports/i18n/data/zu.i18n.json @@ -1176,5 +1176,6 @@ "size": "Size", "storage": "Storage", "action": "Action", - "board-title": "Board Title" + "board-title": "Board Title", + "attachmentRenamePopup-title": "Attachment Rename" } \ No newline at end of file From b4d46f3016f3c4a9e5986259de6670463fcc632e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 20 May 2022 22:56:39 +0300 Subject: [PATCH 147/246] Updated translations. --- imports/i18n/data/ar-EG.i18n.json | 2 +- imports/i18n/data/ar.i18n.json | 2 +- imports/i18n/data/bg.i18n.json | 2 +- imports/i18n/data/br.i18n.json | 2 +- imports/i18n/data/ca.i18n.json | 2 +- imports/i18n/data/cs-CZ.i18n.json | 2 +- imports/i18n/data/cs.i18n.json | 2 +- imports/i18n/data/cy-GB.i18n.json | 2 +- imports/i18n/data/cy.i18n.json | 2 +- imports/i18n/data/da.i18n.json | 2 +- imports/i18n/data/de-AT.i18n.json | 2 +- imports/i18n/data/de-CH.i18n.json | 2 +- imports/i18n/data/de.i18n.json | 2 +- imports/i18n/data/el-GR.i18n.json | 2 +- imports/i18n/data/en-BR.i18n.json | 2 +- imports/i18n/data/en-DE.i18n.json | 2 +- imports/i18n/data/en-GB.i18n.json | 2 +- imports/i18n/data/en-IT.i18n.json | 2 +- imports/i18n/data/en-YS.i18n.json | 2 +- imports/i18n/data/eo.i18n.json | 2 +- imports/i18n/data/es-AR.i18n.json | 2 +- imports/i18n/data/es-CL.i18n.json | 2 +- imports/i18n/data/es-LA.i18n.json | 2 +- imports/i18n/data/es-MX.i18n.json | 2 +- imports/i18n/data/es-PE.i18n.json | 2 +- imports/i18n/data/es-PY.i18n.json | 2 +- imports/i18n/data/es.i18n.json | 2 +- imports/i18n/data/et-EE.i18n.json | 2 +- imports/i18n/data/eu.i18n.json | 2 +- imports/i18n/data/fa-IR.i18n.json | 2 +- imports/i18n/data/fa.i18n.json | 2 +- imports/i18n/data/fi.i18n.json | 2 +- imports/i18n/data/fr-CH.i18n.json | 2 +- imports/i18n/data/fr.i18n.json | 2 +- imports/i18n/data/fy-NL.i18n.json | 2 +- imports/i18n/data/fy.i18n.json | 2 +- imports/i18n/data/gl-ES.i18n.json | 2 +- imports/i18n/data/gl.i18n.json | 2 +- imports/i18n/data/gu-IN.i18n.json | 2 +- imports/i18n/data/he-IL.i18n.json | 2 +- imports/i18n/data/he.i18n.json | 2 +- imports/i18n/data/hi-IN.i18n.json | 2 +- imports/i18n/data/hi.i18n.json | 2 +- imports/i18n/data/hr.i18n.json | 2 +- imports/i18n/data/hu.i18n.json | 2 +- imports/i18n/data/hy.i18n.json | 2 +- imports/i18n/data/id.i18n.json | 2 +- imports/i18n/data/ig.i18n.json | 2 +- imports/i18n/data/it.i18n.json | 2 +- imports/i18n/data/ja.i18n.json | 2 +- imports/i18n/data/ka.i18n.json | 2 +- imports/i18n/data/km.i18n.json | 2 +- imports/i18n/data/ko-KR.i18n.json | 2 +- imports/i18n/data/ko.i18n.json | 2 +- imports/i18n/data/lt.i18n.json | 2 +- imports/i18n/data/lv.i18n.json | 2 +- imports/i18n/data/mk.i18n.json | 2 +- imports/i18n/data/mn.i18n.json | 2 +- imports/i18n/data/ms-MY.i18n.json | 2 +- imports/i18n/data/nb.i18n.json | 2 +- imports/i18n/data/nl-NL.i18n.json | 2 +- imports/i18n/data/nl.i18n.json | 2 +- imports/i18n/data/oc.i18n.json | 2 +- imports/i18n/data/pa.i18n.json | 2 +- imports/i18n/data/pl-PL.i18n.json | 2 +- imports/i18n/data/pl.i18n.json | 2 +- imports/i18n/data/pt-BR.i18n.json | 2 +- imports/i18n/data/pt.i18n.json | 2 +- imports/i18n/data/ro.i18n.json | 2 +- imports/i18n/data/ru-UA.i18n.json | 2 +- imports/i18n/data/ru.i18n.json | 2 +- imports/i18n/data/sk.i18n.json | 2 +- imports/i18n/data/sl.i18n.json | 2 +- imports/i18n/data/sr.i18n.json | 2 +- imports/i18n/data/sv.i18n.json | 2 +- imports/i18n/data/sw.i18n.json | 2 +- imports/i18n/data/ta.i18n.json | 2 +- imports/i18n/data/th.i18n.json | 2 +- imports/i18n/data/tr.i18n.json | 2 +- imports/i18n/data/ug.i18n.json | 2 +- imports/i18n/data/uk-UA.i18n.json | 2 +- imports/i18n/data/uk.i18n.json | 2 +- imports/i18n/data/uz-AR.i18n.json | 2 +- imports/i18n/data/uz-LA.i18n.json | 2 +- imports/i18n/data/uz-UZ.i18n.json | 2 +- imports/i18n/data/uz.i18n.json | 2 +- imports/i18n/data/ve-CC.i18n.json | 2 +- imports/i18n/data/ve-PP.i18n.json | 2 +- imports/i18n/data/ve.i18n.json | 2 +- imports/i18n/data/vi-VN.i18n.json | 2 +- imports/i18n/data/vi.i18n.json | 2 +- imports/i18n/data/vl-SS.i18n.json | 2 +- imports/i18n/data/vo.i18n.json | 2 +- imports/i18n/data/wa-RR.i18n.json | 2 +- imports/i18n/data/wa.i18n.json | 2 +- imports/i18n/data/wo.i18n.json | 2 +- imports/i18n/data/xh.i18n.json | 2 +- imports/i18n/data/yi.i18n.json | 2 +- imports/i18n/data/yo.i18n.json | 2 +- imports/i18n/data/zh-CN.i18n.json | 2 +- imports/i18n/data/zh-HK.i18n.json | 2 +- imports/i18n/data/zh-TW.i18n.json | 2 +- imports/i18n/data/zu-ZA.i18n.json | 2 +- imports/i18n/data/zu.i18n.json | 2 +- 104 files changed, 104 insertions(+), 104 deletions(-) diff --git a/imports/i18n/data/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ar-EG.i18n.json +++ b/imports/i18n/data/ar-EG.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index ed6452b29..91a72e55d 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "عنوان اللوح", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "إعادة التسمية" } \ No newline at end of file diff --git a/imports/i18n/data/bg.i18n.json b/imports/i18n/data/bg.i18n.json index 80fd6afcb..9600485da 100644 --- a/imports/i18n/data/bg.i18n.json +++ b/imports/i18n/data/bg.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Действие", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Преименуване" } \ No newline at end of file diff --git a/imports/i18n/data/br.i18n.json b/imports/i18n/data/br.i18n.json index cd9f34e0f..6a7fbd500 100644 --- a/imports/i18n/data/br.i18n.json +++ b/imports/i18n/data/br.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ca.i18n.json b/imports/i18n/data/ca.i18n.json index 63ab8ca03..72d46c0fc 100644 --- a/imports/i18n/data/ca.i18n.json +++ b/imports/i18n/data/ca.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Canvia el nom" } \ No newline at end of file diff --git a/imports/i18n/data/cs-CZ.i18n.json b/imports/i18n/data/cs-CZ.i18n.json index 53d30202f..12529e7db 100644 --- a/imports/i18n/data/cs-CZ.i18n.json +++ b/imports/i18n/data/cs-CZ.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Akce", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Přejmenovat" } \ No newline at end of file diff --git a/imports/i18n/data/cs.i18n.json b/imports/i18n/data/cs.i18n.json index 5dd9ca643..d3bf79be4 100644 --- a/imports/i18n/data/cs.i18n.json +++ b/imports/i18n/data/cs.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Akce", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Přejmenovat" } \ No newline at end of file diff --git a/imports/i18n/data/cy-GB.i18n.json b/imports/i18n/data/cy-GB.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/cy-GB.i18n.json +++ b/imports/i18n/data/cy-GB.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/cy.i18n.json b/imports/i18n/data/cy.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/cy.i18n.json +++ b/imports/i18n/data/cy.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/da.i18n.json b/imports/i18n/data/da.i18n.json index e826fd769..c101baabb 100644 --- a/imports/i18n/data/da.i18n.json +++ b/imports/i18n/data/da.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Omdøb" } \ No newline at end of file diff --git a/imports/i18n/data/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json index 6eb6e8ae0..2b54916f1 100644 --- a/imports/i18n/data/de-AT.i18n.json +++ b/imports/i18n/data/de-AT.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Aktion", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Umbenennen" } \ No newline at end of file diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json index d9a9c7fa9..83d7dd4a7 100644 --- a/imports/i18n/data/de-CH.i18n.json +++ b/imports/i18n/data/de-CH.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Aktion", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Umbenennen" } \ No newline at end of file diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index d42501596..02a7310b1 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Speicher", "action": "Aktion", "board-title": "Board-Titel", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Umbenennen" } \ No newline at end of file diff --git a/imports/i18n/data/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json index 74ccfc5fc..f081eaf32 100644 --- a/imports/i18n/data/el-GR.i18n.json +++ b/imports/i18n/data/el-GR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Ενέργεια", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Μετανομασία" } \ No newline at end of file diff --git a/imports/i18n/data/en-BR.i18n.json b/imports/i18n/data/en-BR.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/en-BR.i18n.json +++ b/imports/i18n/data/en-BR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json index 6346fd30c..37e319802 100644 --- a/imports/i18n/data/en-DE.i18n.json +++ b/imports/i18n/data/en-DE.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json index 7dc8c3642..6a104f625 100644 --- a/imports/i18n/data/en-GB.i18n.json +++ b/imports/i18n/data/en-GB.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/en-IT.i18n.json +++ b/imports/i18n/data/en-IT.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/en-YS.i18n.json b/imports/i18n/data/en-YS.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/en-YS.i18n.json +++ b/imports/i18n/data/en-YS.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/eo.i18n.json b/imports/i18n/data/eo.i18n.json index 2a7f2c784..e7832e445 100644 --- a/imports/i18n/data/eo.i18n.json +++ b/imports/i18n/data/eo.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renomi" } \ No newline at end of file diff --git a/imports/i18n/data/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json index 97d2c6241..c7eafd935 100644 --- a/imports/i18n/data/es-AR.i18n.json +++ b/imports/i18n/data/es-AR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renombrar" } \ No newline at end of file diff --git a/imports/i18n/data/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json index 745cc4f1e..6cc3157da 100644 --- a/imports/i18n/data/es-CL.i18n.json +++ b/imports/i18n/data/es-CL.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renombrar" } \ No newline at end of file diff --git a/imports/i18n/data/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/es-LA.i18n.json +++ b/imports/i18n/data/es-LA.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json index a1e41ff2c..7eb45bc6c 100644 --- a/imports/i18n/data/es-MX.i18n.json +++ b/imports/i18n/data/es-MX.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json index ba5c4b552..66cff328b 100644 --- a/imports/i18n/data/es-PE.i18n.json +++ b/imports/i18n/data/es-PE.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Acción", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renombrar" } \ No newline at end of file diff --git a/imports/i18n/data/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/es-PY.i18n.json +++ b/imports/i18n/data/es-PY.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index d811f6bbb..0515a99b0 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "acción", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renombrar" } \ No newline at end of file diff --git a/imports/i18n/data/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json index 92a0aeb36..32ddb47bc 100644 --- a/imports/i18n/data/et-EE.i18n.json +++ b/imports/i18n/data/et-EE.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Tegevus", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Nimetage ümber" } \ No newline at end of file diff --git a/imports/i18n/data/eu.i18n.json b/imports/i18n/data/eu.i18n.json index 7de750c65..d86a6858d 100644 --- a/imports/i18n/data/eu.i18n.json +++ b/imports/i18n/data/eu.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Aldatu izena" } \ No newline at end of file diff --git a/imports/i18n/data/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json index 4c9a8acb9..49dd51391 100644 --- a/imports/i18n/data/fa-IR.i18n.json +++ b/imports/i18n/data/fa-IR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fa.i18n.json b/imports/i18n/data/fa.i18n.json index 09dc8a59d..5d7b6e73e 100644 --- a/imports/i18n/data/fa.i18n.json +++ b/imports/i18n/data/fa.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "عملیات", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "تغیر نام" } \ No newline at end of file diff --git a/imports/i18n/data/fi.i18n.json b/imports/i18n/data/fi.i18n.json index 06e6c6a37..a79a9f7c7 100644 --- a/imports/i18n/data/fi.i18n.json +++ b/imports/i18n/data/fi.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Tallennustila", "action": "Toimi", "board-title": "Taulun otsikko", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Nimeä uudelleen" } \ No newline at end of file diff --git a/imports/i18n/data/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/fr-CH.i18n.json +++ b/imports/i18n/data/fr-CH.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json index 39953ca86..50d1df452 100644 --- a/imports/i18n/data/fr.i18n.json +++ b/imports/i18n/data/fr.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Stockage", "action": "Action", "board-title": "Titre du tableau", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renommer" } \ No newline at end of file diff --git a/imports/i18n/data/fy-NL.i18n.json b/imports/i18n/data/fy-NL.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/fy-NL.i18n.json +++ b/imports/i18n/data/fy-NL.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/fy.i18n.json b/imports/i18n/data/fy.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/fy.i18n.json +++ b/imports/i18n/data/fy.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json index a2d9749c2..11cdadba7 100644 --- a/imports/i18n/data/gl-ES.i18n.json +++ b/imports/i18n/data/gl-ES.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gl.i18n.json b/imports/i18n/data/gl.i18n.json index a2d9749c2..11cdadba7 100644 --- a/imports/i18n/data/gl.i18n.json +++ b/imports/i18n/data/gl.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/gu-IN.i18n.json +++ b/imports/i18n/data/gu-IN.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/he-IL.i18n.json b/imports/i18n/data/he-IL.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/he-IL.i18n.json +++ b/imports/i18n/data/he-IL.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index a26fac560..095ffa385 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -1177,5 +1177,5 @@ "storage": "אחסון", "action": "פעולה", "board-title": "כותרת לוח", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "שינוי שם" } \ No newline at end of file diff --git a/imports/i18n/data/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json index 980d94632..b7e92c8df 100644 --- a/imports/i18n/data/hi-IN.i18n.json +++ b/imports/i18n/data/hi-IN.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hi.i18n.json b/imports/i18n/data/hi.i18n.json index 980d94632..b7e92c8df 100644 --- a/imports/i18n/data/hi.i18n.json +++ b/imports/i18n/data/hi.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/hr.i18n.json b/imports/i18n/data/hr.i18n.json index 69167c886..c50562b73 100644 --- a/imports/i18n/data/hr.i18n.json +++ b/imports/i18n/data/hr.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Preimenovati" } \ No newline at end of file diff --git a/imports/i18n/data/hu.i18n.json b/imports/i18n/data/hu.i18n.json index e2c60b68c..0734d54ae 100644 --- a/imports/i18n/data/hu.i18n.json +++ b/imports/i18n/data/hu.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Művelet", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Átnevezés" } \ No newline at end of file diff --git a/imports/i18n/data/hy.i18n.json b/imports/i18n/data/hy.i18n.json index df87d3e61..067a96120 100644 --- a/imports/i18n/data/hy.i18n.json +++ b/imports/i18n/data/hy.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/id.i18n.json b/imports/i18n/data/id.i18n.json index 2e330998a..0fd99d902 100644 --- a/imports/i18n/data/id.i18n.json +++ b/imports/i18n/data/id.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Ganti Nama" } \ No newline at end of file diff --git a/imports/i18n/data/ig.i18n.json b/imports/i18n/data/ig.i18n.json index 294659fd6..29021d933 100644 --- a/imports/i18n/data/ig.i18n.json +++ b/imports/i18n/data/ig.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Banye aha ọzọ" } \ No newline at end of file diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json index 89f7bac5c..d9dcf2ca1 100644 --- a/imports/i18n/data/it.i18n.json +++ b/imports/i18n/data/it.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Azione", "board-title": "Titolo della Bacheca", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rinomina" } \ No newline at end of file diff --git a/imports/i18n/data/ja.i18n.json b/imports/i18n/data/ja.i18n.json index 05feffb7e..64ba584d1 100644 --- a/imports/i18n/data/ja.i18n.json +++ b/imports/i18n/data/ja.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "操作", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "名前変更" } \ No newline at end of file diff --git a/imports/i18n/data/ka.i18n.json b/imports/i18n/data/ka.i18n.json index 8f009d901..692ba557b 100644 --- a/imports/i18n/data/ka.i18n.json +++ b/imports/i18n/data/ka.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "სახელის შეცვლა" } \ No newline at end of file diff --git a/imports/i18n/data/km.i18n.json b/imports/i18n/data/km.i18n.json index de2782d7c..cecb66de1 100644 --- a/imports/i18n/data/km.i18n.json +++ b/imports/i18n/data/km.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ko-KR.i18n.json b/imports/i18n/data/ko-KR.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ko-KR.i18n.json +++ b/imports/i18n/data/ko-KR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json index 7c41d51cb..f97fbc05b 100644 --- a/imports/i18n/data/ko.i18n.json +++ b/imports/i18n/data/ko.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "동작", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "새이름" } \ No newline at end of file diff --git a/imports/i18n/data/lt.i18n.json b/imports/i18n/data/lt.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/lt.i18n.json +++ b/imports/i18n/data/lt.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/lv.i18n.json b/imports/i18n/data/lv.i18n.json index dd4a9ea2c..57d088b7e 100644 --- a/imports/i18n/data/lv.i18n.json +++ b/imports/i18n/data/lv.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Darbība", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Pārsaukt" } \ No newline at end of file diff --git a/imports/i18n/data/mk.i18n.json b/imports/i18n/data/mk.i18n.json index 776135106..2d3669b84 100644 --- a/imports/i18n/data/mk.i18n.json +++ b/imports/i18n/data/mk.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/mn.i18n.json b/imports/i18n/data/mn.i18n.json index 69fe7bb17..4d433fbc5 100644 --- a/imports/i18n/data/mn.i18n.json +++ b/imports/i18n/data/mn.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ms-MY.i18n.json +++ b/imports/i18n/data/ms-MY.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/nb.i18n.json b/imports/i18n/data/nb.i18n.json index 651ddbb76..3a798b85e 100644 --- a/imports/i18n/data/nb.i18n.json +++ b/imports/i18n/data/nb.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Aksjon", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Omdøp" } \ No newline at end of file diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json index d38d0de53..8f88d3b68 100644 --- a/imports/i18n/data/nl-NL.i18n.json +++ b/imports/i18n/data/nl-NL.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Opslag", "action": "Actie", "board-title": "Bord Titel", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Hernoem" } \ No newline at end of file diff --git a/imports/i18n/data/nl.i18n.json b/imports/i18n/data/nl.i18n.json index 2610c75ef..a28be6dc5 100644 --- a/imports/i18n/data/nl.i18n.json +++ b/imports/i18n/data/nl.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Opslag", "action": "Actie", "board-title": "Bord Titel", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Hernoem" } \ No newline at end of file diff --git a/imports/i18n/data/oc.i18n.json b/imports/i18n/data/oc.i18n.json index 381dc587b..d968be032 100644 --- a/imports/i18n/data/oc.i18n.json +++ b/imports/i18n/data/oc.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Tornar nomenar" } \ No newline at end of file diff --git a/imports/i18n/data/pa.i18n.json b/imports/i18n/data/pa.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/pa.i18n.json +++ b/imports/i18n/data/pa.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json index c7c260100..e598fe449 100644 --- a/imports/i18n/data/pl-PL.i18n.json +++ b/imports/i18n/data/pl-PL.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Reakcja", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Zmień nazwę" } \ No newline at end of file diff --git a/imports/i18n/data/pl.i18n.json b/imports/i18n/data/pl.i18n.json index 3791e18af..f86b36238 100644 --- a/imports/i18n/data/pl.i18n.json +++ b/imports/i18n/data/pl.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Reakcja", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Zmień nazwę" } \ No newline at end of file diff --git a/imports/i18n/data/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json index a52557629..47a897629 100644 --- a/imports/i18n/data/pt-BR.i18n.json +++ b/imports/i18n/data/pt-BR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Armazenamento", "action": "Ação", "board-title": "Título do Quadro", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renomear" } \ No newline at end of file diff --git a/imports/i18n/data/pt.i18n.json b/imports/i18n/data/pt.i18n.json index 11ef25f57..8e21fb562 100644 --- a/imports/i18n/data/pt.i18n.json +++ b/imports/i18n/data/pt.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Ação", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Renomear" } \ No newline at end of file diff --git a/imports/i18n/data/ro.i18n.json b/imports/i18n/data/ro.i18n.json index 4d1654d76..ff5a3eb9f 100644 --- a/imports/i18n/data/ro.i18n.json +++ b/imports/i18n/data/ro.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json index 06646d575..4b04096d7 100644 --- a/imports/i18n/data/ru-UA.i18n.json +++ b/imports/i18n/data/ru-UA.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Действие", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Переименовать" } \ No newline at end of file diff --git a/imports/i18n/data/ru.i18n.json b/imports/i18n/data/ru.i18n.json index 2d0265c37..fa6d77bdb 100644 --- a/imports/i18n/data/ru.i18n.json +++ b/imports/i18n/data/ru.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Действие", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Переименовать" } \ No newline at end of file diff --git a/imports/i18n/data/sk.i18n.json b/imports/i18n/data/sk.i18n.json index fc10cf58f..8080edca1 100644 --- a/imports/i18n/data/sk.i18n.json +++ b/imports/i18n/data/sk.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/sl.i18n.json b/imports/i18n/data/sl.i18n.json index 15f4f5183..15433cf74 100644 --- a/imports/i18n/data/sl.i18n.json +++ b/imports/i18n/data/sl.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Preimenuj" } \ No newline at end of file diff --git a/imports/i18n/data/sr.i18n.json b/imports/i18n/data/sr.i18n.json index cdb0f3fc4..24d93e28c 100644 --- a/imports/i18n/data/sr.i18n.json +++ b/imports/i18n/data/sr.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Preimenuj" } \ No newline at end of file diff --git a/imports/i18n/data/sv.i18n.json b/imports/i18n/data/sv.i18n.json index 436de6e3a..aeb56ccac 100644 --- a/imports/i18n/data/sv.i18n.json +++ b/imports/i18n/data/sv.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Åtgärd", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Byt namn" } \ No newline at end of file diff --git a/imports/i18n/data/sw.i18n.json b/imports/i18n/data/sw.i18n.json index d343d100c..1c980a2a8 100644 --- a/imports/i18n/data/sw.i18n.json +++ b/imports/i18n/data/sw.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ta.i18n.json b/imports/i18n/data/ta.i18n.json index 443a5dec1..4c9799096 100644 --- a/imports/i18n/data/ta.i18n.json +++ b/imports/i18n/data/ta.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "பெயர்மாற்றம் " } \ No newline at end of file diff --git a/imports/i18n/data/th.i18n.json b/imports/i18n/data/th.i18n.json index dff75dbc6..facc89994 100644 --- a/imports/i18n/data/th.i18n.json +++ b/imports/i18n/data/th.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "ตั้งชื่อใหม่" } \ No newline at end of file diff --git a/imports/i18n/data/tr.i18n.json b/imports/i18n/data/tr.i18n.json index e5ce3ccf4..005887ea4 100644 --- a/imports/i18n/data/tr.i18n.json +++ b/imports/i18n/data/tr.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Aksiyon", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Yeniden adlandır" } \ No newline at end of file diff --git a/imports/i18n/data/ug.i18n.json b/imports/i18n/data/ug.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ug.i18n.json +++ b/imports/i18n/data/ug.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uk-UA.i18n.json b/imports/i18n/data/uk-UA.i18n.json index 0e1c9aef5..67b78f6bc 100644 --- a/imports/i18n/data/uk-UA.i18n.json +++ b/imports/i18n/data/uk-UA.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Перейменувати" } \ No newline at end of file diff --git a/imports/i18n/data/uk.i18n.json b/imports/i18n/data/uk.i18n.json index a6ed3fd81..59bd3a23b 100644 --- a/imports/i18n/data/uk.i18n.json +++ b/imports/i18n/data/uk.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Перейменувати" } \ No newline at end of file diff --git a/imports/i18n/data/uz-AR.i18n.json b/imports/i18n/data/uz-AR.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/uz-AR.i18n.json +++ b/imports/i18n/data/uz-AR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz-LA.i18n.json b/imports/i18n/data/uz-LA.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/uz-LA.i18n.json +++ b/imports/i18n/data/uz-LA.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz-UZ.i18n.json b/imports/i18n/data/uz-UZ.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/uz-UZ.i18n.json +++ b/imports/i18n/data/uz-UZ.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/uz.i18n.json b/imports/i18n/data/uz.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/uz.i18n.json +++ b/imports/i18n/data/uz.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve-CC.i18n.json b/imports/i18n/data/ve-CC.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ve-CC.i18n.json +++ b/imports/i18n/data/ve-CC.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve-PP.i18n.json b/imports/i18n/data/ve-PP.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ve-PP.i18n.json +++ b/imports/i18n/data/ve-PP.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/ve.i18n.json b/imports/i18n/data/ve.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/ve.i18n.json +++ b/imports/i18n/data/ve.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vi-VN.i18n.json b/imports/i18n/data/vi-VN.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/vi-VN.i18n.json +++ b/imports/i18n/data/vi-VN.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vi.i18n.json b/imports/i18n/data/vi.i18n.json index 271f1f72e..d20556091 100644 --- a/imports/i18n/data/vi.i18n.json +++ b/imports/i18n/data/vi.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Hoạt động", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Đổi tên" } \ No newline at end of file diff --git a/imports/i18n/data/vl-SS.i18n.json b/imports/i18n/data/vl-SS.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/vl-SS.i18n.json +++ b/imports/i18n/data/vl-SS.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/vo.i18n.json b/imports/i18n/data/vo.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/vo.i18n.json +++ b/imports/i18n/data/vo.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wa-RR.i18n.json b/imports/i18n/data/wa-RR.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/wa-RR.i18n.json +++ b/imports/i18n/data/wa-RR.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wa.i18n.json b/imports/i18n/data/wa.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/wa.i18n.json +++ b/imports/i18n/data/wa.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/wo.i18n.json b/imports/i18n/data/wo.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/wo.i18n.json +++ b/imports/i18n/data/wo.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/xh.i18n.json b/imports/i18n/data/xh.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/xh.i18n.json +++ b/imports/i18n/data/xh.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/yi.i18n.json b/imports/i18n/data/yi.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/yi.i18n.json +++ b/imports/i18n/data/yi.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/yo.i18n.json b/imports/i18n/data/yo.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/yo.i18n.json +++ b/imports/i18n/data/yo.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zh-CN.i18n.json b/imports/i18n/data/zh-CN.i18n.json index d7a6911e8..22a8377f2 100644 --- a/imports/i18n/data/zh-CN.i18n.json +++ b/imports/i18n/data/zh-CN.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "操作", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "重命名" } \ No newline at end of file diff --git a/imports/i18n/data/zh-HK.i18n.json b/imports/i18n/data/zh-HK.i18n.json index c3446af94..56b050020 100644 --- a/imports/i18n/data/zh-HK.i18n.json +++ b/imports/i18n/data/zh-HK.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zh-TW.i18n.json b/imports/i18n/data/zh-TW.i18n.json index d5f071942..9478530f6 100644 --- a/imports/i18n/data/zh-TW.i18n.json +++ b/imports/i18n/data/zh-TW.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "操作", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "重新命名" } \ No newline at end of file diff --git a/imports/i18n/data/zu-ZA.i18n.json b/imports/i18n/data/zu-ZA.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/zu-ZA.i18n.json +++ b/imports/i18n/data/zu-ZA.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file diff --git a/imports/i18n/data/zu.i18n.json b/imports/i18n/data/zu.i18n.json index bc9b38449..213f6e856 100644 --- a/imports/i18n/data/zu.i18n.json +++ b/imports/i18n/data/zu.i18n.json @@ -1177,5 +1177,5 @@ "storage": "Storage", "action": "Action", "board-title": "Board Title", - "attachmentRenamePopup-title": "Attachment Rename" + "attachmentRenamePopup-title": "Rename" } \ No newline at end of file From 990477e9c6b33072b27bebf387bd6e6d9ef62074 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 21 May 2022 03:42:29 +0300 Subject: [PATCH 148/246] Fixed images not showing correctly, by updating packages, removing handlebars, and changing image attachment view big image popup from swipebox to lightbox. Thanks to xet7 ! Fixes #4507 --- .meteor/packages | 2 +- .meteor/versions | 2 +- client/components/cards/attachments.jade | 2 +- client/components/main/layouts.css | 50 +- package-lock.json | 6676 +++++++++++++++++++--- package.json | 3 +- public/css/reset.css | 59 - 7 files changed, 5879 insertions(+), 915 deletions(-) delete mode 100644 public/css/reset.css diff --git a/.meteor/packages b/.meteor/packages index 5d362279a..8c07c71f1 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -61,7 +61,6 @@ meteor-autosize rajit:bootstrap3-datepicker shell-server@0.5.0 email@2.2.1 -horka:swipebox dynamic-import@0.7.2 cfs:gridfs @@ -146,3 +145,4 @@ wekan-oidc wekan-accounts-oidc wekan-ldap wekan-accounts-cas +czbaker:lightbox2 diff --git a/.meteor/versions b/.meteor/versions index 5d9edd520..7e45d5eff 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -43,6 +43,7 @@ coffeescript@2.4.1 coffeescript-compiler@2.4.1 communitypackages:picker@1.1.0 cottz:publish-relations@2.0.8 +czbaker:lightbox2@2.7.1_1 dburles:collection-helpers@1.1.0 ddp@1.4.0 ddp-client@2.5.0 @@ -64,7 +65,6 @@ fastclick@1.0.13 fetch@0.1.1 fortawesome:fontawesome@4.7.0 geojson-utils@1.0.10 -horka:swipebox@1.0.2 hot-code-push@1.0.4 html-tools@1.1.3 htmljs@1.1.1 diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index f915e8bb5..8579abd98 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -19,7 +19,7 @@ template(name="attachmentsGalery") .attachments-galery each attachments .attachment-item - a.attachment-thumbnail.swipebox(href="{{link}}" title="{{name}}") + a.attachment-thumbnail(href="{{link}}" title="{{name}}" data-lightbox="{{name}}") if link if isImage img.attachment-thumbnail-img(src="{{link}}") diff --git a/client/components/main/layouts.css b/client/components/main/layouts.css index 3d095ac6a..e639c7a32 100644 --- a/client/components/main/layouts.css +++ b/client/components/main/layouts.css @@ -1,9 +1,6 @@ -* { - -webkit-box-sizing: unset; - box-sizing: unset; -} /* Fixed missing 'import nib' stylesheet reset and extra li bullet points * https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536 + * https://github.com/stylus/nib/blob/master/lib/nib/reset.styl */ a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, @@ -19,6 +16,51 @@ table, tbody, td, tfoot, th, thread, tr, tt, ul, var { font-size: 100%; vertical-align: baseline; } +ol, ul { + list-style: none; +} +a img { + border: none; +} +/* reset body */ +body { + line-height: 1; + color: black; + background: white; +} +/* reset table cell */ +table { + border-collapse: separate; + border-spacing: 0; + vertical-align: middle; +} +caption, td, th { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +/* reset html5 */ +article, aside, canvas, details, figcaption, + figure, footer, header, hgroup, menu, nav, + section, summary, main { + display: block; +} +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]),[hidden] { + display: none; +} + +/* End of reset css */ + + +* { + -webkit-box-sizing: unset; + box-sizing: unset; +} .note-popover .popover-content .note-color-palette div .note-color-btn, .panel-heading.note-toolbar .note-color-palette div .note-color-btn { background: none; diff --git a/package-lock.json b/package-lock.json index 35d35e778..b724a927f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,262 +1,5568 @@ { "name": "wekan", "version": "v6.24.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "requires": { - "@babel/highlight": "^7.16.0" + "packages": { + "": { + "name": "wekan", + "version": "v6.24.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/runtime": "^7.15.4", + "@mapbox/node-pre-gyp": "^1.0.8", + "@wekanteam/markdown-it-mermaid": "^0.5.4", + "ajv": "^6.12.6", + "babel-runtime": "^6.26.0", + "bcryptjs": "^2.4.3", + "bson": "^4.5.2", + "bunyan": "^1.8.15", + "core-js": "^3.18.2", + "dompurify": "^2.3.2", + "es6-promise": "^4.2.4", + "escape-string-regexp": "^5.0.0", + "exceljs": "^4.2.1", + "fibers": "^5.0.0", + "i18next": "^21.6.16", + "i18next-sprintf-postprocessor": "^0.2.2", + "jQuery": "^1.7.4", + "jquery-ui": "^1.13.0", + "jquery-ui-touch-punch": "^0.2.3", + "jszip": "^3.7.1", + "ldapjs": "^2.3.1", + "markdown-it": "^12.3.2", + "markdown-it-emoji": "^2.0.0", + "meteor-accounts-t9n": "^2.6.0", + "meteor-node-stubs": "^1.1.0", + "moment": "^2.29.3", + "mongodb": "^3.7.3", + "nodemailer": "^6.6.3", + "os": "^0.1.2", + "page": "^1.11.6", + "papaparse": "^5.3.1", + "qs": "^6.10.1", + "simpl-schema": "^1.12.0", + "source-map-support": "^0.5.20", + "summernote": "^0.8.20", + "uuid": "^8.3.2" + }, + "devDependencies": { + "babel-plugin-istanbul": "^6.1.1", + "chai": "^4.3.6", + "chai-as-promised": "^7.1.1", + "flatted": "^3.2.2", + "puppeteer": "^1.20.0", + "sinon": "^13.0.2", + "sinon-chai": "^3.7.0" } }, - "@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "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/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", - "requires": { - "@babel/types": "^7.15.4", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "json5": "^2.2.1", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dependencies": { - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", + "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" + }, + "node_modules/@wekanteam/cli-table3": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", + "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", + "dependencies": { + "string-width": "^5.1.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@wekanteam/markdown-it-mermaid": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", + "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", + "dependencies": { + "@wekanteam/cli-table3": "^0.7.6", + "mermaid": "^9.0.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "electron-to-chromium": { - "version": "1.4.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz", - "integrity": "sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==" + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js": { + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", + "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", + "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", + "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "dependencies": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/dagre-d3/node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/dagre-d3/node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/dagre-d3/node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/dagre-d3/node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/dagre-d3/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/dagre-d3/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/dagre-d3/node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/dagre-d3/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/dagre-d3/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/dagre-d3/node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "node_modules/dagre-d3/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/dagre-d3/node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/dagre-d3/node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/dagre-d3/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/dagre-d3/node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre-d3/node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", + "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" } }, - "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", + "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fibers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", + "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fibers/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/i18next": { + "version": "21.8.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.3.tgz", + "integrity": "sha512-I6QEXu096oaNH8h+hs2eHu6hxtWPdb/rsoRFHmFep01uuwB0h86ckXaT14ladhstWenEScsxiAQ2TW9fmDG57Q==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, + "node_modules/i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jQuery": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", + "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=", + "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/jquery-ui": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" + }, + "node_modules/jquery-ui/node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", + "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mermaid": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", + "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "d3": "^7.0.0", + "dagre": "^0.8.5", + "dagre-d3": "^0.6.4", + "dompurify": "2.3.6", + "graphlib": "^2.1.8", + "khroma": "^2.0.0", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" + } + }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + }, + "node_modules/message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "dependencies": { + "lodash.template": "^4.5.0" + } + }, + "node_modules/meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, + "node_modules/meteor-node-stubs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", + "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", + "bundleDependencies": [ + "assert", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "crypto-browserify", + "domain-browser", + "events", + "https-browserify", + "os-browserify", + "path-browserify", + "process", + "punycode", + "querystring-es3", + "readable-stream", + "stream-browserify", + "stream-http", + "string_decoder", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ], + "dependencies": { + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", + "elliptic": "^6.5.4", + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/assert": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/bn.js": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/brorand": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/browserify-aes": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-des": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-sign": { + "version": "4.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer-xor": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/call-bind": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/cipher-base": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/console-browserify": { + "version": "1.2.0", + "inBundle": true + }, + "node_modules/meteor-node-stubs/node_modules/constants-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-hash": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-hmac": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { + "version": "3.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/define-properties": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/des.js": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { + "version": "5.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/domain-browser": { + "version": "4.19.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic": { + "version": "6.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/es-abstract": { + "version": "1.18.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/foreach": { + "version": "2.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-bigints": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-symbols": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash-base": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash.js": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/https-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/meteor-node-stubs/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/is-arguments": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-bigint": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-callable": { + "version": "1.2.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-date-object": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-generator-function": { + "version": "1.0.9", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-nan": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-number-object": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-regex": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-string": { + "version": "1.0.6", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-typed-array": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/md5.js": { + "version": "1.3.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/object-inspect": { + "version": "1.10.3", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-is": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-keys": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/object.assign": { + "version": "4.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/os-browserify": { + "version": "0.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pako": { + "version": "1.0.11", + "inBundle": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/meteor-node-stubs/node_modules/parse-asn1": { + "version": "5.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/path-browserify": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pbkdf2": { + "version": "3.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/meteor-node-stubs/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt": { + "version": "4.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/punycode": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/querystring": { + "version": "0.2.0", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring-es3": { + "version": "0.2.1", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/randombytes": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/randomfill": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/meteor-node-stubs/node_modules/ripemd160": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/setimmediate": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/sha.js": { + "version": "2.4.11", + "inBundle": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-browserify": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-http": { + "version": "3.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/timers-browserify": { + "version": "2.0.12", + "inBundle": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/tty-browserify": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/url": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/util": { + "version": "0.12.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/vm-browserify": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/which-typed-array": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/xtend": { + "version": "4.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "node_modules/mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, + "node_modules/mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" + }, + "node_modules/nodemailer": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "deprecated": "Version no longer supported. Upgrade to @latest", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/puppeteer/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simpl-schema": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", + "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", + "dependencies": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, + "node_modules/sinon": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", + "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", + "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" + }, + "node_modules/summernote": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", + "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", + "hasInstallScript": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "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" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.10.0" + } + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@babel/types": "^7.15.4" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + }, + "@babel/core": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "requires": { + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", - "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", - "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", - "requires": { - "@babel/types": "^7.15.4" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, "@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", - "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==" + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==" }, "@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -311,6 +5617,39 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@mapbox/node-pre-gyp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", @@ -327,36 +5666,6 @@ "tar": "^6.1.11" }, "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -403,9 +5712,9 @@ "dev": true }, "@types/node": { - "version": "14.17.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", - "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==" + "version": "14.18.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", + "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" }, "@wekanteam/cli-table3": { "version": "0.7.6", @@ -435,12 +5744,11 @@ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" }, "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" } }, "ajv": { @@ -454,18 +5762,10 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -475,26 +5775,18 @@ "color-convert": "^1.9.0" } }, - "app-path": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/app-path/-/app-path-3.3.0.tgz", - "integrity": "sha512-EAgEXkdcxH1cgEePOSsmUtw9ItPl0KTxnh/pj9ZbhvbKbij9x0oX6PWpGnorDr0DS5AosLgoa5n3T/hZmKQpYA==", - "requires": { - "execa": "^1.0.0" - } - }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "requires": { "archiver-utils": "^2.1.0", - "async": "^3.2.0", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", @@ -564,14 +5856,6 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } } }, "asn1": { @@ -585,7 +5869,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "assertion-error": { "version": "1.1.0", @@ -594,9 +5878,9 @@ "dev": true }, "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "async-limiter": { "version": "1.0.1", @@ -620,7 +5904,7 @@ "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -641,7 +5925,7 @@ "backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", "requires": { "precond": "0.2" } @@ -659,7 +5943,7 @@ "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, "big-integer": { "version": "1.6.51", @@ -669,7 +5953,7 @@ "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "requires": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -716,7 +6000,7 @@ "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, "brace-expansion": { "version": "1.1.11", @@ -727,10 +6011,22 @@ "concat-map": "0.0.1" } }, + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, "bson": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.1.tgz", - "integrity": "sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", "requires": { "buffer": "^5.6.0" } @@ -747,7 +6043,7 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "buffer-from": { "version": "1.1.2", @@ -762,7 +6058,7 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" }, "bunyan": { "version": "1.8.15", @@ -790,6 +6086,11 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==" + }, "chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", @@ -817,7 +6118,7 @@ "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "requires": { "traverse": ">=0.3.0 <0.4" } @@ -842,7 +6143,7 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true }, "chownr": { @@ -952,9 +6253,9 @@ } }, "core-js": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", - "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==" + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", + "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==" }, "core-util-is": { "version": "1.0.2", @@ -962,13 +6263,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "crc32-stream": { "version": "4.0.2", @@ -979,38 +6276,6 @@ "readable-stream": "^3.4.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "cypress-image-snapshot": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cypress-image-snapshot/-/cypress-image-snapshot-4.0.1.tgz", - "integrity": "sha512-PBpnhX/XItlx3/DAk5ozsXQHUi72exybBNH5Mpqj1DVmjq+S5Jd9WE5CRa4q5q0zuMZb2V2VpXHth6MjFpgj9Q==", - "requires": { - "chalk": "^2.4.1", - "fs-extra": "^7.0.1", - "glob": "^7.1.3", - "jest-image-snapshot": "4.2.0", - "pkg-dir": "^3.0.0", - "term-img": "^4.0.0" - } - }, "d3": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", @@ -1574,14 +6839,14 @@ } }, "dayjs": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", + "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -1614,9 +6879,9 @@ "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "diff": { "version": "5.0.0", @@ -1625,9 +6890,9 @@ "dev": true }, "dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" }, "dtrace-provider": { "version": "0.8.8", @@ -1680,6 +6945,11 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "electron-to-chromium": { + "version": "1.4.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", + "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" + }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1744,25 +7014,6 @@ "uuid": "^8.3.0" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" - }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -1831,6 +7082,13 @@ "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", "requires": { "detect-libc": "^1.0.3" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + } } }, "find-up": { @@ -1844,9 +7102,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "fs-constants": { @@ -1854,16 +7112,6 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -1886,6 +7134,16 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } } }, "function-bind": { @@ -1909,11 +7167,6 @@ "wide-align": "^1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1928,14 +7181,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -1966,28 +7211,15 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -1997,15 +7229,10 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "glur": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", - "integrity": "sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok=" - }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "graphlib": { "version": "2.1.8", @@ -2023,21 +7250,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2054,42 +7266,20 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "agent-base": "6", + "debug": "4" } }, "i18next": { - "version": "21.6.16", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz", - "integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==", + "version": "21.8.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.3.tgz", + "integrity": "sha512-I6QEXu096oaNH8h+hs2eHu6hxtWPdb/rsoRFHmFep01uuwB0h86ckXaT14ladhstWenEScsxiAQ2TW9fmDG57Q==", "requires": { "@babel/runtime": "^7.17.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - } } }, "i18next-sprintf-postprocessor": { @@ -2139,21 +7329,11 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -2161,9 +7341,9 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, "requires": { "@babel/core": "^7.12.3", @@ -2173,92 +7353,24 @@ "semver": "^6.3.0" } }, - "iterm2-version": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-4.2.0.tgz", - "integrity": "sha512-IoiNVk4SMPu6uTcK+1nA5QaHNok2BMDLjSl5UomrOixe5g4GkylhPwuiGdw00ysSCrXAKNMfFTu+u/Lk5f6OLQ==", - "requires": { - "app-path": "^3.2.0", - "plist": "^3.0.1" - } - }, - "jest-image-snapshot": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-4.2.0.tgz", - "integrity": "sha512-6aAqv2wtfOgxiJeBayBCqHo1zX+A12SUNNzo7rIxiXh6W6xYVu8QyHWkada8HeRi+QUTHddp0O0Xa6kmQr+xbQ==", - "requires": { - "chalk": "^1.1.3", - "get-stdin": "^5.0.1", - "glur": "^1.1.2", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "pixelmatch": "^5.1.0", - "pngjs": "^3.4.0", - "rimraf": "^2.6.2", - "ssim.js": "^3.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "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" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" + "jQuery": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", + "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=" }, "jquery-ui": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.0.tgz", - "integrity": "sha512-Osf7ECXNTYHtKBkn9xzbIf9kifNrBhfywFEKxOeB/OVctVmLlouV9mfc2qXCp6uyO4Pn72PXKOnj09qXetopCw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", "requires": { "jquery": ">=1.8.0 <4.0.0" + }, + "dependencies": { + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + } } }, "jquery-ui-touch-punch": { @@ -2292,30 +7404,19 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" + "setimmediate": "^1.0.5" }, "dependencies": { "isarray": { @@ -2354,9 +7455,9 @@ "dev": true }, "khroma": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.4.1.tgz", - "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" }, "lazystream": { "version": "1.0.1", @@ -2404,9 +7505,9 @@ } }, "ldapjs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.1.tgz", - "integrity": "sha512-kf0tHHLrpwKaBAQOhYHXgdeh2PkFuCCxWgLb1MRn67ZQVo787D2pij3mmHVZx193GIdM8xcfi8HF6AIYYnj0fQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", + "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", "requires": { "abstract-logging": "^2.0.0", "asn1": "^0.2.4", @@ -2591,9 +7692,9 @@ } }, "markdown-it-emoji": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", - "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" }, "mdurl": { "version": "1.0.1", @@ -2607,20 +7708,26 @@ "optional": true }, "mermaid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.0.1.tgz", - "integrity": "sha512-TXXffALLhCACez+MUky4cOOcGXEXiJhHwN8eRV7bBqD8F6KdcjssyPZClVgzrC2KQzSGLqQkj7ce8ea7MhWz+Q==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", + "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", "requires": { "@braintree/sanitize-url": "^6.0.0", - "cypress-image-snapshot": "^4.0.1", "d3": "^7.0.0", "dagre": "^0.8.5", "dagre-d3": "^0.6.4", "dompurify": "2.3.6", "graphlib": "^2.1.8", - "khroma": "^1.4.1", + "khroma": "^2.0.0", "moment-mini": "^2.24.0", "stylis": "^4.0.10" + }, + "dependencies": { + "dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + } } }, "message-box": { @@ -2637,34 +7744,34 @@ "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" }, "meteor-node-stubs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", - "integrity": "sha512-YvMQb4zcfWA82wFdRVTyxq28GO+Us7GSdtP+bTtC/mV35yipKnWo4W4665O57AmLVFnz4zR+WIZW11b4sfCtJw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", + "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", "requires": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", "elliptic": "^6.5.4", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" }, "dependencies": { "asn1.js": { @@ -2771,11 +7878,11 @@ } }, "buffer": { - "version": "6.0.3", + "version": "5.7.1", "bundled": true, "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ieee754": "^1.1.13" } }, "buffer-xor": { @@ -3224,7 +8331,7 @@ } }, "punycode": { - "version": "2.1.1", + "version": "1.4.1", "bundled": true }, "querystring": { @@ -3305,6 +8412,13 @@ "xtend": "^4.0.2" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -3321,13 +8435,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -3420,9 +8527,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -3450,11 +8557,11 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "moment": { @@ -3506,6 +8613,30 @@ "mkdirp": "~0.5.1", "ncp": "~2.0.0", "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } } }, "nan": { @@ -3520,11 +8651,6 @@ "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "nise": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", @@ -3558,14 +8684,14 @@ } }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" }, "nodemailer": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", - "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==" + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" }, "nopt": { "version": "5.0.0", @@ -3580,14 +8706,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -3630,15 +8748,11 @@ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -3655,7 +8769,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "page": { "version": "1.11.6", @@ -3671,9 +8786,9 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "papaparse": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", - "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" }, "path-exists": { "version": "4.0.0", @@ -3686,11 +8801,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, "path-to-regexp": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", @@ -3716,85 +8826,11 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "pixelmatch": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", - "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", - "requires": { - "pngjs": "^4.0.1" - }, - "dependencies": { - "pngjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", - "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==" - } - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7" - } - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" - }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3812,15 +8848,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3842,6 +8869,36 @@ "ws": "^6.1.0" }, "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -3896,25 +8953,11 @@ "dev": true }, "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "glob": "^6.0.1" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.3" } }, "robust-predicates": { @@ -3970,29 +9013,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -4053,12 +9078,13 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true + "dev": true, + "requires": {} }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.21", @@ -4067,13 +9093,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "sparse-bitfield": { @@ -4085,20 +9104,11 @@ "memory-pager": "^1.0.2" } }, - "ssim.js": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ssim.js/-/ssim.js-3.5.0.tgz", - "integrity": "sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "string_decoder": { "version": "1.3.0", @@ -4115,23 +9125,48 @@ } } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "requires": { - "ansi-regex": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } }, "stylis": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.0.tgz", - "integrity": "sha512-SrSDzNasOCBTo7C2N9geFwydg/2bmdkWXd4gJirtq82m5JBYtR2+Ialck8czmfBLIdPxCOotlgJESPa8C1RqvA==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", + "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" + }, + "summernote": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", + "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==" }, "supports-color": { "version": "5.5.0", @@ -4185,15 +9220,6 @@ } } }, - "term-img": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/term-img/-/term-img-4.1.0.tgz", - "integrity": "sha512-DFpBhaF5j+2f7kheKFc1ajsAUUDGOaNPpKPtiIMxlbfud6mvfFZuWGnTRpaujUa5J7yl6cIw/h6nyr4mSsENPg==", - "requires": { - "ansi-escapes": "^4.1.0", - "iterm2-version": "^4.1.0" - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4211,16 +9237,6 @@ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "requires": { "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } } }, "to-fast-properties": { @@ -4244,11 +9260,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4260,11 +9271,6 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, "unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -4373,14 +9379,6 @@ "webidl-conversions": "^3.0.0" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -4389,11 +9387,6 @@ "string-width": "^1.0.2 || 2 || 3 || 4" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4408,14 +9401,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -4433,11 +9418,6 @@ "async-limiter": "~1.0.0" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 75e38c69f..1072ccd38 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "fibers": "^5.0.0", "i18next": "^21.6.16", "i18next-sprintf-postprocessor": "^0.2.2", - "jquery": "^2.2.4", + "jQuery": "^1.7.4", "jquery-ui": "^1.13.0", "jquery-ui-touch-punch": "^0.2.3", "jszip": "^3.7.1", @@ -57,6 +57,7 @@ "qs": "^6.10.1", "simpl-schema": "^1.12.0", "source-map-support": "^0.5.20", + "summernote": "^0.8.20", "uuid": "^8.3.2" }, "meteor": { diff --git a/public/css/reset.css b/public/css/reset.css deleted file mode 100644 index 3839cb35c..000000000 --- a/public/css/reset.css +++ /dev/null @@ -1,59 +0,0 @@ -/* Fixed missing 'import nib' stylesheet reset and extra li bullet points - * https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536 - * https://github.com/stylus/nib/blob/master/lib/nib/reset.styl - */ -a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, -code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, -h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, -q, s, samp, small, span, strike, strong, sub, sup, -table, tbody, td, tfoot, th, thread, tr, tt, ul, var { - margin: 0; - padding: 0; - outline: 0; - font-weight: inherit; - font-style: inherit; - font-family: inherit; - font-size: 100%; - vertical-align: baseline; -} -ol, ul { - list-style: none; -} -a img { - border: none; -} -/* reset body */ -body { - line-height: 1; - color: black; - background: white; -} -/* reset table cell */ -table { - border-collapse: separate; - border-spacing: 0; - vertical-align: middle; -} -caption, td, th { - text-align: left; - font-weight: normal; - vertical-align: middle; -} -/* reset html5 */ -article, aside, canvas, details, figcaption, - figure, footer, header, hgroup, menu, nav, - section, summary, main { - display: block; -} -audio, canvas, video { - display inline-block; - *display inline; - *zoom 1; -} -audio:not([controls]),[hidden] { - display: none; -} - - - - From dde98c8870c7de1f7f2936d4c6ac267c796a7aec Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 21 May 2022 03:53:12 +0300 Subject: [PATCH 149/246] Updated ChangeLog. --- CHANGELOG.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8ebe43c1..67940cd6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,19 @@ # Upcoming WeKan ® release -This release fixes the following bugs: +This release adds the following new features: + +- [Attachment rename](https://github.com/wekan/wekan/pulls/4521). + Thanks to mfilser. + +and fixes the following bugs: - [Fix Bullets in label selection popup. Related to import nib css reset](https://github.com/wekan/wekan/commit/985c2cdbfdb38eb43852f3aa257859bbd3f817b9). Thanks to AuspeXeu, mfilser and xet7. +- [Fixed images not showing correctly, by updating packages like jquery, + removing handlebars, changing image attachment view big image popup + from swipebox to lightbox, and changing import nib related code](https://github.com/wekan/wekan/commit/990477e9c6b33072b27bebf387bd6e6d9ef62074). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 60ac208ec27c4f2176b7610d9d241589e1facb9c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 21 May 2022 04:06:18 +0300 Subject: [PATCH 150/246] v6.25 --- CHANGELOG.md | 4 ++-- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67940cd6e..e5097b576 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.25 2022-05-21 WeKan ® release This release adds the following new features: @@ -11,7 +11,7 @@ and fixes the following bugs: - [Fix Bullets in label selection popup. Related to import nib css reset](https://github.com/wekan/wekan/commit/985c2cdbfdb38eb43852f3aa257859bbd3f817b9). Thanks to AuspeXeu, mfilser and xet7. -- [Fixed images not showing correctly, by updating packages like jquery, +- [Fix images not showing correctly, by updating packages like jquery, removing handlebars, changing image attachment view big image popup from swipebox to lightbox, and changing import nib related code](https://github.com/wekan/wekan/commit/990477e9c6b33072b27bebf387bd6e6d9ef62074). Thanks to xet7. diff --git a/Stackerfile.yml b/Stackerfile.yml index 6a283677b..9dea6da66 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.24.0" +appVersion: "v6.25.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index 4791f2ae1..c61734465 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.24" +appVersion: "6.25" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index b495176e0..1b2e515b0 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.24 + tag: v6.25 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index b724a927f..86632581d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.24.0", + "version": "v6.25.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 1072ccd38..e8393b6a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.24.0", + "version": "v6.25.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index 2cde35919..13d6f83b3 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.24 + Wekan REST API v6.25 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
        • - Wekan REST API v6.24 + Wekan REST API v6.25
        • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
          -

          Wekan REST API v6.24

          +

          Wekan REST API v6.25

          Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

          diff --git a/public/api/wekan.yml b/public/api/wekan.yml index f6cfc670c..6a75dfca3 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.24 + version: v6.25 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 7a333950a..7645e53f8 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 624, + appVersion = 625, # Increment this for every release. - appMarketingVersion = (defaultText = "6.24.0~2022-05-18"), + appMarketingVersion = (defaultText = "6.25.0~2022-05-21"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index f26eb84a2..a8bce89db 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.24' +version: '6.25' summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. From 6c8563d02f0865989d8db39dd84757a1a534b49b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 21 May 2022 04:29:30 +0300 Subject: [PATCH 151/246] Updated to Node.js v14.19.3. Thanks to Node.js developers. --- .devcontainer/Dockerfile | 2 +- .future-snap/broken-snapcraft.yaml | 2 +- .travis.yml | 2 +- Dockerfile | 2 +- Dockerfile.arm64v8 | 4 ++-- rebuild-wekan.bat | 4 ++-- rebuild-wekan.sh | 2 +- snapcraft.yaml | 2 +- stacksmith/user-scripts/build.sh | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 0491b039e..991a22599 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -10,7 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive ENV \ DEBUG=false \ - NODE_VERSION=v14.19.2 \ + NODE_VERSION=v14.19.3 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/.future-snap/broken-snapcraft.yaml b/.future-snap/broken-snapcraft.yaml index 9df91c51c..d81367a9e 100644 --- a/.future-snap/broken-snapcraft.yaml +++ b/.future-snap/broken-snapcraft.yaml @@ -81,7 +81,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.2 + node-engine: 14.19.3 node-packages: - node-gyp - node-pre-gyp diff --git a/.travis.yml b/.travis.yml index f9d6758d3..c588f99c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: required env: TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0 - TRAVIS_NODE_VERSION: 14.19.2 + TRAVIS_NODE_VERSION: 14.19.3 TRAVIS_NPM_VERSION: latest before_install: diff --git a/Dockerfile b/Dockerfile index d3a76b8ff..f97b45e9e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ ARG DEBIAN_FRONTEND=noninteractive ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ - NODE_VERSION=v14.19.2 \ + NODE_VERSION=v14.19.3 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ diff --git a/Dockerfile.arm64v8 b/Dockerfile.arm64v8 index 40424f5cc..5cc7b5227 100644 --- a/Dockerfile.arm64v8 +++ b/Dockerfile.arm64v8 @@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder ENV QEMU_VERSION=v4.2.0-6 \ QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.2 \ + NODE_VERSION=v14.19.3 \ WEKAN_VERSION=latest \ WEKAN_ARCHITECTURE=arm64 \ NODE_OPTIONS="--max_old_space_size=4096" @@ -49,7 +49,7 @@ LABEL maintainer="wekan" # Set the environment variables (defaults where required) ENV QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v14.19.2 \ + NODE_VERSION=v14.19.3 \ NODE_ENV=production \ NPM_VERSION=latest \ WITH_API=true \ diff --git a/rebuild-wekan.bat b/rebuild-wekan.bat index 32058587d..bba15980a 100644 --- a/rebuild-wekan.bat +++ b/rebuild-wekan.bat @@ -15,8 +15,8 @@ REM Install chocolatey choco install -y git curl python2 dotnet4.5.2 nano mongodb-4 mongoclient -curl -O https://nodejs.org/dist/v14.19.2/node-v14.19.2-x64.msi -call node-v14.19.2-x64.msi +curl -O https://nodejs.org/dist/v14.19.3/node-v14.19.3-x64.msi +call node-v14.19.3-x64.msi call npm config -g set msvs_version 2015 call meteor npm config -g set msvs_version 2015 diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index ac143e65e..a1fc95081 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -39,7 +39,7 @@ do #curl -0 -L https://npmjs.org/install.sh | sudo sh #sudo chown -R $(id -u):$(id -g) $HOME/.npm sudo npm -g install n - sudo n 14.19.2 + sudo n 14.19.3 #sudo npm -g install npm ## Latest npm with Meteor 2.2 sudo npm -g install node-gyp diff --git a/snapcraft.yaml b/snapcraft.yaml index a8bce89db..1b46e86bd 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -80,7 +80,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 14.19.2 + node-engine: 14.19.3 node-packages: - node-gyp - node-pre-gyp diff --git a/stacksmith/user-scripts/build.sh b/stacksmith/user-scripts/build.sh index b7eafbe59..b3292159a 100755 --- a/stacksmith/user-scripts/build.sh +++ b/stacksmith/user-scripts/build.sh @@ -2,7 +2,7 @@ set -euxo pipefail BUILD_DEPS="bsdtar gnupg wget curl bzip2 python git ca-certificates perl-Digest-SHA" -NODE_VERSION=v14.19.2 +NODE_VERSION=v14.19.3 #METEOR_RELEASE=1.6.0.1 - for Stacksmith, meteor-1.8 branch that could have METEOR@1.8.1-beta.8 or newer USE_EDGE=false METEOR_EDGE=1.5-beta.17 From 148ef0eb65c10cab7ad554ce8142cc78e7c9a6f9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 21 May 2022 04:34:57 +0300 Subject: [PATCH 152/246] v6.26 --- CHANGELOG.md | 9 + Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 5433 +--------------------------------------- package.json | 2 +- public/api/wekan.html | 6 +- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 +- snapcraft.yaml | 2 +- 10 files changed, 68 insertions(+), 5396 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5097b576..664262df3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# v6.26 2022-05-21 WeKan ® release + +This release adds the following updates: + +- [Updated to Node.js v14.19.3](https://github.com/wekan/wekan/commit/6c8563d02f0865989d8db39dd84757a1a534b49b). + Thanks to Node.js developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.25 2022-05-21 WeKan ® release This release adds the following new features: diff --git a/Stackerfile.yml b/Stackerfile.yml index 9dea6da66..3fe1def23 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.25.0" +appVersion: "v6.26.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index c61734465..29b5f4b0c 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.25" +appVersion: "6.26" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 1b2e515b0..26f036ec1 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.25 + tag: v6.26 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index 86632581d..de8c66013 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5344 +1,8 @@ { "name": "wekan", - "version": "v6.25.0", - "lockfileVersion": 2, + "version": "v6.26.0", + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "wekan", - "version": "v6.24.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.4", - "ajv": "^6.12.6", - "babel-runtime": "^6.26.0", - "bcryptjs": "^2.4.3", - "bson": "^4.5.2", - "bunyan": "^1.8.15", - "core-js": "^3.18.2", - "dompurify": "^2.3.2", - "es6-promise": "^4.2.4", - "escape-string-regexp": "^5.0.0", - "exceljs": "^4.2.1", - "fibers": "^5.0.0", - "i18next": "^21.6.16", - "i18next-sprintf-postprocessor": "^0.2.2", - "jQuery": "^1.7.4", - "jquery-ui": "^1.13.0", - "jquery-ui-touch-punch": "^0.2.3", - "jszip": "^3.7.1", - "ldapjs": "^2.3.1", - "markdown-it": "^12.3.2", - "markdown-it-emoji": "^2.0.0", - "meteor-accounts-t9n": "^2.6.0", - "meteor-node-stubs": "^1.1.0", - "moment": "^2.29.3", - "mongodb": "^3.7.3", - "nodemailer": "^6.6.3", - "os": "^0.1.2", - "page": "^1.11.6", - "papaparse": "^5.3.1", - "qs": "^6.10.1", - "simpl-schema": "^1.12.0", - "source-map-support": "^0.5.20", - "summernote": "^0.8.20", - "uuid": "^8.3.2" - }, - "devDependencies": { - "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.6", - "chai-as-promised": "^7.1.1", - "flatted": "^3.2.2", - "puppeteer": "^1.20.0", - "sinon": "^13.0.2", - "sinon-chai": "^3.7.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", - "dependencies": { - "@babel/types": "^7.18.0", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", - "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", - "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" - }, - "node_modules/@wekanteam/cli-table3": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", - "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", - "dependencies": { - "string-width": "^5.1.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@wekanteam/markdown-it-mermaid": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", - "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", - "dependencies": { - "@wekanteam/cli-table3": "^0.7.6", - "mermaid": "^9.0.1" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", - "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", - "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "3", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/dagre-d3/node_modules/d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/dagre-d3/node_modules/d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "node_modules/dagre-d3/node_modules/d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/dagre-d3/node_modules/d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/dagre-d3/node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/dagre-d3/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "node_modules/dagre-d3/node_modules/d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "dependencies": { - "d3-dsv": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/dagre-d3/node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/dagre-d3/node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/dagre-d3/node_modules/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "node_modules/dagre-d3/node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/dagre-d3/node_modules/d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "node_modules/dagre-d3/node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "node_modules/dagre-d3/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/dagre-d3/node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/dagre-d3/node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dayjs": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", - "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dompurify": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", - "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exceljs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", - "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", - "dependencies": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fibers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", - "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fibers/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/i18next": { - "version": "21.8.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.3.tgz", - "integrity": "sha512-I6QEXu096oaNH8h+hs2eHu6hxtWPdb/rsoRFHmFep01uuwB0h86ckXaT14ladhstWenEScsxiAQ2TW9fmDG57Q==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" - } - }, - "node_modules/i18next-sprintf-postprocessor": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", - "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jQuery": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", - "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=", - "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/jquery-ui": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", - "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", - "dependencies": { - "jquery": ">=1.8.0 <4.0.0" - } - }, - "node_modules/jquery-ui-touch-punch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", - "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" - }, - "node_modules/jquery-ui/node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", - "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", - "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/mermaid": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", - "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre": "^0.8.5", - "dagre-d3": "^0.6.4", - "dompurify": "2.3.6", - "graphlib": "^2.1.8", - "khroma": "^2.0.0", - "moment-mini": "^2.24.0", - "stylis": "^4.0.10" - } - }, - "node_modules/mermaid/node_modules/dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - }, - "node_modules/message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "dependencies": { - "lodash.template": "^4.5.0" - } - }, - "node_modules/meteor-accounts-t9n": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", - "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" - }, - "node_modules/meteor-node-stubs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", - "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", - "bundleDependencies": [ - "assert", - "browserify-zlib", - "buffer", - "console-browserify", - "constants-browserify", - "crypto-browserify", - "domain-browser", - "events", - "https-browserify", - "os-browserify", - "path-browserify", - "process", - "punycode", - "querystring-es3", - "readable-stream", - "stream-browserify", - "stream-http", - "string_decoder", - "timers-browserify", - "tty-browserify", - "url", - "util", - "vm-browserify" - ], - "dependencies": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", - "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/call-bind": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "4.19.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/es-abstract": { - "version": "1.18.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/foreach": { - "version": "2.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-bigints": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-symbols": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/is-arguments": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-bigint": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-callable": { - "version": "1.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-date-object": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-generator-function": { - "version": "1.0.9", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-nan": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-number-object": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-regex": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-string": { - "version": "1.0.6", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-symbol": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-typed-array": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-inspect": { - "version": "1.10.3", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-is": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-keys": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/object.assign": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.12.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/which-typed-array": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "node_modules/mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" - }, - "node_modules/nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "dependencies": { - "path-to-regexp": "~1.2.1" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", - "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "deprecated": "Version no longer supported. Upgrade to @latest", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/puppeteer/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/puppeteer/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simpl-schema": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", - "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", - "dependencies": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "node_modules/sinon": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", - "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", - "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" - }, - "node_modules/summernote": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", - "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", - "hasInstallScript": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "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" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "verror": "1.10.0" - } - }, - "node_modules/vasync/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", @@ -7748,30 +2412,30 @@ "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", "requires": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" }, "dependencies": { "asn1.js": { @@ -8412,13 +3076,6 @@ "xtend": "^4.0.2" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -8435,6 +3092,13 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -9078,8 +3742,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "requires": {} + "dev": true }, "source-map": { "version": "0.6.1", @@ -9110,21 +3773,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -9150,6 +3798,21 @@ } } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", diff --git a/package.json b/package.json index e8393b6a3..cc29fecf5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.25.0", + "version": "v6.26.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index 13d6f83b3..cd1461a15 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.25 + Wekan REST API v6.26 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
          • - Wekan REST API v6.25 + Wekan REST API v6.26
          • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
            -

            Wekan REST API v6.25

            +

            Wekan REST API v6.26

            Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

            diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 6a75dfca3..48a71123b 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.25 + version: v6.26 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 7645e53f8..ad28bce59 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 625, + appVersion = 626, # Increment this for every release. - appMarketingVersion = (defaultText = "6.25.0~2022-05-21"), + appMarketingVersion = (defaultText = "6.26.0~2022-05-21"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 1b46e86bd..c78bf8dcb 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.25' +version: '6.26' summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. From f1482cfa94d0baf53f376d8d5ebc2e00c5e3df70 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 22 May 2022 23:38:13 +0300 Subject: [PATCH 153/246] Updated translations. --- imports/i18n/data/de-CH.i18n.json | 60 +++++++++++++++---------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json index 83d7dd4a7..19ec423ce 100644 --- a/imports/i18n/data/de-CH.i18n.json +++ b/imports/i18n/data/de-CH.i18n.json @@ -135,12 +135,12 @@ "avatar-too-big": "Das Profilbild ist zu gross (520KB max)", "back": "Zurück", "board-change-color": "Farbe ändern", - "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", + "show-at-all-boards-page": "Zeigen auf der Seite \"Alle Boards\"", + "board-info-on-my-boards": "Einstellungen für alle Boards", + "boardInfoOnMyBoardsPopup-title": "Einstellungen für alle Boards", + "boardInfoOnMyBoards-title": "Einstellungen für alle Boards", + "show-card-counter-per-list": "Zeige Kartenanzahl pro Liste", + "show-board_members-avatar": "Zeige Profilbilder der Board-Mitglieder", "board-nb-stars": "%s Sterne", "board-not-found": "Board nicht gefunden", "board-private-info": "Dieses Board wird privat sein.", @@ -288,7 +288,7 @@ "computer": "Computer", "confirm-subtask-delete-popup": "Wollen Sie die Teilaufgabe wirklich löschen?", "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", - "subtaskDeletePopup-title": "Delete Subtask?", + "subtaskDeletePopup-title": "Teilaufgabe löschen?", "checklistDeletePopup-title": "Checkliste löschen?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", @@ -578,8 +578,8 @@ "has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten", "time": "Zeit", "title": "Titel", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "toggle-labels": "Label 1-9 zur Karte hinzufügen. Bei Mehrfachauswahl Label 1-9 hinzufügen", + "remove-labels-multiselect": "Labels 1-9 bei Karten-Mehrfachauswahl entfernen", "tracking": "Folgen", "tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.", "type": "Typ", @@ -707,14 +707,14 @@ "queue": "Warteschlange", "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", - "minicard-settings": "Minicard Settings", + "minicard-settings": "Einstellungen für Minikarte", "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", - "boardMinicardSettingsPopup-title": "Minicard Settings", + "boardMinicardSettingsPopup-title": "Einstellungen für Minikarte", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", "deposit-subtasks-list": "Zielliste für hier abgelegte Teilaufgaben:", "show-parent-in-minicard": "Übergeordnetes Element auf Minikarte anzeigen:", - "description-on-minicard": "Description on minicard", + "description-on-minicard": "Beschreibung auf Minikarte", "prefix-with-full-path": "Vollständiger Pfad über Titel", "prefix-with-parent": "Über Titel", "subtext-with-full-path": "Vollständiger Pfad unter Titel", @@ -892,7 +892,7 @@ "cardAssigneesPopup-title": "Zugewiesen", "addmore-detail": "Eine detailliertere Beschreibung hinzufügen", "show-on-card": "Zeige auf Karte", - "show-on-minicard": "Show on Minicard", + "show-on-minicard": "Anzeigen auf Minikarte", "new": "Neu", "editOrgPopup-title": "Organisation bearbeiten", "newOrgPopup-title": "Neue Organisation", @@ -938,10 +938,10 @@ "card": "Karte", "board": "Board", "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-title": "Meine Kartenansicht", + "myCardsViewChangePopup-title": "Meine Kartenansicht", "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", + "myCardsViewChange-choice-table": "Tabelle", "myCardsSortChange-title": "Meine Karten Sortierung", "myCardsSortChangePopup-title": "Meine Karten Sortierung", "myCardsSortChange-choice-board": "nach Board", @@ -1162,20 +1162,20 @@ "copyChecklist": "Checkliste kopieren", "copyChecklistPopup-title": "Checkliste kopieren", "card-show-lists": "Listen anzeigen", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", + "subtaskActionsPopup-title": "Teilaufgabenaktionen", + "attachmentActionsPopup-title": "Anhang-Aktionen", + "attachment-move-storage-fs": "Verschiebe den Anhang ins Dateisystem", + "attachment-move-storage-gridfs": "Verschiebe den Anhang zu GridFS", + "attachment-move": "Verschiebe den Anhang", + "move-all-attachments-to-fs": "Verschiebe alle Anhänge ins Dateisystem", + "move-all-attachments-to-gridfs": "Verschiebe alle Anhänge zu GridFS", + "move-all-attachments-of-board-to-fs": "Verschiebe alle Anhänge des Boards ins Dateisystem", + "move-all-attachments-of-board-to-gridfs": "Verschiebe alle Anhänge des Boards zu GridFS", + "path": "Pfad", + "version-name": "Versionsname", + "size": "Grösse", + "storage": "Speicher", "action": "Aktion", - "board-title": "Board Title", + "board-title": "Board-Titel", "attachmentRenamePopup-title": "Umbenennen" } \ No newline at end of file From adcc33ed7fe686d46a85da6c11ea448d29e94ca7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 00:50:21 +0300 Subject: [PATCH 154/246] Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board. Thanks to xet7 ! --- client/components/cards/cardDetails.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index f8350a1c0..401f4c6ef 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -212,11 +212,6 @@ BlazeComponent.extendComponent({ //------------- } - if (!Utils.isMiniScreen()) { - Meteor.setTimeout(() => { - this.scrollParentContainer(); - }, 500); - } const $checklistsDom = this.$('.card-checklist-items'); $checklistsDom.sortable({ @@ -440,10 +435,20 @@ BlazeComponent.extendComponent({ 'click .js-maximize-card-details'() { Meteor.call('toggleCardMaximized'); autosize($('.card-details')); + if (!Utils.isMiniScreen()) { + Meteor.setTimeout(() => { + this.scrollParentContainer(); + }, 500); + } }, 'click .js-minimize-card-details'() { Meteor.call('toggleCardMaximized'); autosize($('.card-details')); + if (!Utils.isMiniScreen()) { + Meteor.setTimeout(() => { + this.scrollParentContainer(); + }, 500); + } }, 'click .js-vote'(e) { const forIt = $(e.target).hasClass('js-vote-positive'); From 4b12245537401fd00ea5df4576f45994f09a3fe1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 00:53:17 +0300 Subject: [PATCH 155/246] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 664262df3..8b7ffff32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release fixes the following bugs: + +- [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.26 2022-05-21 WeKan ® release This release adds the following updates: From 4f44c5bf872e369cd89ea0e8791482cc925294d3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 13:39:55 +0300 Subject: [PATCH 156/246] Removed wekan-accounts-sandstorm .test-app directory, that could not be git cloned on Windows. Thanks to xet7 ! --- .../.test-app/.meteor/.finished-upgraders | 17 ---- .../.test-app/.meteor/.gitignore | 1 - .../.test-app/.meteor/.id | 7 -- .../.test-app/.meteor/packages | 31 ------- .../.test-app/.meteor/platforms | 2 - .../.test-app/.meteor/release | 1 - .../.test-app/.meteor/versions | 83 ------------------- .../.test-app/accounts-meteor-test.css | 1 - .../.test-app/accounts-meteor-test.html | 19 ----- .../.test-app/accounts-meteor-test.js | 48 ----------- .../packages/kenton:accounts-sandstorm | 1 - .../.test-app/sandstorm-pkgdef.capnp | 74 ----------------- 12 files changed, 285 deletions(-) delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/.id delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/packages delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/release delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/.meteor/versions delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js delete mode 120000 packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm delete mode 100644 packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders deleted file mode 100644 index 910574ce2..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.finished-upgraders +++ /dev/null @@ -1,17 +0,0 @@ -# This file contains information which helps Meteor properly upgrade your -# app when you run 'meteor update'. You should check it into version control -# with your project. - -notices-for-0.9.0 -notices-for-0.9.1 -0.9.4-platform-file -notices-for-facebook-graph-api-2 -1.2.0-standard-minifiers-package -1.2.0-meteor-platform-split -1.2.0-cordova-changes -1.2.0-breaking-changes -1.3.0-split-minifiers-package -1.4.0-remove-old-dev-bundle-link -1.4.1-add-shell-server-package -1.4.3-split-account-service-packages -1.5-add-dynamic-import-package diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore deleted file mode 100644 index 408303742..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id b/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id deleted file mode 100644 index 2b0fce4e8..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/.id +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains a token that is unique to your project. -# Check it into your repository along with the rest of this directory. -# It can be used for purposes such as: -# - ensuring you don't accidentally deploy one app on top of another -# - providing package authors with aggregated statistics - -1w4v0yxh077n01wrnl8j diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages b/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages deleted file mode 100644 index 68bc73b73..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/packages +++ /dev/null @@ -1,31 +0,0 @@ -# Meteor packages used by this project, one per line. -# Check this file (and the other files in this directory) into your repository. -# -# 'meteor add' and 'meteor remove' will edit this file for you, -# but you can also edit it by hand. - -# List accounts-sandstorm first so that any missing dependencies it has -# are discovered. -kenton:accounts-sandstorm - -# Optional dependency. Should still work commented-out. -accounts-base@1.3.1 - -meteor-base@1.1.0 # Packages every Meteor app needs to have -mobile-experience@1.0.4 # Packages for a great mobile UX -mongo@1.1.19 # The database Meteor supports right now -blaze-html-templates # Compile .html files into Meteor Blaze views -session@1.1.7 # Client-side reactive dictionary for your app -jquery@1.11.10 # Helpful client-side library -tracker@1.1.3 # Meteor's client-side reactive programming library - -es5-shim@4.6.15 # ECMAScript 5 compatibility for older browsers. -ecmascript@0.8.1 # Enable ECMAScript2015+ syntax in app code - -autopublish@1.0.7 # Publish all data to the clients (for prototyping) -insecure@1.0.7 # Allow all DB writes from clients (for prototyping) - -standard-minifier-css -standard-minifier-js -shell-server -dynamic-import diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms b/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms deleted file mode 100644 index efeba1b50..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/platforms +++ /dev/null @@ -1,2 +0,0 @@ -server -browser diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/release b/packages/wekan-accounts-sandstorm/.test-app/.meteor/release deleted file mode 100644 index 1e7fc5b56..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/release +++ /dev/null @@ -1 +0,0 @@ -METEOR@1.5.1 diff --git a/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions b/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions deleted file mode 100644 index c72576ee5..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/.meteor/versions +++ /dev/null @@ -1,83 +0,0 @@ -accounts-base@1.3.1 -allow-deny@1.0.6 -autopublish@1.0.7 -autoupdate@1.3.12 -babel-compiler@6.19.4 -babel-runtime@1.0.1 -base64@1.0.10 -binary-heap@1.0.10 -blaze@2.3.2 -blaze-html-templates@1.1.2 -blaze-tools@1.0.10 -boilerplate-generator@1.1.1 -caching-compiler@1.1.9 -caching-html-compiler@1.1.2 -callback-hook@1.0.10 -check@1.2.5 -ddp@1.3.0 -ddp-client@2.0.0 -ddp-common@1.2.9 -ddp-rate-limiter@1.0.7 -ddp-server@2.0.0 -deps@1.0.12 -diff-sequence@1.0.7 -dynamic-import@0.1.1 -ecmascript@0.8.2 -ecmascript-runtime@0.4.1 -ecmascript-runtime-client@0.4.3 -ecmascript-runtime-server@0.4.1 -ejson@1.0.13 -es5-shim@4.6.15 -fastclick@1.0.13 -geojson-utils@1.0.10 -hot-code-push@1.0.4 -html-tools@1.0.11 -htmljs@1.0.11 -http@1.2.12 -id-map@1.0.9 -insecure@1.0.7 -jquery@1.11.10 -kenton:accounts-sandstorm@0.7.0 -launch-screen@1.1.1 -livedata@1.0.18 -localstorage@1.1.1 -logging@1.1.17 -meteor@1.7.1 -meteor-base@1.1.0 -minifier-css@1.2.16 -minifier-js@2.1.1 -minimongo@1.2.1 -mobile-experience@1.0.4 -mobile-status-bar@1.0.14 -modules@0.9.4 -modules-runtime@0.8.0 -mongo@1.1.22 -mongo-id@1.0.6 -npm-mongo@2.2.30 -observe-sequence@1.0.16 -ordered-dict@1.0.9 -promise@0.8.9 -random@1.0.10 -rate-limit@1.0.8 -reactive-dict@1.1.9 -reactive-var@1.0.11 -reload@1.1.11 -retry@1.0.9 -routepolicy@1.0.12 -service-configuration@1.0.11 -session@1.1.7 -shell-server@0.2.4 -spacebars@1.0.15 -spacebars-compiler@1.1.3 -standard-minifier-css@1.3.4 -standard-minifier-js@2.1.1 -templating@1.3.2 -templating-compiler@1.3.2 -templating-runtime@1.3.2 -templating-tools@1.1.2 -tracker@1.1.3 -ui@1.0.13 -underscore@1.0.10 -url@1.1.0 -webapp@1.3.17 -webapp-hashing@1.0.9 diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css deleted file mode 100644 index b6b4052b4..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.css +++ /dev/null @@ -1 +0,0 @@ -/* CSS declarations go here */ diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html deleted file mode 100644 index c7ce7638b..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.html +++ /dev/null @@ -1,19 +0,0 @@ - - accounts-meteor-test - - - -

            Welcome to Meteor!

            - - {{> hello}} - - - diff --git a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js b/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js deleted file mode 100644 index 9e5539e45..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/accounts-meteor-test.js +++ /dev/null @@ -1,48 +0,0 @@ -if (Meteor.isClient) { - var Info = new Mongo.Collection("info"); - var Counter = new Mongo.Collection("counter"); - - Template.hello.onCreated(function () { - Meteor.subscribe("info"); - Meteor.subscribe("counter"); - }); - - Template.hello.helpers({ - counter: function () { - if (!Template.instance().subscriptionsReady()) return "not ready"; - return Counter.findOne("counter").counter; - }, - - serverInfo: function () { - var obj = Info.findOne("info"); - console.log("server", Meteor.loggingIn && Meteor.loggingIn(), obj); - return JSON.stringify(obj, null, 2); - }, - - clientInfo: function () { - var obj = Meteor.sandstormUser(); - console.log("client", Meteor.loggingIn && Meteor.loggingIn(), obj); - return JSON.stringify(obj, null, 2); - }, - }); -} - -if (Meteor.isServer) { - Meteor.startup(function () { - // code to run on server at startup - }); - - Meteor.publish("info", function () { - var user = Meteor.users && this.userId && Meteor.users.findOne(this.userId); - this.added("info", "info", {userId: this.userId, user: user, sandstormUser: this.connection.sandstormUser(), - sessionId: this.connection.sandstormSessionId(), - tabId: this.connection.sandstormTabId()}); - this.ready(); - }); - - var counter = 0; - Meteor.publish("counter", function () { - this.added("counter", "counter", {counter: counter++}); - this.ready(); - }); -} diff --git a/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm b/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm deleted file mode 120000 index c25bddb6d..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/packages/kenton:accounts-sandstorm +++ /dev/null @@ -1 +0,0 @@ -../.. \ No newline at end of file diff --git a/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp b/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp deleted file mode 100644 index a2df64a0c..000000000 --- a/packages/wekan-accounts-sandstorm/.test-app/sandstorm-pkgdef.capnp +++ /dev/null @@ -1,74 +0,0 @@ -@0xb412d6a17c04e5cc; - -using Spk = import "/sandstorm/package.capnp"; - -const pkgdef :Spk.PackageDefinition = ( - id = "y49n7yrxk6p3ud1hkgeup1mah6f7a488nancvay7v6y1wxq78cn0", - - manifest = ( - appTitle = (defaultText = "Meteor Accounts Test App"), - appVersion = 0, - appMarketingVersion = (defaultText = "0.0.0"), - actions = [ - ( title = (defaultText = "New Test"), - command = .myCommand - ) - ], - - continueCommand = .myCommand, - ), - - sourceMap = ( - searchPath = [ - ( sourcePath = ".meteor-spk/deps" ), - ( sourcePath = ".meteor-spk/bundle" ) - ] - ), - - alwaysInclude = [ "." ], - - bridgeConfig = ( - viewInfo = ( - permissions = [ - ( - name = "editor", - title = (defaultText = "editor"), - description = (defaultText = "grants ability to modify data"), - ), - ( - name = "commenter", - title = (defaultText = "commenter"), - description = (defaultText = "grants ability to modify data"), - ), - ], - roles = [ - ( - title = (defaultText = "editor"), - permissions = [true, true], - verbPhrase = (defaultText = "can edit"), - description = (defaultText = "editors may view all site data and change settings."), - ), - ( - title = (defaultText = "commenter"), - permissions = [false, true], - verbPhrase = (defaultText = "can comment"), - description = (defaultText = "viewers may view what other users have written."), - ), - ( - title = (defaultText = "viewer"), - permissions = [false, false], - verbPhrase = (defaultText = "can view"), - description = (defaultText = "viewers may view what other users have written."), - ), - ], - ), - ), -); - -const myCommand :Spk.Manifest.Command = ( - argv = ["/sandstorm-http-bridge", "4000", "--", "node", "start.js"], - environ = [ - (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), - (key = "SANDSTORM", value = "1"), - ] -); From 8efc8605a1d3880eb45abbb8ef811b9602d79b5a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 14:09:07 +0300 Subject: [PATCH 157/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b7ffff32..82211d346 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This release fixes the following bugs: - [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7). Thanks to xet7. +- [Removed wekan-accounts-sandstorm .test-app directory, that could not be git cloned on Windows](https://github.com/wekan/wekan/commit/4f44c5bf872e369cd89ea0e8791482cc925294d3). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 3b419848d1b7a7f421db3662d860dcea1ea6af1c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 22:32:45 +0300 Subject: [PATCH 158/246] Try to fix Snap. Thanks to xet7 ! Related #4524, related #4423 --- snapcraft.yaml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index c78bf8dcb..e77810347 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,6 @@ name: wekan version: '6.26' +base: core20 summary: Open Source kanban description: | WeKan ® is an Open Source and collaborative kanban board application. @@ -64,9 +65,12 @@ apps: parts: mongodb: - source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.22.tgz + source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-5.0.8.tgz plugin: dump - stage-packages: [libssl1.0.0] + stage-packages: + - libssl1.1 + - libcurl3-dev + - libcurl4-openssl-dev filesets: mongo: - usr @@ -79,18 +83,18 @@ parts: wekan: source: . - plugin: nodejs - node-engine: 14.19.3 - node-packages: - - node-gyp - - node-pre-gyp - - fibers + plugin: npm + npm-node-version: 14.19.3 + #npm-packages: + # - node-gyp + # - node-pre-gyp + # - fibers build-packages: - build-essential - ca-certificates - apt-utils - - python -# - python3 +# - python + - python3 - g++ - capnproto - curl From d95436df5125048da5e8ea76c8e8fae3d360debb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 22:34:39 +0300 Subject: [PATCH 159/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82211d346..e1a10c7bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ This release fixes the following bugs: Thanks to xet7. - [Removed wekan-accounts-sandstorm .test-app directory, that could not be git cloned on Windows](https://github.com/wekan/wekan/commit/4f44c5bf872e369cd89ea0e8791482cc925294d3). Thanks to xet7. +- [Try to fix Snap](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From e50d69cfb78e5f0150e96cc90337255ccbd59e76 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 22:57:36 +0300 Subject: [PATCH 160/246] Try to fix Snap. Part 2. Thanks to xet7 ! --- snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index e77810347..22f0df48a 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -93,8 +93,8 @@ parts: - build-essential - ca-certificates - apt-utils -# - python - - python3 + - python2 +# - python3 - g++ - capnproto - curl From 0ae8de4c042f63d1b1662aca9c6cf2fcacc7eb67 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 22:58:45 +0300 Subject: [PATCH 161/246] Updated ChangeLog. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a10c7bc..0b2e2788b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,9 @@ This release fixes the following bugs: Thanks to xet7. - [Removed wekan-accounts-sandstorm .test-app directory, that could not be git cloned on Windows](https://github.com/wekan/wekan/commit/4f44c5bf872e369cd89ea0e8791482cc925294d3). Thanks to xet7. -- [Try to fix Snap](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c). +- Try to fix Snap. + [Part 1](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c), + [Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76), Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From ea66eca60ddbf7127c9fbed9ab41df52542ad279 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 23:22:00 +0300 Subject: [PATCH 162/246] Try to fix Snap. Part 3: Added --unsafe-perm to npm install. Thanks to xet7 ! Related https://github.com/wekan/wekan/issues/4505#issuecomment-1135101672 --- snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index 22f0df48a..1ea39ddfd 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -115,14 +115,14 @@ parts: rm install_meteor.sh rm -rf .build chmod u+w *.json - npm install + npm install --unsafe-perm meteor build .build --directory --allow-superuser # Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. rm -rf .build/bundle/programs/web.browser.legacy # Change to directory .build/bundle/programs/server cd .build/bundle/programs/server chmod u+w *.json - npm install + npm install --unsafe-perm cd node_modules/fibers node build.js cd ../../../../../.. From 7640c7c04def9520c0b0cedf6ffdac4559b6ee4c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 23:23:34 +0300 Subject: [PATCH 163/246] Updated ChangeLog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b2e2788b..b8f00cc3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This release fixes the following bugs: - Try to fix Snap. [Part 1](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c), [Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76), + [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 9ca26d22d0c2c9bee792e50ff203a5c18c9d556b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 23:44:16 +0300 Subject: [PATCH 164/246] Try to fix Snap. Part 4. Thanks to xet7 ! --- snapcraft.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index 1ea39ddfd..b4114813e 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -93,8 +93,8 @@ parts: - build-essential - ca-certificates - apt-utils - - python2 -# - python3 +# - python2 + - python3 - g++ - capnproto - curl @@ -108,6 +108,13 @@ parts: echo "Cleaning environment first" rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules rm -rf .build + echo "Using http npm packages so speedup install process https://stackoverflow.com/questions/39760113/callback-called-more-than-once-while-running-npm-install" + echo "registry=http://registry.npmjs.org/" > ~/.npmrc + echo "Installing npm, node-gyp, node-pre-gyp, fibers" + npm -g install npm --unsafe-perm + npm -g install node-gyp --unsafe-perm + npm -g install node-pre-gyp --unsafe-perm + npm -g install fibers --unsafe-perm echo "Installing meteor" curl https://install.meteor.com/ -o install_meteor.sh chmod +x install_meteor.sh From 3db14ad03a1b0ea83dc6d48e083a7f690208dd23 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 23 May 2022 23:45:16 +0300 Subject: [PATCH 165/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8f00cc3f..0cce2bb6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,8 @@ This release fixes the following bugs: - Try to fix Snap. [Part 1](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c), [Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76), - [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279). + [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279), + [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From fac1ba5952f763d257b04a934e3407f9b1d1d37a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:01:13 +0300 Subject: [PATCH 166/246] Try to fix Snap. Part 5. Thanks to xet7 ! --- snapcraft.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index b4114813e..4ad0ceb1b 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -108,10 +108,11 @@ parts: echo "Cleaning environment first" rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules rm -rf .build - echo "Using http npm packages so speedup install process https://stackoverflow.com/questions/39760113/callback-called-more-than-once-while-running-npm-install" - echo "registry=http://registry.npmjs.org/" > ~/.npmrc - echo "Installing npm, node-gyp, node-pre-gyp, fibers" - npm -g install npm --unsafe-perm + #echo "Using http npm packages so speedup install process https://stackoverflow.com/questions/39760113/callback-called-more-than-once-while-running-npm-install" + #echo "registry=http://registry.npmjs.org/" > ~/.npmrc + #echo "Installing npm, node-gyp, node-pre-gyp, fibers" + npm -g install n --unsafe-perm + n 14.19.3 npm -g install node-gyp --unsafe-perm npm -g install node-pre-gyp --unsafe-perm npm -g install fibers --unsafe-perm From 6d7e69cc9f35aa5d9edb81a3f4cce50c5c6cec40 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:02:19 +0300 Subject: [PATCH 167/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cce2bb6c..8db273e60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ This release fixes the following bugs: [Part 1](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c), [Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76), [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279), - [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b). + [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b), + [Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From f2815a90393418dea88aa49ee74c6af91fafe96d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:14:12 +0300 Subject: [PATCH 168/246] Try to fix Snap. Part 6. Thanks to xet7 ! --- snapcraft.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index 4ad0ceb1b..62dc292eb 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -111,11 +111,11 @@ parts: #echo "Using http npm packages so speedup install process https://stackoverflow.com/questions/39760113/callback-called-more-than-once-while-running-npm-install" #echo "registry=http://registry.npmjs.org/" > ~/.npmrc #echo "Installing npm, node-gyp, node-pre-gyp, fibers" - npm -g install n --unsafe-perm - n 14.19.3 - npm -g install node-gyp --unsafe-perm - npm -g install node-pre-gyp --unsafe-perm - npm -g install fibers --unsafe-perm + #npm -g install n --unsafe-perm + #n 14.19.3 + #npm -g install node-gyp --unsafe-perm + #npm -g install node-pre-gyp --unsafe-perm + #npm -g install fibers --unsafe-perm echo "Installing meteor" curl https://install.meteor.com/ -o install_meteor.sh chmod +x install_meteor.sh From 6ad83bcaebb72aa8d45787f1bf1b3de645b4c9f6 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:15:29 +0300 Subject: [PATCH 169/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8db273e60..d7ab5f6c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,8 @@ This release fixes the following bugs: [Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76), [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279), [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b), - [Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a). + [Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a), + [Part 6](https://github.com/wekan/wekan/commit/f2815a90393418dea88aa49ee74c6af91fafe96d). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 2587e2f00ae27742893e48e98845a3139e3f3a02 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:32:20 +0300 Subject: [PATCH 170/246] Try to fix Snap. Part 7. Thanks to xet7 ! --- snapcraft.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index 62dc292eb..ba79ea75d 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -117,10 +117,11 @@ parts: #npm -g install node-pre-gyp --unsafe-perm #npm -g install fibers --unsafe-perm echo "Installing meteor" - curl https://install.meteor.com/ -o install_meteor.sh - chmod +x install_meteor.sh - sh install_meteor.sh - rm install_meteor.sh + #curl https://install.meteor.com/ -o install_meteor.sh + #chmod +x install_meteor.sh + #sh install_meteor.sh + #rm install_meteor.sh + npm -g install meteor --unsafe-perm rm -rf .build chmod u+w *.json npm install --unsafe-perm From 0b797ceb7ee0a7bfa2978bf8b34aeeb8b5574d19 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:33:06 +0300 Subject: [PATCH 171/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7ab5f6c7..d7c6661d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,8 @@ This release fixes the following bugs: [Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279), [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b), [Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a), - [Part 6](https://github.com/wekan/wekan/commit/f2815a90393418dea88aa49ee74c6af91fafe96d). + [Part 6](https://github.com/wekan/wekan/commit/f2815a90393418dea88aa49ee74c6af91fafe96d), + [Part 7](https://github.com/wekan/wekan/commit/2587e2f00ae27742893e48e98845a3139e3f3a02). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 693a49f85200adcf81f5cf0ea56c7dd795757988 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:46:41 +0300 Subject: [PATCH 172/246] Try to fix Snap. Part 8. Thanks to xet7 ! --- snapcraft.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index ba79ea75d..da235a319 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -117,11 +117,11 @@ parts: #npm -g install node-pre-gyp --unsafe-perm #npm -g install fibers --unsafe-perm echo "Installing meteor" - #curl https://install.meteor.com/ -o install_meteor.sh - #chmod +x install_meteor.sh - #sh install_meteor.sh - #rm install_meteor.sh - npm -g install meteor --unsafe-perm + curl https://install.meteor.com/ -o install_meteor.sh + chmod +x install_meteor.sh + sh install_meteor.sh + rm install_meteor.sh + #npm -g install meteor --unsafe-perm --allow-superuser rm -rf .build chmod u+w *.json npm install --unsafe-perm From 4226a0bc37691f8c05da0e8989c3254be76a9608 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 24 May 2022 00:47:35 +0300 Subject: [PATCH 173/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7c6661d4..fcea366d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ This release fixes the following bugs: [Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b), [Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a), [Part 6](https://github.com/wekan/wekan/commit/f2815a90393418dea88aa49ee74c6af91fafe96d), - [Part 7](https://github.com/wekan/wekan/commit/2587e2f00ae27742893e48e98845a3139e3f3a02). + [Part 7](https://github.com/wekan/wekan/commit/2587e2f00ae27742893e48e98845a3139e3f3a02), + [Part 8](https://github.com/wekan/wekan/commit/693a49f85200adcf81f5cf0ea56c7dd795757988). Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From c6331830d49f93402a9efa92101af58df0ab992c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 28 May 2022 22:38:17 +0300 Subject: [PATCH 174/246] Updated translations. --- imports/i18n/data/de.i18n.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index 02a7310b1..58d435e19 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -137,8 +137,8 @@ "board-change-color": "Farbe ändern", "show-at-all-boards-page": "Zeige auf \"Alle Boards\" Seite", "board-info-on-my-boards": "\"Alle Boards\" Einstellungen", - "boardInfoOnMyBoardsPopup-title": "\"Alle Boards\" Einstellungen", - "boardInfoOnMyBoards-title": "\"Alle Boards\" Einstellungen", + "boardInfoOnMyBoardsPopup-title": "Einstellungen für Alle Boards", + "boardInfoOnMyBoards-title": "Einstellungen für Alle Boards", "show-card-counter-per-list": "Zeige Kartenanzahl pro Liste", "show-board_members-avatar": "Zeige Profilbilder der Board-Mitglieder", "board-nb-stars": "%s Sterne", @@ -1158,7 +1158,7 @@ "checklistActionsPopup-title": "Checklistenaktionen", "moveChecklist": "Checkliste verschieben", "moveChecklistPopup-title": "Checkliste verschieben", - "newlineBecomesNewChecklistItem": "Neue Zeile wird ein neues Checklistenelement", + "newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag", "copyChecklist": "Checkliste kopieren", "copyChecklistPopup-title": "Checkliste kopieren", "card-show-lists": "Listen anzeigen", From 25e50e3908a52a7bac61f8b939ad7c78cbd79060 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 28 May 2022 22:58:04 +0300 Subject: [PATCH 175/246] Upgraded to Meteor 2.7.3-beta.0 . Thanks to Meteor developers ! --- .meteor/release | 2 +- package-lock.json | 5698 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 5568 insertions(+), 132 deletions(-) diff --git a/.meteor/release b/.meteor/release index 22462328f..a85b5f5a3 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.2 +METEOR@2.7.3-beta.0 diff --git a/package-lock.json b/package-lock.json index de8c66013..59cd3e4c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,5394 @@ { "name": "wekan", "version": "v6.26.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "wekan", + "version": "v6.26.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/runtime": "^7.15.4", + "@mapbox/node-pre-gyp": "^1.0.8", + "@wekanteam/markdown-it-mermaid": "^0.5.4", + "ajv": "^6.12.6", + "babel-runtime": "^6.26.0", + "bcryptjs": "^2.4.3", + "bson": "^4.5.2", + "bunyan": "^1.8.15", + "core-js": "^3.18.2", + "dompurify": "^2.3.2", + "es6-promise": "^4.2.4", + "escape-string-regexp": "^5.0.0", + "exceljs": "^4.2.1", + "fibers": "^5.0.0", + "i18next": "^21.6.16", + "i18next-sprintf-postprocessor": "^0.2.2", + "jQuery": "^1.7.4", + "jquery-ui": "^1.13.0", + "jquery-ui-touch-punch": "^0.2.3", + "jszip": "^3.7.1", + "ldapjs": "^2.3.1", + "markdown-it": "^12.3.2", + "markdown-it-emoji": "^2.0.0", + "meteor-accounts-t9n": "^2.6.0", + "meteor-node-stubs": "^1.1.0", + "moment": "^2.29.3", + "mongodb": "^3.7.3", + "nodemailer": "^6.6.3", + "os": "^0.1.2", + "page": "^1.11.6", + "papaparse": "^5.3.1", + "qs": "^6.10.1", + "simpl-schema": "^1.12.0", + "source-map-support": "^0.5.20", + "summernote": "^0.8.20", + "uuid": "^8.3.2" + }, + "devDependencies": { + "babel-plugin-istanbul": "^6.1.1", + "chai": "^4.3.6", + "chai-as-promised": "^7.1.1", + "flatted": "^3.2.2", + "puppeteer": "^1.20.0", + "sinon": "^13.0.2", + "sinon-chai": "^3.7.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "dependencies": { + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz", + "integrity": "sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", + "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", + "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" + }, + "node_modules/@wekanteam/cli-table3": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", + "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", + "dependencies": { + "string-width": "^5.1.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@wekanteam/markdown-it-mermaid": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", + "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", + "dependencies": { + "@wekanteam/cli-table3": "^0.7.6", + "mermaid": "^9.0.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js": { + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", + "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", + "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "dependencies": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/dagre-d3/node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/dagre-d3/node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/dagre-d3/node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/dagre-d3/node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/dagre-d3/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/dagre-d3/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/dagre-d3/node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/dagre-d3/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/dagre-d3/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/dagre-d3/node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "node_modules/dagre-d3/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/dagre-d3/node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/dagre-d3/node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/dagre-d3/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/dagre-d3/node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre-d3/node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", + "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.141", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", + "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fibers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", + "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fibers/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/i18next": { + "version": "21.8.4", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.4.tgz", + "integrity": "sha512-b3LQ5n9V1juu8UItb5x1QTI4OTvNqsNs/wetwQlBvfijEqks+N5HKMKSoevf8w0/RGUrDQ7g4cvVzF8WBp9pUw==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, + "node_modules/i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jQuery": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", + "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=", + "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/jquery-ui": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" + }, + "node_modules/jquery-ui/node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", + "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mermaid": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", + "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "d3": "^7.0.0", + "dagre": "^0.8.5", + "dagre-d3": "^0.6.4", + "dompurify": "2.3.6", + "graphlib": "^2.1.8", + "khroma": "^2.0.0", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" + } + }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + }, + "node_modules/message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "dependencies": { + "lodash.template": "^4.5.0" + } + }, + "node_modules/meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, + "node_modules/meteor-node-stubs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", + "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", + "bundleDependencies": [ + "assert", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "crypto-browserify", + "domain-browser", + "events", + "https-browserify", + "os-browserify", + "path-browserify", + "process", + "punycode", + "querystring-es3", + "readable-stream", + "stream-browserify", + "stream-http", + "string_decoder", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ], + "dependencies": { + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", + "elliptic": "^6.5.4", + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/assert": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/bn.js": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/brorand": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/browserify-aes": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-des": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-sign": { + "version": "4.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer-xor": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/call-bind": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/cipher-base": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/console-browserify": { + "version": "1.2.0", + "inBundle": true + }, + "node_modules/meteor-node-stubs/node_modules/constants-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-hash": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-hmac": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { + "version": "3.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/define-properties": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/des.js": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { + "version": "5.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/domain-browser": { + "version": "4.19.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic": { + "version": "6.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/es-abstract": { + "version": "1.18.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/foreach": { + "version": "2.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-bigints": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-symbols": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash-base": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash.js": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/https-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/meteor-node-stubs/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/is-arguments": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-bigint": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-callable": { + "version": "1.2.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-date-object": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-generator-function": { + "version": "1.0.9", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-nan": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-number-object": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-regex": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-string": { + "version": "1.0.6", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-typed-array": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/md5.js": { + "version": "1.3.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/object-inspect": { + "version": "1.10.3", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-is": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-keys": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/object.assign": { + "version": "4.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/os-browserify": { + "version": "0.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pako": { + "version": "1.0.11", + "inBundle": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/meteor-node-stubs/node_modules/parse-asn1": { + "version": "5.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/path-browserify": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pbkdf2": { + "version": "3.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/meteor-node-stubs/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt": { + "version": "4.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/punycode": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/querystring": { + "version": "0.2.0", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring-es3": { + "version": "0.2.1", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/randombytes": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/randomfill": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/meteor-node-stubs/node_modules/ripemd160": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/setimmediate": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/sha.js": { + "version": "2.4.11", + "inBundle": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-browserify": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-http": { + "version": "3.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/timers-browserify": { + "version": "2.0.12", + "inBundle": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/tty-browserify": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/url": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/util": { + "version": "0.12.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/vm-browserify": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/which-typed-array": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/xtend": { + "version": "4.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "node_modules/mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, + "node_modules/mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + }, + "node_modules/nodemailer": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "deprecated": "Version no longer supported. Upgrade to @latest", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/puppeteer/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/puppeteer/node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simpl-schema": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.1.tgz", + "integrity": "sha512-7ohENS5WHVsCSOFwGS9887QyiThGSC5NIf4yPBVt1fImYmL2lHsH1h59M/F5OmdQW6kQd6+BME6pMpurTLIq5A==", + "dependencies": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, + "node_modules/sinon": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", + "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", + "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" + }, + "node_modules/summernote": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", + "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", + "hasInstallScript": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "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" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.10.0" + } + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", @@ -27,20 +5413,20 @@ "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" }, "@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", + "@babel/helpers": "^7.18.2", "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -49,11 +5435,11 @@ } }, "@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "requires": { - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -71,9 +5457,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "requires": { "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", @@ -82,12 +5468,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" }, "@babel/helper-function-name": { "version": "7.17.9", @@ -136,11 +5519,11 @@ "dev": true }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" } }, "@babel/helper-split-export-declaration": { @@ -162,13 +5545,13 @@ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { @@ -182,14 +5565,14 @@ } }, "@babel/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz", + "integrity": "sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==" }, "@babel/runtime": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", - "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -205,26 +5588,26 @@ } }, "@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", + "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -666,6 +6049,11 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -675,6 +6063,11 @@ "concat-map": "0.0.1" } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, "browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -751,9 +6144,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==" + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==" }, "chai": { "version": "4.3.6", @@ -800,7 +6193,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" } } }, @@ -818,7 +6211,7 @@ "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, "color-convert": { "version": "1.9.3", @@ -831,7 +6224,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "color-support": { "version": "1.1.3", @@ -857,7 +6250,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", @@ -906,7 +6299,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "convert-source-map": { "version": "1.8.0", @@ -917,14 +6310,14 @@ } }, "core-js": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", - "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==" + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "crc-32": { "version": "1.2.2", @@ -1535,7 +6928,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "denque": { "version": "1.5.1", @@ -1548,9 +6941,9 @@ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true }, "dompurify": { @@ -1570,7 +6963,7 @@ "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "requires": { "readable-stream": "^2.0.2" }, @@ -1610,9 +7003,22 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" + "version": "1.4.141", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", + "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==" + }, + "elliptic": { + "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } }, "emoji-regex": { "version": "9.2.2", @@ -1640,7 +7046,7 @@ "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dev": true, "requires": { "es6-promise": "^4.0.3" @@ -1734,7 +7140,7 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "requires": { "pend": "~1.2.0" @@ -1751,7 +7157,7 @@ "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" } } }, @@ -1787,7 +7193,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fstream": { "version": "1.0.12", @@ -1929,6 +7335,25 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -1939,9 +7364,9 @@ } }, "i18next": { - "version": "21.8.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.3.tgz", - "integrity": "sha512-I6QEXu096oaNH8h+hs2eHu6hxtWPdb/rsoRFHmFep01uuwB0h86ckXaT14ladhstWenEScsxiAQ2TW9fmDG57Q==", + "version": "21.8.4", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.4.tgz", + "integrity": "sha512-b3LQ5n9V1juu8UItb5x1QTI4OTvNqsNs/wetwQlBvfijEqks+N5HKMKSoevf8w0/RGUrDQ7g4cvVzF8WBp9pUw==", "requires": { "@babel/runtime": "^7.17.2" } @@ -2412,30 +7837,30 @@ "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", "requires": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", "elliptic": "^6.5.4", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" }, "dependencies": { "asn1.js": { @@ -3076,6 +8501,13 @@ "xtend": "^4.0.2" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -3092,13 +8524,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -3190,6 +8615,16 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3304,9 +8739,9 @@ } }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "optional": true }, "ncp": { @@ -3348,9 +8783,9 @@ } }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "nodemailer": { "version": "6.7.5", @@ -3387,9 +8822,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "once": { "version": "1.4.0", @@ -3698,9 +9133,9 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simpl-schema": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.0.tgz", - "integrity": "sha512-lzXC3L8jJbPhNXGR3cjlyIauqqrC5WUJS4O34Ym/wLIvb8K3ZieK+1OfTzs4mBpDc3Y8u53gQFAr1X37DmTcEg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.1.tgz", + "integrity": "sha512-7ohENS5WHVsCSOFwGS9887QyiThGSC5NIf4yPBVt1fImYmL2lHsH1h59M/F5OmdQW6kQd6+BME6pMpurTLIq5A==", "requires": { "clone": "^2.1.2", "message-box": "^0.2.7", @@ -3742,7 +9177,8 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true + "dev": true, + "requires": {} }, "source-map": { "version": "0.6.1", @@ -3773,6 +9209,21 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3798,21 +9249,6 @@ } } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", From 9382c2cd048cf6846e5b4b44a08c9e113a5e4ca8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 28 May 2022 23:10:25 +0300 Subject: [PATCH 176/246] v6.27 --- CHANGELOG.md | 9 +++++++-- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 10 files changed, 19 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcea366d6..1f68730fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,13 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.27 2022-05-28 WeKan ® release -This release fixes the following bugs: +This release adds the following updates: + +- [Upgraded to Meteor 2.7.3-beta.0](https://github.com/wekan/wekan/commit/25e50e3908a52a7bac61f8b939ad7c78cbd79060). + Thanks to Meteor developers. + +and fixes the following bugs: - [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7). Thanks to xet7. diff --git a/Stackerfile.yml b/Stackerfile.yml index 3fe1def23..00ed638af 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.26.0" +appVersion: "v6.27.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index 29b5f4b0c..dabb5d93d 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.26" +appVersion: "6.27" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 26f036ec1..1b5215bd2 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.26 + tag: v6.27 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index 59cd3e4c7..462a38a57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.26.0", + "version": "v6.27.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index cc29fecf5..4f7a85026 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.26.0", + "version": "v6.27.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index cd1461a15..78905fbed 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v6.26 + Wekan REST API v6.27 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
            • - Wekan REST API v6.26 + Wekan REST API v6.27
            • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
              -

              Wekan REST API v6.26

              +

              Wekan REST API v6.27

              Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

              diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 48a71123b..04bcdfc89 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.26 + version: v6.27 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index ad28bce59..82f391cb3 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 626, + appVersion = 627, # Increment this for every release. - appMarketingVersion = (defaultText = "6.26.0~2022-05-21"), + appMarketingVersion = (defaultText = "6.27.0~2022-05-28"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index da235a319..6a4bfcbba 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.26' +version: '6.27' base: core20 summary: Open Source kanban description: | From 1c71baec81e39f03043117ffd46224ff5de409a3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 28 May 2022 23:17:03 +0300 Subject: [PATCH 177/246] Update package-lock.json --- package-lock.json | 5533 +-------------------------------------------- 1 file changed, 47 insertions(+), 5486 deletions(-) diff --git a/package-lock.json b/package-lock.json index 462a38a57..44b1db5ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5394 +1,8 @@ { "name": "wekan", "version": "v6.27.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "wekan", - "version": "v6.26.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.4", - "ajv": "^6.12.6", - "babel-runtime": "^6.26.0", - "bcryptjs": "^2.4.3", - "bson": "^4.5.2", - "bunyan": "^1.8.15", - "core-js": "^3.18.2", - "dompurify": "^2.3.2", - "es6-promise": "^4.2.4", - "escape-string-regexp": "^5.0.0", - "exceljs": "^4.2.1", - "fibers": "^5.0.0", - "i18next": "^21.6.16", - "i18next-sprintf-postprocessor": "^0.2.2", - "jQuery": "^1.7.4", - "jquery-ui": "^1.13.0", - "jquery-ui-touch-punch": "^0.2.3", - "jszip": "^3.7.1", - "ldapjs": "^2.3.1", - "markdown-it": "^12.3.2", - "markdown-it-emoji": "^2.0.0", - "meteor-accounts-t9n": "^2.6.0", - "meteor-node-stubs": "^1.1.0", - "moment": "^2.29.3", - "mongodb": "^3.7.3", - "nodemailer": "^6.6.3", - "os": "^0.1.2", - "page": "^1.11.6", - "papaparse": "^5.3.1", - "qs": "^6.10.1", - "simpl-schema": "^1.12.0", - "source-map-support": "^0.5.20", - "summernote": "^0.8.20", - "uuid": "^8.3.2" - }, - "devDependencies": { - "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.6", - "chai-as-promised": "^7.1.1", - "flatted": "^3.2.2", - "puppeteer": "^1.20.0", - "sinon": "^13.0.2", - "sinon-chai": "^3.7.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", - "dependencies": { - "@babel/types": "^7.18.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz", - "integrity": "sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", - "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", - "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" - }, - "node_modules/@wekanteam/cli-table3": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", - "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", - "dependencies": { - "string-width": "^5.1.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@wekanteam/markdown-it-mermaid": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", - "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", - "dependencies": { - "@wekanteam/cli-table3": "^0.7.6", - "mermaid": "^9.0.1" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "3.22.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", - "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", - "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "3", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/dagre-d3/node_modules/d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/dagre-d3/node_modules/d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "node_modules/dagre-d3/node_modules/d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/dagre-d3/node_modules/d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/dagre-d3/node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/dagre-d3/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "node_modules/dagre-d3/node_modules/d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "dependencies": { - "d3-dsv": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/dagre-d3/node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/dagre-d3/node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/dagre-d3/node_modules/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "node_modules/dagre-d3/node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/dagre-d3/node_modules/d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "node_modules/dagre-d3/node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "node_modules/dagre-d3/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/dagre-d3/node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/dagre-d3/node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dayjs": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", - "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dompurify": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", - "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.141", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", - "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exceljs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", - "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", - "dependencies": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fibers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", - "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fibers/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/i18next": { - "version": "21.8.4", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.4.tgz", - "integrity": "sha512-b3LQ5n9V1juu8UItb5x1QTI4OTvNqsNs/wetwQlBvfijEqks+N5HKMKSoevf8w0/RGUrDQ7g4cvVzF8WBp9pUw==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" - } - }, - "node_modules/i18next-sprintf-postprocessor": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", - "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jQuery": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", - "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=", - "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/jquery-ui": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", - "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", - "dependencies": { - "jquery": ">=1.8.0 <4.0.0" - } - }, - "node_modules/jquery-ui-touch-punch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", - "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" - }, - "node_modules/jquery-ui/node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", - "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", - "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/mermaid": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", - "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre": "^0.8.5", - "dagre-d3": "^0.6.4", - "dompurify": "2.3.6", - "graphlib": "^2.1.8", - "khroma": "^2.0.0", - "moment-mini": "^2.24.0", - "stylis": "^4.0.10" - } - }, - "node_modules/mermaid/node_modules/dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - }, - "node_modules/message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "dependencies": { - "lodash.template": "^4.5.0" - } - }, - "node_modules/meteor-accounts-t9n": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", - "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" - }, - "node_modules/meteor-node-stubs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", - "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", - "bundleDependencies": [ - "assert", - "browserify-zlib", - "buffer", - "console-browserify", - "constants-browserify", - "crypto-browserify", - "domain-browser", - "events", - "https-browserify", - "os-browserify", - "path-browserify", - "process", - "punycode", - "querystring-es3", - "readable-stream", - "stream-browserify", - "stream-http", - "string_decoder", - "timers-browserify", - "tty-browserify", - "url", - "util", - "vm-browserify" - ], - "dependencies": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", - "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/call-bind": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "4.19.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/es-abstract": { - "version": "1.18.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/foreach": { - "version": "2.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-bigints": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-symbols": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/is-arguments": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-bigint": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-callable": { - "version": "1.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-date-object": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-generator-function": { - "version": "1.0.9", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-nan": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-number-object": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-regex": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-string": { - "version": "1.0.6", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-symbol": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-typed-array": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-inspect": { - "version": "1.10.3", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-is": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-keys": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/object.assign": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.12.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/which-typed-array": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "node_modules/mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "optional": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" - }, - "node_modules/nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "dependencies": { - "path-to-regexp": "~1.2.1" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", - "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "deprecated": "Version no longer supported. Upgrade to @latest", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/puppeteer/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/puppeteer/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simpl-schema": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.1.tgz", - "integrity": "sha512-7ohENS5WHVsCSOFwGS9887QyiThGSC5NIf4yPBVt1fImYmL2lHsH1h59M/F5OmdQW6kQd6+BME6pMpurTLIq5A==", - "dependencies": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "node_modules/sinon": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", - "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", - "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" - }, - "node_modules/summernote": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", - "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", - "hasInstallScript": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "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" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "verror": "1.10.0" - } - }, - "node_modules/vasync/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", @@ -6049,11 +663,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6063,11 +672,6 @@ "concat-map": "0.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, "browserslist": { "version": "4.20.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", @@ -7007,19 +1611,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==" }, - "elliptic": { - "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -7335,25 +1926,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -7837,30 +2409,30 @@ "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", "requires": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" }, "dependencies": { "asn1.js": { @@ -8501,13 +3073,6 @@ "xtend": "^4.0.2" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -8524,6 +3089,13 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -8615,16 +3187,6 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9177,8 +3739,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "requires": {} + "dev": true }, "source-map": { "version": "0.6.1", @@ -9209,21 +3770,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -9249,6 +3795,21 @@ } } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", From e151da71637aea39a29dc70036a36f42ea83b21e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 29 May 2022 00:24:42 +0300 Subject: [PATCH 178/246] Updated ChangeLog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f68730fa..318d7e419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,8 @@ and fixes the following bugs: [Part 7](https://github.com/wekan/wekan/commit/2587e2f00ae27742893e48e98845a3139e3f3a02), [Part 8](https://github.com/wekan/wekan/commit/693a49f85200adcf81f5cf0ea56c7dd795757988). Thanks to xet7. - +- [WeKan Gantt GPLv2: Try to fix Gantt, by adding translations, but is not visible yet](https://github.com/wekan/wekan-gantt-gpl/commit/a08c01c76eaaf2884890a39c97d1f72da222fba1). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. # v6.26 2022-05-21 WeKan ® release From d74662bfd798a5c02f79d50b82b767b6e7e03a0d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 29 May 2022 00:26:23 +0300 Subject: [PATCH 179/246] Updated ChangeLog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 318d7e419..d663acec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and fixes the following bugs: Thanks to xet7. - [WeKan Gantt GPLv2: Try to fix Gantt, by adding translations, but is not visible yet](https://github.com/wekan/wekan-gantt-gpl/commit/a08c01c76eaaf2884890a39c97d1f72da222fba1). Thanks to xet7. + Thanks to above GitHub users for their contributions and translators for their translations. # v6.26 2022-05-21 WeKan ® release From 355b358fe28a90bca8b8cfb26b3fafc32389a594 Mon Sep 17 00:00:00 2001 From: neilnaveen <42328488+neilnaveen@users.noreply.github.com> Date: Mon, 30 May 2022 01:09:08 +0000 Subject: [PATCH 180/246] chore: Set permissions for GitHub actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: neilnaveen <42328488+neilnaveen@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 7 +++++++ .github/workflows/dockerimage.yml | 3 +++ .github/workflows/release.yml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index dac7475cd..71c280400 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,8 +9,15 @@ on: schedule: - cron: '0 16 * * 3' +permissions: + contents: read + jobs: analyze: + permissions: + actions: read # for github/codeql-action/init to get workflow details + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/autobuild to send a status report name: Analyze runs-on: ubuntu-latest diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml index de27ed1a4..fc291b5da 100644 --- a/.github/workflows/dockerimage.yml +++ b/.github/workflows/dockerimage.yml @@ -5,6 +5,9 @@ on: branches: - master +permissions: + contents: read + jobs: build: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74f5c74a4..b34fb9fd1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,8 +5,13 @@ on: branches: - master +permissions: + contents: read + jobs: release: + permissions: + contents: write # for helm/chart-releaser-action to push chart release and create a release runs-on: ubuntu-latest steps: - name: Checkout From bbffa2eb6b9f48250b182a863fb8fcb5a22bf81d Mon Sep 17 00:00:00 2001 From: naveen <172697+naveensrinivasan@users.noreply.github.com> Date: Tue, 31 May 2022 01:40:38 +0000 Subject: [PATCH 181/246] chore: Included githubactions in the dependabot config This should help with keeping the GitHub actions updated on new releases. This will also help with keeping it secure. Dependabot helps in keeping the supply chain secure https://docs.github.com/en/code-security/dependabot GitHub actions up to date https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot https://github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..203f3c889 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From 9f0b9b29a5571b01289f630165711c30d8bce1fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 02:12:13 +0000 Subject: [PATCH 182/246] Bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/docker-publish.yml | 2 +- .github/workflows/dockerimage.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test_suite.yml | 10 +++++----- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 71c280400..4522dfd7e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 234f3eaaf..ea091cb24 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml index fc291b5da..30a2879eb 100644 --- a/.github/workflows/dockerimage.yml +++ b/.github/workflows/dockerimage.yml @@ -15,6 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Build the Docker image run: docker build . --file Dockerfile --tag wekan:$(date +%s) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b34fb9fd1..22d4282f3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index 7f43f19c0..918d68599 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -15,7 +15,7 @@ jobs: # runs-on: ubuntu-latest # steps: # - name: checkout -# uses: actions/checkout@v2 +# uses: actions/checkout@v3 # # - name: setup node # uses: actions/setup-node@v1 @@ -39,7 +39,7 @@ jobs: # needs: [lintcode] # steps: # - name: checkout -# uses: actions/checkout@v2 +# uses: actions/checkout@v3 # # - name: setup node # uses: actions/setup-node@v1 @@ -62,7 +62,7 @@ jobs: # needs: [lintcode,lintstyle] # steps: # - name: checkout -# uses: actions/checkout@v2 +# uses: actions/checkout@v3 # # - name: setup node # uses: actions/setup-node@v1 @@ -87,7 +87,7 @@ jobs: # CHECKOUTS - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 # CACHING - name: Install Meteor @@ -144,7 +144,7 @@ jobs: needs: [tests] steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Download coverage uses: actions/download-artifact@v2 From 2d3611682336533d663f75a265e7ea445bfb722e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 02:12:17 +0000 Subject: [PATCH 183/246] Bump docker/metadata-action from 3.3.0 to 4.0.1 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 3.3.0 to 4.0.1. - [Release notes](https://github.com/docker/metadata-action/releases) - [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md) - [Commits](https://github.com/docker/metadata-action/compare/98669ae865ea3cffbcbaa878cf57c20bbf1c6c38...69f6fc9d46f2f8bf0d5491e4aabe0bb8c6a4678a) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 234f3eaaf..94b7a9ae7 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -48,7 +48,7 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + uses: docker/metadata-action@69f6fc9d46f2f8bf0d5491e4aabe0bb8c6a4678a with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} From 9ff87d189f1844efc51e58539905b4dcf917b529 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 02:12:24 +0000 Subject: [PATCH 184/246] Bump actions/cache from 2 to 3 Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/test_suite.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index 7f43f19c0..316fc1179 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -92,7 +92,7 @@ jobs: # CACHING - name: Install Meteor id: cache-meteor-install - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.meteor key: v1-meteor-${{ hashFiles('.meteor/versions') }} @@ -101,7 +101,7 @@ jobs: - name: Cache NPM dependencies id: cache-meteor-npm - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.npm key: v1-npm-${{ hashFiles('package-lock.json') }} @@ -110,7 +110,7 @@ jobs: - name: Cache Meteor build id: cache-meteor-build - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | .meteor/local/resolver-result-cache.json From d5247daf8aba85180670007d2c301cd69dfa1ca1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 02:12:27 +0000 Subject: [PATCH 185/246] Bump github/codeql-action from 1 to 2 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v1...v2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 71c280400..8a21b8463 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -45,14 +45,14 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -66,4 +66,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From 1ed2c3b45a7b59d6f267294c99cc27b4416b8480 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 May 2022 02:16:56 +0000 Subject: [PATCH 186/246] Bump docker/login-action from 1.9.0 to 2 Bumps [docker/login-action](https://github.com/docker/login-action) from 1.9.0 to 2. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/28218f9b04b4f3f62068d7b6ce6ca5b26e35336c...49ed152c8eca782a232dede0303416e8f356c37b) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 01eb4e9df..703fb6153 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -38,7 +38,7 @@ jobs: # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' - uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c + uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} From 680770a7df2b91dad133e779414af54b9c7acabb Mon Sep 17 00:00:00 2001 From: naveen <172697+naveensrinivasan@users.noreply.github.com> Date: Wed, 1 Jun 2022 23:35:00 +0000 Subject: [PATCH 187/246] chore(deps): Included dependency review > Dependency Review GitHub Action in your repository to enforce dependency > reviews on your pull requests. > The action scans for vulnerable versions of dependencies introduced by package version > changes in pull requests, > and warns you about the associated security vulnerabilities. > This gives you better visibility of what's changing in a pull request, > and helps prevent vulnerabilities being added to your repository. https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/workflows/depsreview.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/depsreview.yaml diff --git a/.github/workflows/depsreview.yaml b/.github/workflows/depsreview.yaml new file mode 100644 index 000000000..f2605b7a7 --- /dev/null +++ b/.github/workflows/depsreview.yaml @@ -0,0 +1,14 @@ +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v3 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v1 From 5af4f54f4c702f9cc4df60a27ac234421e41575d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Jun 2022 10:32:36 +0300 Subject: [PATCH 188/246] Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh). Thanks to translators! --- imports/i18n/data/ary.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/zgh.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/languages.js | 12 + releases/translations/pull-translations.sh | 6 + 4 files changed, 2380 insertions(+) create mode 100644 imports/i18n/data/ary.i18n.json create mode 100644 imports/i18n/data/zgh.i18n.json diff --git a/imports/i18n/data/ary.i18n.json b/imports/i18n/data/ary.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/ary.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after start", + "add-custom-html-before-body-end": "Add Custom HTML before end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/zgh.i18n.json b/imports/i18n/data/zgh.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/zgh.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index d4d98bdbd..31d633388 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -11,6 +11,12 @@ export default { name: "العربية", load: () => import('./data/ar.i18n.json'), }, + "ary": { + code: "ary", + tag: "ary", + name: "عربي مغربي", + load: () => import('./data/ary.i18n.json'), + }, "bg": { code: "bg", tag: "bg", @@ -611,6 +617,12 @@ export default { name: "Èdè Yorùbá", load: () => import('./data/yo.i18n.json'), }, + "zgh": { + code: "zgh", + tag: "zgh", + name: "ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ", + load: () => import('./data/zgh.i18n.json'), + }, "zh-CN": { code: "zh", tag: "zh-CN", diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 119b40e62..475e36570 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -6,6 +6,9 @@ tx pull -f -l ar echo "Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo):" tx pull -f -l ar_EG +echo "Arabic (Moroccan)" +tx pull -f -l ary + echo "Armenian:" tx pull -f -l hy @@ -232,6 +235,9 @@ tx pull -f -l sk echo "Slovenian:" tx pull -f -l sl_SI +echo "Standard Moroccan Tamazight" +tx pull -f -l zgh + echo "Swahili:" tx pull -f -l sw From c9f8e111c53f055b86eb5b0553a349c9dc4b44ae Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 6 Jun 2022 10:34:48 +0300 Subject: [PATCH 189/246] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d663acec0..12e04444a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ This release adds the following updates: - [Upgraded to Meteor 2.7.3-beta.0](https://github.com/wekan/wekan/commit/25e50e3908a52a7bac61f8b939ad7c78cbd79060). Thanks to Meteor developers. +and adds the following translations: + +- [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d). + Thanks to translators. + and fixes the following bugs: - [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7). From 43b2d714043e053874e3c1101ae6e464d2e61b7e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 6 Jun 2022 10:41:49 +0300 Subject: [PATCH 190/246] Upgraded to Meteor 2.7.3 . Thanks to Meteor developers ! --- .meteor/release | 2 +- .meteor/versions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.meteor/release b/.meteor/release index a85b5f5a3..66dd7b664 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.3-beta.0 +METEOR@2.7.3 diff --git a/.meteor/versions b/.meteor/versions index 7e45d5eff..35a9d8af4 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -11,7 +11,7 @@ arillo:flow-router-helpers@0.5.2 audit-argument-checks@1.0.7 autoupdate@1.8.0 babel-compiler@7.9.0 -babel-runtime@1.5.0 +babel-runtime@1.5.1 base64@1.0.12 binary-heap@1.0.11 blaze@2.6.0 From e4e1a8f4e68604b849c3301809f6aded47a3f5ab Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 6 Jun 2022 10:45:56 +0300 Subject: [PATCH 191/246] Updated ChangeLog. --- CHANGELOG.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12e04444a..838c04386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release adds the following updates: + +- [Upgraded to Meteor 2.7.3](https://github.com/wekan/wekan/commit/43b2d714043e053874e3c1101ae6e464d2e61b7e). + Thanks to Meteor developers. + +and adds the following translations: + +- [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d). + Thanks to translators. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.27 2022-05-28 WeKan ® release This release adds the following updates: @@ -7,11 +21,6 @@ This release adds the following updates: - [Upgraded to Meteor 2.7.3-beta.0](https://github.com/wekan/wekan/commit/25e50e3908a52a7bac61f8b939ad7c78cbd79060). Thanks to Meteor developers. -and adds the following translations: - -- [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d). - Thanks to translators. - and fixes the following bugs: - [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7). From dfea3d0e735f1665a14f7e534e352e0e00871a02 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 6 Jun 2022 14:57:16 +0300 Subject: [PATCH 192/246] Removed lightbox that caused bugs like Maximum stack size exceeded. TODO later: Add a new way to open attachment image bigger. Thanks to xet7 ! Related #4545 --- .meteor/packages | 27 ++++++++++-------------- .meteor/versions | 1 - client/components/cards/attachments.jade | 4 +++- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 8c07c71f1..0f3789515 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -26,9 +26,17 @@ mongo@1.15.0 mquandalle:collection-mutations # Account system -#wekan-ldap -#wekan-accounts-cas -#wekan-accounts-oidc +accounts-password@2.3.1 +useraccounts:core +useraccounts:flow-routing +useraccounts:unstyled +simple:rest-accounts-password +wekan-ldap +wekan-accounts-cas +wekan-accounts-sandstorm +wekan-accounts-lockout +wekan-oidc +wekan-accounts-oidc # Utilities check@1.3.1 @@ -62,7 +70,6 @@ rajit:bootstrap3-datepicker shell-server@0.5.0 email@2.2.1 dynamic-import@0.7.2 - cfs:gridfs rzymek:fullcalendar msavin:usercache @@ -128,21 +135,9 @@ pascoual:pdfkit lmieulet:meteor-coverage meteortesting:mocha@2.0.3 aldeed:simple-schema -accounts-password@2.3.1 matb33:collection-hooks simple:json-routes kadira:flow-router spacebars -useraccounts:core -useraccounts:flow-routing -useraccounts:unstyled service-configuration@1.3.0 communitypackages:picker -simple:rest-accounts-password -wekan-accounts-sandstorm -wekan-accounts-lockout -wekan-oidc -wekan-accounts-oidc -wekan-ldap -wekan-accounts-cas -czbaker:lightbox2 diff --git a/.meteor/versions b/.meteor/versions index 35a9d8af4..c9993760a 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -43,7 +43,6 @@ coffeescript@2.4.1 coffeescript-compiler@2.4.1 communitypackages:picker@1.1.0 cottz:publish-relations@2.0.8 -czbaker:lightbox2@2.7.1_1 dburles:collection-helpers@1.1.0 ddp@1.4.0 ddp-client@2.5.0 diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 8579abd98..fa49271a3 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -19,7 +19,9 @@ template(name="attachmentsGalery") .attachments-galery each attachments .attachment-item - a.attachment-thumbnail(href="{{link}}" title="{{name}}" data-lightbox="{{name}}") + // TODO: Add popup of attachment image later, with some swipebox or lightbox that would not add bugs + // a.attachment-thumbnail(href="{{link}}" title="{{name}}") + span.attachment-thumbnail(href="{{link}}" title="{{name}}") if link if isImage img.attachment-thumbnail-img(src="{{link}}") From b7f62cf5f23fc4e42815eb667c7eba207bfff7f2 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 6 Jun 2022 15:00:22 +0300 Subject: [PATCH 193/246] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 838c04386..5dfc4140e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and adds the following translations: - [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d). Thanks to translators. +and fixes the following bugs: + +- [Removed lightbox that caused bugs like Maximum stack size exceeded. TODO later: Add a new way to open attachment image bigger](https://github.com/wekan/wekan/commit/dfea3d0e735f1665a14f7e534e352e0e00871a02). + Thanks to xet7. + Thanks to above GitHub users for their contributions and translators for their translations. # v6.27 2022-05-28 WeKan ® release From a7fd512124ddaa24a0dd73cec8592eaf8265dcff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:20:09 +0000 Subject: [PATCH 194/246] Bump VeryGoodOpenSource/very_good_coverage from 1.1.1 to 1.2.1 Bumps [VeryGoodOpenSource/very_good_coverage](https://github.com/VeryGoodOpenSource/very_good_coverage) from 1.1.1 to 1.2.1. - [Release notes](https://github.com/VeryGoodOpenSource/very_good_coverage/releases) - [Changelog](https://github.com/VeryGoodOpenSource/very_good_coverage/blob/main/CHANGELOG.md) - [Commits](https://github.com/VeryGoodOpenSource/very_good_coverage/compare/v1.1.1...v1.2.1) --- updated-dependencies: - dependency-name: VeryGoodOpenSource/very_good_coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/test_suite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index a51ee74a7..306a5bf22 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -154,7 +154,7 @@ jobs: - name: Coverage Report - uses: VeryGoodOpenSource/very_good_coverage@v1.1.1 + uses: VeryGoodOpenSource/very_good_coverage@v1.2.1 with: path: ".coverage/lcov.info" min_coverage: 1 # TODO add tests and increase to 95! From 2a24720fade02323d25cccea5198968e7b0ccf1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:20:14 +0000 Subject: [PATCH 195/246] Bump actions/download-artifact from 2 to 3 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/test_suite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index a51ee74a7..6089ea96d 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -147,7 +147,7 @@ jobs: uses: actions/checkout@v3 - name: Download coverage - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: coverage-folder path: .coverage/ From f6ee321d0f4d35251e2e3e4c286a46e6b04ff1f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:20:19 +0000 Subject: [PATCH 196/246] Bump docker/build-push-action from 2.5.0 to 3 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.5.0 to 3. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/ad44023a93711e3deb337508980b4b5e9bcdc5dc...e551b19e49efd4e98792db7592c17c09b89db8d8) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 703fb6153..701981686 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -55,7 +55,7 @@ jobs: # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push Docker image - uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + uses: docker/build-push-action@e551b19e49efd4e98792db7592c17c09b89db8d8 with: context: . push: ${{ github.event_name != 'pull_request' }} From c71cedf9f408800a91ade90747a9f3ccd2c5e64b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:20:23 +0000 Subject: [PATCH 197/246] Bump helm/chart-releaser-action from 1.1.0 to 1.4.0 Bumps [helm/chart-releaser-action](https://github.com/helm/chart-releaser-action) from 1.1.0 to 1.4.0. - [Release notes](https://github.com/helm/chart-releaser-action/releases) - [Commits](https://github.com/helm/chart-releaser-action/compare/v1.1.0...v1.4.0) --- updated-dependencies: - dependency-name: helm/chart-releaser-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 22d4282f3..95bc6beb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,6 @@ jobs: git config user.email "$GITHUB_ACTOR@users.noreply.github.com" - name: Run chart-releaser - uses: helm/chart-releaser-action@v1.1.0 + uses: helm/chart-releaser-action@v1.4.0 env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" From 63e0597c68632c1d62a32e9baf071f3ded7e5e8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:20:26 +0000 Subject: [PATCH 198/246] Bump actions/upload-artifact from 2 to 3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/test_suite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index a51ee74a7..4003b1bdc 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -133,7 +133,7 @@ jobs: run: sh ./test-wekan.sh -cv - name: Upload coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: coverage-folder path: .coverage/ From ad5167de558660b2975732d202b138497cb33eb9 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Tue, 8 Feb 2022 22:14:01 +0100 Subject: [PATCH 199/246] Card Details, move card between lists moves now the card to the top by default - mostly the card is sorted anywhere and you have to scroll the list, now, the card is always at the top --- client/components/cards/cardDetails.js | 8 +++-- models/cards.js | 47 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 401f4c6ef..2e433a56f 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -388,7 +388,9 @@ BlazeComponent.extendComponent({ let card = this.data(); const listSelect = this.$('.js-select-card-details-lists')[0]; const listId = listSelect.options[listSelect.selectedIndex].value; - card.move(card.boardId, card.swimlaneId, listId, card.sort); + + const minOrder = card.getMinSort(listId, card.swimlaneId); + card.move(card.boardId, card.swimlaneId, listId, minOrder - 1); }, 'click .js-go-to-linked-card'() { Utils.goCardId(this.data().linkedId); @@ -836,7 +838,9 @@ Template.moveCardPopup.events({ const listId = lSelect.options[lSelect.selectedIndex].value; const slSelect = $('.js-select-swimlanes')[0]; const swimlaneId = slSelect.options[slSelect.selectedIndex].value; - card.move(boardId, swimlaneId, listId, 0); + + const minOrder = card.getMinSort(listId, swimlaneId); + card.move(boardId, swimlaneId, listId, minOrder - 1); // set new id's to card object in case the card is moved to top by the comment "moveCard" after this command (.js-move-card) this.boardId = boardId; diff --git a/models/cards.js b/models/cards.js index 73b0d48a1..ef4b2003e 100644 --- a/models/cards.js +++ b/models/cards.js @@ -691,6 +691,53 @@ Cards.helpers({ return _.contains(this.labelIds, labelId); }, + /** returns the sort number of a list + * @param listId a list id + * @param swimlaneId a swimlane id + * top sorting of the card at the top if true, or from the bottom if false + */ + getSort(listId, swimlaneId, top) { + if (!_.isBoolean(top)) { + top = true; + } + if (!listId) { + listId = this.listId; + } + if (!swimlaneId) { + swimlaneId = this.swimlaneId; + } + const selector = { + listId: listId, + swimlaneId: swimlaneId, + archived: false, + }; + const sorting = top ? 1 : -1; + const card = Cards.findOne(selector, { sort: { sort: sorting } }); + let ret = null + if (card) { + ret = card.sort; + } + return ret; + }, + + /** returns the sort number of a list from the card at the top + * @param listId a list id + * @param swimlaneId a swimlane id + */ + getMinSort(listId, swimlaneId) { + const ret = this.getSort(listId, swimlaneId, true); + return ret; + }, + + /** returns the sort number of a list from the card at the bottom + * @param listId a list id + * @param swimlaneId a swimlane id + */ + getMaxSort(listId, swimlaneId) { + const ret = this.getSort(listId, swimlaneId, false); + return ret; + }, + user() { return Users.findOne(this.userId); }, From dcff70c983879aa87195ba4aa69471dae98deda1 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Tue, 8 Feb 2022 22:20:21 +0100 Subject: [PATCH 200/246] Copy card is now at the top too (same as move card) --- client/components/cards/cardDetails.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 2e433a56f..4b84b0957 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -968,8 +968,10 @@ Template.copyCardPopup.events({ const boardId = bSelect.options[bSelect.selectedIndex].value; const textarea = $('#copy-card-title'); const title = textarea.val().trim(); - // insert new card to the bottom of new list - card.sort = Lists.findOne(card.listId).cards().count(); + + // insert new card to the top of new list + const minOrder = card.getMinSort(listId, swimlaneId); + card.sort = minOrder - 1; if (title) { card.title = title; From 6b6bdddce670c130a612e19145d6e6adf7f27dc7 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Tue, 8 Feb 2022 22:25:11 +0100 Subject: [PATCH 201/246] Move card to top/bottom using now the same internal code logic --- client/components/cards/cardDetails.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 4b84b0957..baf7887be 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -679,21 +679,13 @@ Template.cardDetailsActionsPopup.events({ 'click .js-set-card-color': Popup.open('setCardColor'), 'click .js-move-card-to-top'(event) { event.preventDefault(); - const minOrder = _.min( - this.list() - .cardsUnfiltered(this.swimlaneId) - .map((c) => c.sort), - ); + const minOrder = this.getMinSort(); this.move(this.boardId, this.swimlaneId, this.listId, minOrder - 1); Popup.back(); }, 'click .js-move-card-to-bottom'(event) { event.preventDefault(); - const maxOrder = _.max( - this.list() - .cardsUnfiltered(this.swimlaneId) - .map((c) => c.sort), - ); + const maxOrder = this.getMaxSort(); this.move(this.boardId, this.swimlaneId, this.listId, maxOrder + 1); Popup.back(); }, From 2e06d466b9692039fcae59c75a6a8056ed2d8fa1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 07:44:55 +0300 Subject: [PATCH 202/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dfc4140e..b84e347a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and fixes the following bugs: - [Removed lightbox that caused bugs like Maximum stack size exceeded. TODO later: Add a new way to open attachment image bigger](https://github.com/wekan/wekan/commit/dfea3d0e735f1665a14f7e534e352e0e00871a02). Thanks to xet7. +- [Move and copy card set sorting](https://github.com/wekan/wekan/pull/4557). + Thanks to mfilser. Thanks to above GitHub users for their contributions and translators for their translations. From e25050316f6f018f68b03bef6fccbdaea7248461 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 07:52:20 +0300 Subject: [PATCH 203/246] Try to detect Japanese (Japan) better. Thanks to takenoko14 at Transifex and xet7 ! --- .tx/config | 2 +- imports/i18n/languages.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.tx/config b/.tx/config index 202a82f3a..a032e2903 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA +lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA [wekan.application] file_filter = imports/i18n/data/<lang>.i18n.json diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 31d633388..099c7c22f 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -329,6 +329,12 @@ export default { name: "日本語", load: () => import('./data/ja.i18n.json'), }, + "ja-JP": { + code: "ja", + tag: "ja-JP", + name: "日本語", + load: () => import('./data/ja.i18n.json'), + }, "ka": { code: "ka", tag: "ka", From 21ae1b59d66702acbed0b848eed2dc4f44b69190 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 07:54:26 +0300 Subject: [PATCH 204/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b84e347a9..baef876f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and adds the following translations: - [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d). Thanks to translators. +- [Try to detect Japanese (Japan) better](https://github.com/wekan/wekan/commit/e25050316f6f018f68b03bef6fccbdaea7248461). + Thanks to takenoko14 at Transifex and xet7. and fixes the following bugs: From 937797356ceeb99bf66eb826e13fc55f266c8739 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 09:32:34 +0300 Subject: [PATCH 205/246] Updated dependencies. Try to fix Binary release on releases.wekan.team lacks the CSS. Thanks to znerol, mrcancer91, BabyFnord and xet7 ! Fixes #4545 --- .meteor/packages | 2 +- .meteor/versions | 7 +- client/components/main/layouts.jade | 1 + package-lock.json | 203 ---------------------------- package.json | 4 - 5 files changed, 5 insertions(+), 212 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 0f3789515..97e54b108 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -7,7 +7,6 @@ meteor-base@1.5.1 # Build system ecmascript@0.16.2 -standard-minifier-css@1.8.1 standard-minifier-js@2.8.0 mquandalle:jade coffeescript@2.4.1! @@ -141,3 +140,4 @@ kadira:flow-router spacebars service-configuration@1.3.0 communitypackages:picker +minifier-css diff --git a/.meteor/versions b/.meteor/versions index c9993760a..91dc606a8 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -123,10 +123,10 @@ oauth2@1.3.1 observe-sequence@1.0.20 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 -ostrio:cookies@2.7.0 -ostrio:cstorage@2.2.2 +ostrio:cookies@2.7.2 +ostrio:cstorage@4.0.1 ostrio:files@2.0.1 -ostrio:i18n@3.1.0 +ostrio:i18n@3.2.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 peerlibrary:base-component@0.17.1 @@ -208,7 +208,6 @@ simple:rest-json-error-handler@1.1.1 socket-stream-client@0.5.0 spacebars@1.3.0 spacebars-compiler@1.3.1 -standard-minifier-css@1.8.1 standard-minifier-js@2.8.0 templates:tabs@2.3.0 templating@1.4.1 diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index eafc6251a..bd8a899a4 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -16,6 +16,7 @@ head meta(name="application-name" content="Wekan") meta(name="msapplication-TileColor" content="#00aba9") meta(name="theme-color" content="#ffffff") + link(rel='stylesheet', href='css/html5-default-theme.css', type='text/css') template(name="userFormsLayout") section.auth-layout diff --git a/package-lock.json b/package-lock.json index 44b1db5ea..0c619ffb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -543,12 +543,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -856,50 +850,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -1634,15 +1584,6 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1675,35 +1616,6 @@ "uuid": "^8.3.0" } }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "extsprintf": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", @@ -1728,15 +1640,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "fibers": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", @@ -3181,12 +3084,6 @@ } } }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3476,12 +3373,6 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3497,80 +3388,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -3920,12 +3742,6 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -4069,15 +3885,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -4088,16 +3895,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", diff --git a/package.json b/package.json index 4f7a85026..3dd911f70 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "flatted": "^3.2.2", - "puppeteer": "^1.20.0", "sinon": "^13.0.2", "sinon-chai": "^3.7.0" }, @@ -59,8 +58,5 @@ "source-map-support": "^0.5.20", "summernote": "^0.8.20", "uuid": "^8.3.2" - }, - "meteor": { - "testModule": "tests/main.js" } } From f9e25e028e7de60836463e1cca026c5ab13ebf49 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 09:36:24 +0300 Subject: [PATCH 206/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index baef876f0..30807c6ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ and fixes the following bugs: Thanks to xet7. - [Move and copy card set sorting](https://github.com/wekan/wekan/pull/4557). Thanks to mfilser. +- [Updated dependencies. Try to fix Binary release on releases.wekan.team lacks the CSS](https://github.com/wekan/wekan/commit/937797356ceeb99bf66eb826e13fc55f266c8739). + Thanks to znerol, mrcancer91, BabyFnord and xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 51fb490c22e2899d46c4a8be5d57191483242e48 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 8 Jun 2022 09:42:53 +0300 Subject: [PATCH 207/246] v6.28 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- helm/wekan/Chart.yaml | 2 +- helm/wekan/values.yaml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30807c6ed..f45d1e3ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming WeKan ® release +# v6.28 2022-06-08 WeKan ® release This release adds the following updates: diff --git a/Stackerfile.yml b/Stackerfile.yml index 00ed638af..c88e1d308 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v6.27.0" +appVersion: "v6.28.0" files: userUploads: - README.md diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index dabb5d93d..836dad84a 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "6.27" +appVersion: "6.28" dependencies: - condition: mongodb.enabled name: mongodb diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 1b5215bd2..53e46738e 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v6.27 + tag: v6.28 pullPolicy: IfNotPresent ## Configuration for wekan component diff --git a/package-lock.json b/package-lock.json index 0c619ffb0..4499987aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.27.0", + "version": "v6.28.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3dd911f70..e68995bf9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v6.27.0", + "version": "v6.28.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index 78905fbed..622a904e1 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ <meta charset="utf-8"> <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> - <title>Wekan REST API v6.27 + Wekan REST API v6.28 @@ -1558,7 +1558,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
              • - Wekan REST API v6.27 + Wekan REST API v6.28
              • @@ -2156,7 +2156,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
                -

                Wekan REST API v6.27

                +

                Wekan REST API v6.28

                Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

                diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 04bcdfc89..b8d02fd16 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v6.27 + version: v6.28 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 82f391cb3..b1a1878cc 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 627, + appVersion = 628, # Increment this for every release. - appMarketingVersion = (defaultText = "6.27.0~2022-05-28"), + appMarketingVersion = (defaultText = "6.28.0~2022-06-08"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 6a4bfcbba..b1c5160fc 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '6.27' +version: '6.28' base: core20 summary: Open Source kanban description: | From 6b4ffa69c64f0186a8b1b3ac175b633ac7c24263 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 13 Jun 2022 13:39:35 +0300 Subject: [PATCH 208/246] Docker base image to Ubuntu 22.04 . Thanks to Ubuntu developers ! --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f97b45e9e..c9929ac49 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:21.10 +FROM ubuntu:22.04 LABEL maintainer="wekan" # 2022-04-25: From 403e2f4cbdd0bc3000db6f21f16a7750d78fa3e0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 13 Jun 2022 13:41:57 +0300 Subject: [PATCH 209/246] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f45d1e3ed..d946d4f25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming WeKan ® release + +This release adds the following updates: + +- [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263). + Thanks to Ubuntu developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v6.28 2022-06-08 WeKan ® release This release adds the following updates: From 12615fef5d44cf611b3f1d9fc0a7be3e98b8c042 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 13 Jun 2022 13:54:54 +0300 Subject: [PATCH 210/246] Added translation Asturia (Spain). Thanks to translators ! --- .tx/config | 2 +- imports/i18n/data/ast-ES.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/es.i18n.json | 2 +- imports/i18n/languages.js | 6 + releases/translations/pull-translations.sh | 3 + 5 files changed, 1192 insertions(+), 2 deletions(-) create mode 100644 imports/i18n/data/ast-ES.i18n.json diff --git a/.tx/config b/.tx/config index a032e2903..617b84956 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA +lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, ast_ES:ast-ES, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA [wekan.application] file_filter = imports/i18n/data/.i18n.json diff --git a/imports/i18n/data/ast-ES.i18n.json b/imports/i18n/data/ast-ES.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/ast-ES.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after start", + "add-custom-html-before-body-end": "Add Custom HTML before end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index 0515a99b0..e8ca95c8f 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -107,7 +107,7 @@ "and-n-other-card_plural": "y otras __count__ tarjetas", "apply": "Aplicar", "app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.", - "app-try-reconnect": "Try to reconnect.", + "app-try-reconnect": "Intente reconectar.", "archive": "Archivar", "archive-all": "Archivar todo", "archive-board": "Archivar este tablero", diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 099c7c22f..3b297d26a 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -137,6 +137,12 @@ export default { name: "Esperanto", load: () => import('./data/eo.i18n.json'), }, + "ast-ES": { + code: "es", + tag: "ast-ES", + name: "español de Asturias", + load: () => import('./data/ast-ES.i18n.json'), + }, "es-AR": { code: "es", tag: "es-AR", diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 475e36570..a6931f1a3 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -211,6 +211,9 @@ tx pull -f -l es echo "Spanish (Argentina):" tx pull -f -l es_AR +echo "Spanish (Asturia):" +tx pull -f -l ast_ES + echo "Spanish (Chile):" tx pull -f -l es_CL From 6e979beb0178dce9d65ccc8128f6fb7c15f21ef7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 13 Jun 2022 13:56:47 +0300 Subject: [PATCH 211/246] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d946d4f25..196d6cdf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ This release adds the following updates: - [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263). Thanks to Ubuntu developers. +and adds the following translations: + +- [Added translation Asturia (Spain)](https://github.com/wekan/wekan/commit/12615fef5d44cf611b3f1d9fc0a7be3e98b8c042). + Thanks to translators. + Thanks to above GitHub users for their contributions and translators for their translations. # v6.28 2022-06-08 WeKan ® release From 0d67a86f2c9c1c9696d8507c60e53d47a226a6ad Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 13 Jun 2022 13:57:47 +0300 Subject: [PATCH 212/246] Updated ostrio:files. Thanks to developers of dependencies ! --- .meteor/versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.meteor/versions b/.meteor/versions index 91dc606a8..5b9bed272 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -125,7 +125,7 @@ ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 ostrio:cookies@2.7.2 ostrio:cstorage@4.0.1 -ostrio:files@2.0.1 +ostrio:files@2.1.1 ostrio:i18n@3.2.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 From be1893e66a73e83ee5805bdbc816f7e4e485daa7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 13 Jun 2022 13:59:07 +0300 Subject: [PATCH 213/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 196d6cdf1..f8e7ec825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This release adds the following updates: - [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263). Thanks to Ubuntu developers. +- [Updated ostrio:files](https://github.com/wekan/wekan/commit/0d67a86f2c9c1c9696d8507c60e53d47a226a6ad). + Thanks to developers of dependencies. and adds the following translations: From 48a9fe3440f206cbd7b28290a65674657517edde Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Tue, 14 Jun 2022 08:22:25 +0300 Subject: [PATCH 214/246] Try to fix Snap. --- package-lock.json | 3909 --------------------------------------------- 1 file changed, 3909 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4499987aa..000000000 --- a/package-lock.json +++ /dev/null @@ -1,3909 +0,0 @@ -{ - "name": "wekan", - "version": "v6.28.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" - }, - "@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", - "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" - }, - "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", - "requires": { - "@babel/types": "^7.18.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" - }, - "@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" - } - }, - "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz", - "integrity": "sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==" - }, - "@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", - "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" - }, - "@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" - }, - "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@types/node": { - "version": "14.18.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", - "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==" - }, - "@wekanteam/cli-table3": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", - "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", - "requires": { - "string-width": "^5.1.2" - } - }, - "@wekanteam/markdown-it-mermaid": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", - "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", - "requires": { - "@wekanteam/cli-table3": "^0.7.6", - "mermaid": "^9.0.1" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - } - }, - "bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" - }, - "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==" - }, - "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - } - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-js": { - "version": "3.22.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", - "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - }, - "crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, - "d3": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", - "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", - "requires": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "3", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - } - }, - "d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" - }, - "d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - } - }, - "d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "requires": { - "d3-path": "1 - 3" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", - "requires": { - "d3-array": "2 - 3" - } - }, - "d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "requires": { - "delaunator": "5" - } - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "requires": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "requires": { - "d3-dsv": "1 - 3" - } - }, - "d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" - }, - "d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - }, - "d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" - }, - "d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" - }, - "d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" - }, - "d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" - }, - "d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "requires": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - } - }, - "d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "requires": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - } - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "requires": { - "d3-path": "1 - 3" - } - }, - "d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "requires": { - "d3-array": "2 - 3" - } - }, - "d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "requires": { - "d3-time": "1 - 3" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - } - }, - "dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "requires": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "requires": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "requires": { - "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" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "dayjs": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", - "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "requires": { - "robust-predicates": "^3.0.0" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "dompurify": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", - "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "electron-to-chromium": { - "version": "1.4.141", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", - "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "exceljs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", - "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", - "requires": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - } - }, - "extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==" - }, - "fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "requires": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fibers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", - "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", - "requires": { - "detect-libc": "^1.0.3" - }, - "dependencies": { - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "requires": { - "lodash": "^4.17.15" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "i18next": { - "version": "21.8.4", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.4.tgz", - "integrity": "sha512-b3LQ5n9V1juu8UItb5x1QTI4OTvNqsNs/wetwQlBvfijEqks+N5HKMKSoevf8w0/RGUrDQ7g4cvVzF8WBp9pUw==", - "requires": { - "@babel/runtime": "^7.17.2" - } - }, - "i18next-sprintf-postprocessor": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", - "integrity": "sha1-LkCfEENXk4Jpi2otpwzapVHWfqQ=" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "jQuery": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", - "integrity": "sha1-8y3FyFpwRO6GS0RDue5F+UeLoTc=" - }, - "jquery-ui": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", - "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", - "requires": { - "jquery": ">=1.8.0 <4.0.0" - }, - "dependencies": { - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - } - } - }, - "jquery-ui-touch-punch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", - "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ldapjs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", - "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", - "requires": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - } - }, - "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "requires": { - "uc.micro": "^1.0.1" - } - }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } - } - }, - "markdown-it-emoji": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", - "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "mermaid": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", - "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", - "requires": { - "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre": "^0.8.5", - "dagre-d3": "^0.6.4", - "dompurify": "2.3.6", - "graphlib": "^2.1.8", - "khroma": "^2.0.0", - "moment-mini": "^2.24.0", - "stylis": "^4.0.10" - }, - "dependencies": { - "dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - } - } - }, - "message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "requires": { - "lodash.template": "^4.5.0" - } - }, - "meteor-accounts-t9n": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", - "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" - }, - "meteor-node-stubs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", - "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", - "requires": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.19.0", - "elliptic": "^6.5.4", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" - }, - "dependencies": { - "asn1.js": { - "version": "5.4.1", - "bundled": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "assert": { - "version": "2.0.0", - "bundled": true, - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "available-typed-arrays": { - "version": "1.0.4", - "bundled": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true - }, - "bn.js": { - "version": "5.2.0", - "bundled": true - }, - "brorand": { - "version": "1.1.0", - "bundled": true - }, - "browserify-aes": { - "version": "1.2.0", - "bundled": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "bundled": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "bundled": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "bundled": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "bundled": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "bundled": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "5.7.1", - "bundled": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-xor": { - "version": "1.0.3", - "bundled": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "bundled": true - }, - "call-bind": { - "version": "1.0.2", - "bundled": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "cipher-base": { - "version": "1.0.4", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "console-browserify": { - "version": "1.2.0", - "bundled": true - }, - "constants-browserify": { - "version": "1.0.0", - "bundled": true - }, - "create-ecdh": { - "version": "4.0.4", - "bundled": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "bundled": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "bundled": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "bundled": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "define-properties": { - "version": "1.1.3", - "bundled": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "des.js": { - "version": "1.0.1", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "bundled": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "domain-browser": { - "version": "4.19.0", - "bundled": true - }, - "elliptic": { - "version": "6.5.4", - "bundled": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "es-abstract": { - "version": "1.18.3", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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": { - "version": "1.2.1", - "bundled": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "bundled": true - }, - "events": { - "version": "3.3.0", - "bundled": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "bundled": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "foreach": { - "version": "2.0.5", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "get-intrinsic": { - "version": "1.1.1", - "bundled": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "bundled": true - }, - "has-symbols": { - "version": "1.0.2", - "bundled": true - }, - "hash-base": { - "version": "3.1.0", - "bundled": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "bundled": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "bundled": true - }, - "ieee754": { - "version": "1.2.1", - "bundled": true - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "is-arguments": { - "version": "1.1.0", - "bundled": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.2", - "bundled": true - }, - "is-boolean-object": { - "version": "1.1.1", - "bundled": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.3", - "bundled": true - }, - "is-date-object": { - "version": "1.0.4", - "bundled": true - }, - "is-generator-function": { - "version": "1.0.9", - "bundled": true - }, - "is-nan": { - "version": "1.3.2", - "bundled": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "bundled": true - }, - "is-number-object": { - "version": "1.0.5", - "bundled": true - }, - "is-regex": { - "version": "1.1.3", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.6", - "bundled": true - }, - "is-symbol": { - "version": "1.0.4", - "bundled": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.5", - "bundled": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } - }, - "md5.js": { - "version": "1.3.5", - "bundled": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "bundled": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "bundled": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "bundled": true - }, - "object-inspect": { - "version": "1.10.3", - "bundled": true - }, - "object-is": { - "version": "1.1.5", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "bundled": true - }, - "object.assign": { - "version": "4.1.2", - "bundled": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "bundled": true - }, - "pako": { - "version": "1.0.11", - "bundled": true - }, - "parse-asn1": { - "version": "5.1.6", - "bundled": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "path-browserify": { - "version": "1.0.1", - "bundled": true - }, - "pbkdf2": { - "version": "3.1.2", - "bundled": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "process": { - "version": "0.11.10", - "bundled": true - }, - "public-encrypt": { - "version": "4.0.3", - "bundled": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true - }, - "querystring": { - "version": "0.2.0", - "bundled": true - }, - "querystring-es3": { - "version": "0.2.1", - "bundled": true - }, - "randombytes": { - "version": "2.1.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "bundled": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "ripemd160": { - "version": "2.0.2", - "bundled": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true - }, - "setimmediate": { - "version": "1.0.5", - "bundled": true - }, - "sha.js": { - "version": "2.4.11", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "stream-browserify": { - "version": "3.0.0", - "bundled": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "stream-http": { - "version": "3.2.0", - "bundled": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "timers-browserify": { - "version": "2.0.12", - "bundled": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tty-browserify": { - "version": "0.0.1", - "bundled": true - }, - "unbox-primitive": { - "version": "1.0.1", - "bundled": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "url": { - "version": "0.11.0", - "bundled": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "bundled": true - } - } - }, - "util": { - "version": "0.12.4", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "vm-browserify": { - "version": "1.1.2", - "bundled": true - }, - "which-boxed-primitive": { - "version": "1.0.2", - "bundled": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.4", - "bundled": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - } - }, - "xtend": { - "version": "4.0.2", - "bundled": true - } - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" - }, - "moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - }, - "dependencies": { - "bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, - "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "optional": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" - }, - "nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "requires": { - "require-at": "^1.0.6" - } - }, - "os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "requires": { - "path-to-regexp": "~1.2.1" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "papaparse": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", - "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", - "requires": { - "isarray": "0.0.1" - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "requires": { - "minimatch": "^3.0.4" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "simpl-schema": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.1.tgz", - "integrity": "sha512-7ohENS5WHVsCSOFwGS9887QyiThGSC5NIf4yPBVt1fImYmL2lHsH1h59M/F5OmdQW6kQd6+BME6pMpurTLIq5A==", - "requires": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "sinon": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", - "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "stylis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", - "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" - }, - "summernote": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", - "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "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" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "requires": { - "verror": "1.10.0" - }, - "dependencies": { - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - } - }, - "verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - } - } - } -} From 753c54a7416c2c8b149cf3c428f0a177ba16ecf5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Tue, 14 Jun 2022 08:49:00 +0300 Subject: [PATCH 215/246] Try to fix Snap. --- package-lock.json | 9018 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 9018 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..35c5e02bd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9018 @@ +{ + "name": "wekan", + "version": "v6.28.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "wekan", + "version": "v6.28.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/runtime": "^7.15.4", + "@mapbox/node-pre-gyp": "^1.0.8", + "@wekanteam/markdown-it-mermaid": "^0.5.4", + "ajv": "^6.12.6", + "babel-runtime": "^6.26.0", + "bcryptjs": "^2.4.3", + "bson": "^4.5.2", + "bunyan": "^1.8.15", + "core-js": "^3.18.2", + "dompurify": "^2.3.2", + "es6-promise": "^4.2.4", + "escape-string-regexp": "^5.0.0", + "exceljs": "^4.2.1", + "fibers": "^5.0.0", + "i18next": "^21.6.16", + "i18next-sprintf-postprocessor": "^0.2.2", + "jQuery": "^1.7.4", + "jquery-ui": "^1.13.0", + "jquery-ui-touch-punch": "^0.2.3", + "jszip": "^3.7.1", + "ldapjs": "^2.3.1", + "markdown-it": "^12.3.2", + "markdown-it-emoji": "^2.0.0", + "meteor-accounts-t9n": "^2.6.0", + "meteor-node-stubs": "^1.1.0", + "moment": "^2.29.3", + "mongodb": "^3.7.3", + "nodemailer": "^6.6.3", + "os": "^0.1.2", + "page": "^1.11.6", + "papaparse": "^5.3.1", + "qs": "^6.10.1", + "simpl-schema": "^1.12.0", + "source-map-support": "^0.5.20", + "summernote": "^0.8.20", + "uuid": "^8.3.2" + }, + "devDependencies": { + "babel-plugin-istanbul": "^6.1.1", + "chai": "^4.3.6", + "chai-as-promised": "^7.1.1", + "flatted": "^3.2.2", + "sinon": "^13.0.2", + "sinon-chai": "^3.7.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz", + "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "dependencies": { + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", + "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", + "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.5", + "@babel/types": "^7.18.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", + "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" + }, + "node_modules/@wekanteam/cli-table3": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", + "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", + "dependencies": { + "string-width": "^5.1.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@wekanteam/markdown-it-mermaid": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", + "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", + "dependencies": { + "@wekanteam/cli-table3": "^0.7.6", + "mermaid": "^9.0.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", + "escalade": "^3.1.1", + "node-releases": "^2.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.0.tgz", + "integrity": "sha512-v2/hZoRcRrvQiBoGsHwmRdr+S4oICKcjA6xb2qjVurin6TpcDC1X2CIDa8rdu/d5n8RT/Sdoos2IlnpQ1rXs5A==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", + "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", + "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "dependencies": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagre-d3/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/dagre-d3/node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/dagre-d3/node_modules/d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "node_modules/dagre-d3/node_modules/d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "dependencies": { + "d3-array": "1", + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/dagre-d3/node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "^1.1.1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/dagre-d3/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/dagre-d3/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/dagre-d3/node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/dagre-d3/node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/dagre-d3/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/dagre-d3/node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "node_modules/dagre-d3/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/dagre-d3/node_modules/d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "node_modules/dagre-d3/node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/dagre-d3/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/dagre-d3/node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/dagre-d3/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre-d3/node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "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" + } + }, + "node_modules/dagre-d3/node_modules/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "dependencies": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "node_modules/dagre-d3/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", + "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.154", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.154.tgz", + "integrity": "sha512-GbV9djOkrnj6xmW+YYVVEI3VCQnJ0pnSTu7TW2JyjKd5cakoiSaG5R4RbEtfaD92GsY10DzbU3GYRe+IOA9kqA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fibers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", + "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fibers/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/i18next": { + "version": "21.8.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.9.tgz", + "integrity": "sha512-PY9a/8ADVmnju1tETeglbbVQi+nM5pcJQWm9kvKMTE3GPgHHtpDsHy5HQ/hccz2/xtW7j3vuso23JdQSH0EttA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, + "node_modules/i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha512-c/IT9xuMyTfJ/3Ds+DPtb0vYVuykbMyGChZ5OGZTzFDV7Kgst1nrNOwdbZ+PkcA5kLXEE3U0RKkNbabj07261w==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jQuery": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", + "integrity": "sha512-hf/hWBnkFhu4FzP96tBjZNPF9qTcUaOKFA8hpVJX0Cb/892JefRzoVGCe/vkmry/pOhZiK6VnQvnuV8CoHf1rA==", + "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/jquery-ui": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha512-Q/7aAd+SjbV0SspHO7Kuk96NJIbLwJAS0lD81U1PKcU2T5ZKayXMORH+Y5qvYLuy41xqVQbWimsRKDn1v3oI2Q==" + }, + "node_modules/jquery-ui/node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ldapjs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", + "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "dependencies": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mermaid": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", + "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "d3": "^7.0.0", + "dagre": "^0.8.5", + "dagre-d3": "^0.6.4", + "dompurify": "2.3.6", + "graphlib": "^2.1.8", + "khroma": "^2.0.0", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" + } + }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + }, + "node_modules/message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "dependencies": { + "lodash.template": "^4.5.0" + } + }, + "node_modules/meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, + "node_modules/meteor-node-stubs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", + "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", + "bundleDependencies": [ + "assert", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "crypto-browserify", + "domain-browser", + "events", + "https-browserify", + "os-browserify", + "path-browserify", + "process", + "punycode", + "querystring-es3", + "readable-stream", + "stream-browserify", + "stream-http", + "string_decoder", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ], + "dependencies": { + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", + "elliptic": "^6.5.4", + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/assert": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/bn.js": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/brorand": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/browserify-aes": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-des": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-sign": { + "version": "4.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer-xor": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/call-bind": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/cipher-base": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/console-browserify": { + "version": "1.2.0", + "inBundle": true + }, + "node_modules/meteor-node-stubs/node_modules/constants-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-hash": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-hmac": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { + "version": "3.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/define-properties": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/des.js": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { + "version": "5.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/domain-browser": { + "version": "4.19.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic": { + "version": "6.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/es-abstract": { + "version": "1.18.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/foreach": { + "version": "2.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-bigints": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-symbols": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash-base": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash.js": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/https-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/meteor-node-stubs/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/is-arguments": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-bigint": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-callable": { + "version": "1.2.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-date-object": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-generator-function": { + "version": "1.0.9", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-nan": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-number-object": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-regex": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-string": { + "version": "1.0.6", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-typed-array": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/md5.js": { + "version": "1.3.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/object-inspect": { + "version": "1.10.3", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-is": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-keys": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/object.assign": { + "version": "4.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/os-browserify": { + "version": "0.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pako": { + "version": "1.0.11", + "inBundle": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/meteor-node-stubs/node_modules/parse-asn1": { + "version": "5.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/path-browserify": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pbkdf2": { + "version": "3.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/meteor-node-stubs/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt": { + "version": "4.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/punycode": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/querystring": { + "version": "0.2.0", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring-es3": { + "version": "0.2.1", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/randombytes": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/randomfill": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/meteor-node-stubs/node_modules/ripemd160": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/setimmediate": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/sha.js": { + "version": "2.4.11", + "inBundle": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-browserify": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/stream-http": { + "version": "3.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/timers-browserify": { + "version": "2.0.12", + "inBundle": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/tty-browserify": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/url": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/util": { + "version": "0.12.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/vm-browserify": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/which-typed-array": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/xtend": { + "version": "4.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "node_modules/mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, + "node_modules/mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "optional": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + }, + "node_modules/nodemailer": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "dependencies": { + "path-to-regexp": "~1.2.1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simpl-schema": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.2.tgz", + "integrity": "sha512-FaisAjfJEt7Ie7K39wNqb/0F7FQ1q7yXmZcNa5JEBiPA9hIt4MpWMouL9mLqNB89alGpZAEiU7U9BelDxRqCVg==", + "dependencies": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, + "node_modules/sinon": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", + "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", + "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" + }, + "node_modules/summernote": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", + "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", + "hasInstallScript": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "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" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.10.0" + } + }, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz", + "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==" + }, + "@babel/core": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "requires": { + "@babel/types": "^7.18.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + }, + "@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + } + }, + "@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", + "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==" + }, + "@babel/runtime": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", + "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.5", + "@babel/types": "^7.18.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@braintree/sanitize-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", + "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" + }, + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@types/node": { + "version": "14.18.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", + "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" + }, + "@wekanteam/cli-table3": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", + "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", + "requires": { + "string-width": "^5.1.2" + } + }, + "@wekanteam/markdown-it-mermaid": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", + "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", + "requires": { + "@wekanteam/cli-table3": "^0.7.6", + "mermaid": "^9.0.1" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "requires": { + "precond": "0.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "requires": { + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", + "escalade": "^3.1.1", + "node-releases": "^2.0.5", + "picocolors": "^1.0.0" + } + }, + "bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, + "bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==" + }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.0.tgz", + "integrity": "sha512-v2/hZoRcRrvQiBoGsHwmRdr+S4oICKcjA6xb2qjVurin6TpcDC1X2CIDa8rdu/d5n8RT/Sdoos2IlnpQ1rXs5A==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, + "d3": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", + "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", + "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-contour": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" + }, + "d3-geo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "requires": { + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "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" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "dayjs": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", + "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, + "dompurify": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", + "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" + }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "electron-to-chromium": { + "version": "1.4.154", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.154.tgz", + "integrity": "sha512-GbV9djOkrnj6xmW+YYVVEI3VCQnJ0pnSTu7TW2JyjKd5cakoiSaG5R4RbEtfaD92GsY10DzbU3GYRe+IOA9kqA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "exceljs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", + "requires": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.5.0", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + } + }, + "extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==" + }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fibers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", + "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", + "requires": { + "detect-libc": "^1.0.3" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "i18next": { + "version": "21.8.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.9.tgz", + "integrity": "sha512-PY9a/8ADVmnju1tETeglbbVQi+nM5pcJQWm9kvKMTE3GPgHHtpDsHy5HQ/hccz2/xtW7j3vuso23JdQSH0EttA==", + "requires": { + "@babel/runtime": "^7.17.2" + } + }, + "i18next-sprintf-postprocessor": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", + "integrity": "sha512-c/IT9xuMyTfJ/3Ds+DPtb0vYVuykbMyGChZ5OGZTzFDV7Kgst1nrNOwdbZ+PkcA5kLXEE3U0RKkNbabj07261w==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "jQuery": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", + "integrity": "sha512-hf/hWBnkFhu4FzP96tBjZNPF9qTcUaOKFA8hpVJX0Cb/892JefRzoVGCe/vkmry/pOhZiK6VnQvnuV8CoHf1rA==" + }, + "jquery-ui": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", + "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", + "requires": { + "jquery": ">=1.8.0 <4.0.0" + }, + "dependencies": { + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + } + } + }, + "jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha512-Q/7aAd+SjbV0SspHO7Kuk96NJIbLwJAS0lD81U1PKcU2T5ZKayXMORH+Y5qvYLuy41xqVQbWimsRKDn1v3oI2Q==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + }, + "jszip": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ldap-filter": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ldapjs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", + "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", + "requires": { + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "ldap-filter": "^0.3.3", + "once": "^1.4.0", + "vasync": "^2.2.0", + "verror": "^1.8.1" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } + } + }, + "markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "mermaid": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", + "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", + "requires": { + "@braintree/sanitize-url": "^6.0.0", + "d3": "^7.0.0", + "dagre": "^0.8.5", + "dagre-d3": "^0.6.4", + "dompurify": "2.3.6", + "graphlib": "^2.1.8", + "khroma": "^2.0.0", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" + }, + "dependencies": { + "dompurify": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", + "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" + } + } + }, + "message-box": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", + "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", + "requires": { + "lodash.template": "^4.5.0" + } + }, + "meteor-accounts-t9n": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", + "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" + }, + "meteor-node-stubs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", + "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", + "requires": { + "assert": "*", + "browserify-zlib": "*", + "buffer": "*", + "console-browserify": "*", + "constants-browserify": "*", + "crypto-browserify": "*", + "domain-browser": "*", + "elliptic": "^6.5.4", + "events": "*", + "https-browserify": "*", + "os-browserify": "*", + "path-browserify": "*", + "process": "*", + "punycode": "*", + "querystring-es3": "*", + "readable-stream": "*", + "stream-browserify": "*", + "stream-http": "*", + "string_decoder": "*", + "timers-browserify": "*", + "tty-browserify": "*", + "url": "*", + "util": "*", + "vm-browserify": "*" + }, + "dependencies": { + "asn1.js": { + "version": "5.4.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "assert": { + "version": "2.0.0", + "bundled": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "available-typed-arrays": { + "version": "1.0.4", + "bundled": true + }, + "base64-js": { + "version": "1.5.1", + "bundled": true + }, + "bn.js": { + "version": "5.2.0", + "bundled": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "bundled": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "bundled": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "bundled": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "bundled": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.7.1", + "bundled": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "bundled": true + }, + "call-bind": { + "version": "1.0.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "bundled": true + }, + "constants-browserify": { + "version": "1.0.0", + "bundled": true + }, + "create-ecdh": { + "version": "4.0.4", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "bundled": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "des.js": { + "version": "1.0.1", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "domain-browser": { + "version": "4.19.0", + "bundled": true + }, + "elliptic": { + "version": "6.5.4", + "bundled": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "es-abstract": { + "version": "1.18.3", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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": { + "version": "1.2.1", + "bundled": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "bundled": true + }, + "events": { + "version": "3.3.0", + "bundled": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "foreach": { + "version": "2.0.5", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "get-intrinsic": { + "version": "1.1.1", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.2", + "bundled": true + }, + "hash-base": { + "version": "3.1.0", + "bundled": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "bundled": true + }, + "ieee754": { + "version": "1.2.1", + "bundled": true + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.0", + "bundled": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.2", + "bundled": true + }, + "is-boolean-object": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "bundled": true + }, + "is-date-object": { + "version": "1.0.4", + "bundled": true + }, + "is-generator-function": { + "version": "1.0.9", + "bundled": true + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "bundled": true + }, + "is-number-object": { + "version": "1.0.5", + "bundled": true + }, + "is-regex": { + "version": "1.1.3", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "bundled": true + }, + "is-symbol": { + "version": "1.0.4", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true + }, + "object-inspect": { + "version": "1.10.3", + "bundled": true + }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "bundled": true + }, + "object.assign": { + "version": "4.1.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "bundled": true + }, + "pako": { + "version": "1.0.11", + "bundled": true + }, + "parse-asn1": { + "version": "5.1.6", + "bundled": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "path-browserify": { + "version": "1.0.1", + "bundled": true + }, + "pbkdf2": { + "version": "3.1.2", + "bundled": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "process": { + "version": "0.11.10", + "bundled": true + }, + "public-encrypt": { + "version": "4.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "bundled": true + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "querystring": { + "version": "0.2.0", + "bundled": true + }, + "querystring-es3": { + "version": "0.2.1", + "bundled": true + }, + "randombytes": { + "version": "2.1.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "bundled": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "setimmediate": { + "version": "1.0.5", + "bundled": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "stream-browserify": { + "version": "3.0.0", + "bundled": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.2.0", + "bundled": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "timers-browserify": { + "version": "2.0.12", + "bundled": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tty-browserify": { + "version": "0.0.1", + "bundled": true + }, + "unbox-primitive": { + "version": "1.0.1", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "url": { + "version": "0.11.0", + "bundled": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "bundled": true + } + } + }, + "util": { + "version": "0.12.4", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "vm-browserify": { + "version": "1.1.2", + "bundled": true + }, + "which-boxed-primitive": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.4", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "xtend": { + "version": "4.0.2", + "bundled": true + } + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" + }, + "moment-mini": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", + "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" + }, + "mongo-object": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", + "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" + }, + "mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "optional": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true + }, + "nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + }, + "nodemailer": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", + "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } + }, + "os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "page": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", + "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", + "requires": { + "path-to-regexp": "~1.2.1" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-to-regexp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", + "integrity": "sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg==", + "requires": { + "isarray": "0.0.1" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simpl-schema": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.2.tgz", + "integrity": "sha512-FaisAjfJEt7Ie7K39wNqb/0F7FQ1q7yXmZcNa5JEBiPA9hIt4MpWMouL9mLqNB89alGpZAEiU7U9BelDxRqCVg==", + "requires": { + "clone": "^2.1.2", + "message-box": "^0.2.7", + "mongo-object": "^0.1.4" + } + }, + "sinon": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", + "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "requires": {} + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "stylis": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", + "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" + }, + "summernote": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", + "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "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" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "vasync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", + "requires": { + "verror": "1.10.0" + }, + "dependencies": { + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } + }, + "verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } + } + } +} From c48299c0dd680f95c858ed62189c1a2c4fef66c0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Tue, 14 Jun 2022 09:11:27 +0300 Subject: [PATCH 216/246] Try to fix nap --- package-lock.json | 5203 +-------------------------------------------- 1 file changed, 47 insertions(+), 5156 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35c5e02bd..c60a0c011 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5116 +1,8 @@ { "name": "wekan", "version": "v6.28.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "wekan", - "version": "v6.28.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.15.5", - "@babel/runtime": "^7.15.4", - "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.4", - "ajv": "^6.12.6", - "babel-runtime": "^6.26.0", - "bcryptjs": "^2.4.3", - "bson": "^4.5.2", - "bunyan": "^1.8.15", - "core-js": "^3.18.2", - "dompurify": "^2.3.2", - "es6-promise": "^4.2.4", - "escape-string-regexp": "^5.0.0", - "exceljs": "^4.2.1", - "fibers": "^5.0.0", - "i18next": "^21.6.16", - "i18next-sprintf-postprocessor": "^0.2.2", - "jQuery": "^1.7.4", - "jquery-ui": "^1.13.0", - "jquery-ui-touch-punch": "^0.2.3", - "jszip": "^3.7.1", - "ldapjs": "^2.3.1", - "markdown-it": "^12.3.2", - "markdown-it-emoji": "^2.0.0", - "meteor-accounts-t9n": "^2.6.0", - "meteor-node-stubs": "^1.1.0", - "moment": "^2.29.3", - "mongodb": "^3.7.3", - "nodemailer": "^6.6.3", - "os": "^0.1.2", - "page": "^1.11.6", - "papaparse": "^5.3.1", - "qs": "^6.10.1", - "simpl-schema": "^1.12.0", - "source-map-support": "^0.5.20", - "summernote": "^0.8.20", - "uuid": "^8.3.2" - }, - "devDependencies": { - "babel-plugin-istanbul": "^6.1.1", - "chai": "^4.3.6", - "chai-as-promised": "^7.1.1", - "flatted": "^3.2.2", - "sinon": "^13.0.2", - "sinon-chai": "^3.7.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz", - "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", - "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.5", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.5", - "@babel/types": "^7.18.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", - "dependencies": { - "@babel/types": "^7.18.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz", - "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz", - "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.5", - "@babel/types": "^7.18.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", - "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", - "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" - }, - "node_modules/@wekanteam/cli-table3": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", - "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", - "dependencies": { - "string-width": "^5.1.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@wekanteam/markdown-it-mermaid": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", - "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", - "dependencies": { - "@wekanteam/cli-table3": "^0.7.6", - "mermaid": "^9.0.1" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", - "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001349", - "electron-to-chromium": "^1.4.147", - "escalade": "^3.1.1", - "node-releases": "^2.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", - "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.0.tgz", - "integrity": "sha512-v2/hZoRcRrvQiBoGsHwmRdr+S4oICKcjA6xb2qjVurin6TpcDC1X2CIDa8rdu/d5n8RT/Sdoos2IlnpQ1rXs5A==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", - "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "3", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", - "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/dagre-d3/node_modules/d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/dagre-d3/node_modules/d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "node_modules/dagre-d3/node_modules/d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/dagre-d3/node_modules/d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/dagre-d3/node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/dagre-d3/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "node_modules/dagre-d3/node_modules/d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "dependencies": { - "d3-dsv": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/dagre-d3/node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/dagre-d3/node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/dagre-d3/node_modules/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "node_modules/dagre-d3/node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/dagre-d3/node_modules/d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "node_modules/dagre-d3/node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "node_modules/dagre-d3/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/dagre-d3/node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/dagre-d3/node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/dagre-d3/node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "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" - } - }, - "node_modules/dagre-d3/node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre-d3/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dayjs": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", - "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dompurify": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.8.tgz", - "integrity": "sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.154", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.154.tgz", - "integrity": "sha512-GbV9djOkrnj6xmW+YYVVEI3VCQnJ0pnSTu7TW2JyjKd5cakoiSaG5R4RbEtfaD92GsY10DzbU3GYRe+IOA9kqA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exceljs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", - "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", - "dependencies": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fibers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.1.tgz", - "integrity": "sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fibers/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/i18next": { - "version": "21.8.9", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.9.tgz", - "integrity": "sha512-PY9a/8ADVmnju1tETeglbbVQi+nM5pcJQWm9kvKMTE3GPgHHtpDsHy5HQ/hccz2/xtW7j3vuso23JdQSH0EttA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.17.2" - } - }, - "node_modules/i18next-sprintf-postprocessor": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/i18next-sprintf-postprocessor/-/i18next-sprintf-postprocessor-0.2.2.tgz", - "integrity": "sha512-c/IT9xuMyTfJ/3Ds+DPtb0vYVuykbMyGChZ5OGZTzFDV7Kgst1nrNOwdbZ+PkcA5kLXEE3U0RKkNbabj07261w==" - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jQuery": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/jQuery/-/jQuery-1.7.4.tgz", - "integrity": "sha512-hf/hWBnkFhu4FzP96tBjZNPF9qTcUaOKFA8hpVJX0Cb/892JefRzoVGCe/vkmry/pOhZiK6VnQvnuV8CoHf1rA==", - "deprecated": "This is deprecated. Please use 'jquery' (all lowercase).", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/jquery-ui": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.1.tgz", - "integrity": "sha512-2VlU59N5P4HaumDK1Z3XEVjSvegFbEOQRgpHUBaB2Ak98Axl3hFhJ6RFcNQNuk9SfL6WxIbuLst8dW/U56NSiA==", - "dependencies": { - "jquery": ">=1.8.0 <4.0.0" - } - }, - "node_modules/jquery-ui-touch-punch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", - "integrity": "sha512-Q/7aAd+SjbV0SspHO7Kuk96NJIbLwJAS0lD81U1PKcU2T5ZKayXMORH+Y5qvYLuy41xqVQbWimsRKDn1v3oI2Q==" - }, - "node_modules/jquery-ui/node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", - "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", - "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/mermaid": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", - "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre": "^0.8.5", - "dagre-d3": "^0.6.4", - "dompurify": "2.3.6", - "graphlib": "^2.1.8", - "khroma": "^2.0.0", - "moment-mini": "^2.24.0", - "stylis": "^4.0.10" - } - }, - "node_modules/mermaid/node_modules/dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - }, - "node_modules/message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "dependencies": { - "lodash.template": "^4.5.0" - } - }, - "node_modules/meteor-accounts-t9n": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/meteor-accounts-t9n/-/meteor-accounts-t9n-2.6.0.tgz", - "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" - }, - "node_modules/meteor-node-stubs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", - "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", - "bundleDependencies": [ - "assert", - "browserify-zlib", - "buffer", - "console-browserify", - "constants-browserify", - "crypto-browserify", - "domain-browser", - "events", - "https-browserify", - "os-browserify", - "path-browserify", - "process", - "punycode", - "querystring-es3", - "readable-stream", - "stream-browserify", - "stream-http", - "string_decoder", - "timers-browserify", - "tty-browserify", - "url", - "util", - "vm-browserify" - ], - "dependencies": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", - "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/call-bind": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "4.19.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/es-abstract": { - "version": "1.18.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/foreach": { - "version": "2.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-bigints": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/has-symbols": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/is-arguments": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-bigint": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-callable": { - "version": "1.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-date-object": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-generator-function": { - "version": "1.0.9", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-nan": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-number-object": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-regex": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-string": { - "version": "1.0.6", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-symbol": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-typed-array": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-inspect": { - "version": "1.10.3", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-is": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/object-keys": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/meteor-node-stubs/node_modules/object.assign": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.12.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/which-typed-array": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "node_modules/mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "node_modules/mongodb": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", - "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.1.8", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "optional": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" - }, - "node_modules/nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optional-require": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", - "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", - "dependencies": { - "require-at": "^1.0.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "dependencies": { - "path-to-regexp": "~1.2.1" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", - "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha512-DBw9IhWfevR2zCVwEZURTuQNseCvu/Q9f5ZgqMCK0Rh61bDa4uyjPAOy9b55yKiPT59zZn+7uYKxmWwsguInwg==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.10.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", - "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/require-at": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", - "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simpl-schema": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.2.tgz", - "integrity": "sha512-FaisAjfJEt7Ie7K39wNqb/0F7FQ1q7yXmZcNa5JEBiPA9hIt4MpWMouL9mLqNB89alGpZAEiU7U9BelDxRqCVg==", - "dependencies": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "node_modules/sinon": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", - "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylis": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", - "integrity": "sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==" - }, - "node_modules/summernote": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/summernote/-/summernote-0.8.20.tgz", - "integrity": "sha512-W9RhjQjsn+b1s9xiJQgJbCiYGJaDAc9CdEqXo+D13WuStG8lCdtKaO5AiNiSSMJsQJN2EfGSwbBQt+SFE2B8Kw==", - "hasInstallScript": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "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" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "verror": "1.10.0" - } - }, - "node_modules/vasync/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", @@ -7420,30 +2312,30 @@ "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.3.tgz", "integrity": "sha512-2kyYFh45428+q8EjydBhyHqPO30CG09yQ6xRNHMJSiFLqHaVoRJE1tWr7QrBKstjy8HkNH4UuKSp5S11HeZv/w==", "requires": { - "assert": "*", - "browserify-zlib": "*", - "buffer": "*", - "console-browserify": "*", - "constants-browserify": "*", - "crypto-browserify": "*", - "domain-browser": "*", + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.19.0", "elliptic": "^6.5.4", - "events": "*", - "https-browserify": "*", - "os-browserify": "*", - "path-browserify": "*", - "process": "*", - "punycode": "*", - "querystring-es3": "*", - "readable-stream": "*", - "stream-browserify": "*", - "stream-http": "*", - "string_decoder": "*", - "timers-browserify": "*", - "tty-browserify": "*", - "url": "*", - "util": "*", - "vm-browserify": "*" + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" }, "dependencies": { "asn1.js": { @@ -8084,13 +2976,6 @@ "xtend": "^4.0.2" } }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string.prototype.trimend": { "version": "1.0.4", "bundled": true, @@ -8107,6 +2992,13 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "timers-browserify": { "version": "2.0.12", "bundled": true, @@ -8669,8 +3561,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "requires": {} + "dev": true }, "source-map": { "version": "0.6.1", @@ -8701,21 +3592,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -8741,6 +3617,21 @@ } } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", From bd26ed7f7a4246f7eba5b4d81cd83b7a11b265da Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 16 Jun 2022 00:56:54 +0300 Subject: [PATCH 217/246] Try to fix Snap. --- snap-src/bin/database-list-backups | 4 ++ snapcraft.yaml | 93 +++++++++++++++++++----------- 2 files changed, 62 insertions(+), 35 deletions(-) create mode 100755 snap-src/bin/database-list-backups diff --git a/snap-src/bin/database-list-backups b/snap-src/bin/database-list-backups new file mode 100755 index 000000000..ceede49b7 --- /dev/null +++ b/snap-src/bin/database-list-backups @@ -0,0 +1,4 @@ +#!/bin/bash + +# List backups +ls -al $SNAP_COMMON/db-backups/ diff --git a/snapcraft.yaml b/snapcraft.yaml index b1c5160fc..d5500f046 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -35,47 +35,56 @@ slots: apps: wekan: - command: wekan-control + command: ./bin/wekan-control daemon: simple plugs: [network, network-bind] mongodb: - command: mongodb-control + command: ./bin/mongodb-control daemon: simple plugs: [network, network-bind] caddy: - command: caddy-control + command: ./bin/caddy-control daemon: simple plugs: [network, network-bind] help: - command: wekan-help + command: ./bin/wekan-help database-backup: - command: mongodb-backup + command: ./bin/mongodb-backup plugs: [network, network-bind] database-list-backups: - command: ls -al $SNAP_COMMON/db-backups/ + command: ./bin/database-list-backups database-restore: - command: mongodb-restore + command: ./bin/mongodb-restore plugs: [network, network-bind] parts: mongodb: - source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-5.0.8.tgz + source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-5.0.9.tgz plugin: dump stage-packages: - libssl1.1 - - libcurl3-dev - - libcurl4-openssl-dev + - libcurl4 + - libstemmer0d + - zlib1g + - libsnappy1v5 + - libyaml-cpp0.6 + - libpcre3 + - libpcrecpp0v5 + - libboost-system1.71.0 + - libboost-iostreams1.71.0 + - libboost-filesystem1.71.0 + - libboost-program-options1.71.0 + - libgoogle-perftools4 filesets: mongo: - - usr - bin - - lib + - usr stage: - $mongo prime: @@ -106,7 +115,7 @@ parts: - libfontconfig1 override-build: | echo "Cleaning environment first" - rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules + #rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules rm -rf .build #echo "Using http npm packages so speedup install process https://stackoverflow.com/questions/39760113/callback-called-more-than-once-while-running-npm-install" #echo "registry=http://registry.npmjs.org/" > ~/.npmrc @@ -116,32 +125,40 @@ parts: #npm -g install node-gyp --unsafe-perm #npm -g install node-pre-gyp --unsafe-perm #npm -g install fibers --unsafe-perm - echo "Installing meteor" - curl https://install.meteor.com/ -o install_meteor.sh - chmod +x install_meteor.sh - sh install_meteor.sh - rm install_meteor.sh + ##echo "Installing meteor" + ##curl https://install.meteor.com/ -o install_meteor.sh + ##chmod +x install_meteor.sh + ##sh install_meteor.sh + ##rm install_meteor.sh #npm -g install meteor --unsafe-perm --allow-superuser - rm -rf .build - chmod u+w *.json - npm install --unsafe-perm - meteor build .build --directory --allow-superuser + #rm -rf .build + ##chmod u+w *.json + #npm install --unsafe-perm + ##npm install + ##meteor build .build --directory --allow-superuser # Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. - rm -rf .build/bundle/programs/web.browser.legacy + ##rm -rf .build/bundle/programs/web.browser.legacy # Change to directory .build/bundle/programs/server - cd .build/bundle/programs/server - chmod u+w *.json - npm install --unsafe-perm - cd node_modules/fibers - node build.js - cd ../../../../../.. + ##cd .build/bundle/programs/server + ##chmod u+w *.json + #npm install --unsafe-perm + ##npm install + ##cd node_modules/fibers + ##node build.js + ##cd ../../../../../.. # Cleanup - cd .build/bundle - find . -type d -name '*-garbage*' | xargs rm -rf - find . -name '*phantom*' | xargs rm -rf - find . -name '.*.swp' | xargs rm -f - find . -name '*.swp' | xargs rm -f - cd ../.. + mkdir .build + cd .build + wget https://github.com/wekan/wekan/releases/download/v6.28/wekan-6.28-amd64.zip + unzip wekan-6.28-amd64.zip + rm wekan-6.28-amd64.zip + cd .. + ##cd .build/bundle + ##find . -type d -name '*-garbage*' | xargs rm -rf + ##find . -name '*phantom*' | xargs rm -rf + ##find . -name '.*.swp' | xargs rm -f + ##find . -name '*.swp' | xargs rm -f + ##cd ../.. # Add fibers multi arch #cd .build/bundle/programs/server/node_modules/fibers/bin #curl https://releases.wekan.team/fibers-multi.7z -o fibers-multi.7z @@ -149,6 +166,12 @@ parts: #rm fibers-multi.7z #cd ../../../../../../.. # Copy to Snap + wget https://nodejs.org/dist/latest-v14.x/node-v14.19.3-linux-x64.tar.xz + tar -xf node-v14.19.3-linux-x64.tar.xz node-v14.19.3-linux-x64/bin/node + rm node-v14.19.3-linux-x64.tar.xz + mkdir $SNAPCRAFT_PART_INSTALL/bin + cp -p node-v14.19.3-linux-x64/bin/node $SNAPCRAFT_PART_INSTALL/bin/ + rm -rf node-v14.19.3-linux-x64 cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/ cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/ rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan From 1c2c3d9dea54094ce767587b4e2c6bc49dadf321 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 16 Jun 2022 01:04:17 +0300 Subject: [PATCH 218/246] Try to fix Snap: Add wget --- snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snapcraft.yaml b/snapcraft.yaml index d5500f046..6430e694a 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -107,6 +107,7 @@ parts: - g++ - capnproto - curl + - wget - execstack - nodejs - npm From e9982e34ed06a4b917bcfe26ed56f299dfd16925 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 16 Jun 2022 01:57:51 +0300 Subject: [PATCH 219/246] Try to fix Snap. --- snapcraft.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/snapcraft.yaml b/snapcraft.yaml index 6430e694a..df5a8504b 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -90,6 +90,16 @@ parts: prime: - $mongo + mongodb44: + plugin: dump + source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.14.tgz + source-type: tgz + organize: + bin: mongo44bin + usr: mongo44usr + stage: + - -init + wekan: source: . plugin: npm @@ -108,6 +118,7 @@ parts: - capnproto - curl - wget + - unzip - execstack - nodejs - npm From 709b17805b339b4392bdb2b7da4dae2f11a9c32a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 16 Jun 2022 02:00:54 +0300 Subject: [PATCH 220/246] Try to fix Snap. --- snapcraft.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index df5a8504b..20abe4e8a 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -91,9 +91,8 @@ parts: - $mongo mongodb44: - plugin: dump source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.14.tgz - source-type: tgz + plugin: dump organize: bin: mongo44bin usr: mongo44usr From c8bb3c73534007b27f8c351cb9fe55ab292283bc Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 16 Jun 2022 03:11:56 +0300 Subject: [PATCH 221/246] Try migrate mongo 3 to mongo 5. --- snap-src/bin/mongodb-control | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/snap-src/bin/mongodb-control b/snap-src/bin/mongodb-control index 444d62f40..f0af0b1f3 100755 --- a/snap-src/bin/mongodb-control +++ b/snap-src/bin/mongodb-control @@ -17,6 +17,46 @@ fi export LC_ALL=C export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/${SNAP_NAME}/current/lib/x86_64-linux-gnu +if test -f "$SNAP_COMMON/01-migrate-mongo3-to-mongo5.txt"; then + touch "$SNAP_COMMON/01-migrate-mongo3-to-mongo5.txt" + # Stop MongoDB + touch "$SNAP_COMMON/02-disable-mongo.txt" + snapctl stop --disable ${SNAP_NAME}.mongodb + touch "$SNAP_COMMON/03-eval-stop-mongo.txt" + mongo wekan --eval "db.getSiblingDB('admin').shutdownServer()" $BIND_OPTIONS + # Start MongoDB 4.4 + touch "$SNAP_COMMON/04-start-mongo44.txt" + $SNAP/mongo44bin/mongod --dbpath $SNAP_COMMON --logpath $SNAP_COMMON/02_mongodb_log_while_migrate.txt --logappend --journal $MONGO_URL --quiet + # Wait MongoDB 4.4 to start + touch "$SNAP_COMMON/05-wait-2s-mongo44-start.txt" + sleep 2s + # Dump Old MongoDB 3.x database + touch "$SNAP_COMMON/06-dump-database.txt" + (cd $SNAP_COMMON && mongodump --port ${MONGODB_PORT}) + # Stop MongoDB 4.4 + touch "$SNAP_COMMON/07-stop-mongo44.txt" + $SNAP/mongo44bin/mongo wekan --eval "db.getSiblingDB('admin').shutdownServer()" $BIND_OPTIONS + # Wait MongoDB 4.4 to stop + touch "$SNAP_COMMON/08-wait-2s-mongo44-stop.txt" + sleep 2s + # Start MongoDB 5 + touch "$SNAP_COMMON/09-start-mongo5.txt" + mongod --dbpath $SNAP_COMMON --logpath $SNAP_COMMON/10_mongodb_log_while_migrate.txt --logappend --journal $MONGO_URL --quiet + # Restore database + touch "$SNAP_COMMON/11-mongorestore-to-mongo5.txt" + (cd $SNAP_COMMON && mongorestore --port ${MONGODB_PORT}) + # Wait 5s + touch "$SNAP_COMMON/12-wait-5s-after-restore.txt" + sleep 5s + # Shutdown mongodb + touch "$SNAP_COMMON/13-shutdown-mongodb.txt" + mongo wekan --eval "db.getSiblingDB('admin').shutdownServer()" $BIND_OPTIONS + touch "$SNAP_COMMON/14-wait-5s-after-mongo5-shutdown.txt" + sleep 5s + # Enable MongoDB 5 + touch "$SNAP_COMMON/15-enable-mongo-5.txt" + snapctl start --enable ${SNAP_NAME}.mongodb +fi # When starting MongoDB, if logfile exist, delete it, because now uses syslog instead of logfile, # because syslog usually already has log rotation. # https://github.com/wekan/wekan-snap/issues/92 From 01d0dd3b1dd0a3c9764e7c9d31eab739db2d3ad8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sun, 19 Jun 2022 09:26:25 +0300 Subject: [PATCH 222/246] Resizeable size of list width and height. Size is not saved yet. In Progress. Thanks to NLBlackEagle and xet7 ! Related #4558 --- client/components/lists/list.css | 5 +++-- client/components/swimlanes/swimlanes.js | 2 ++ models/lists.js | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/client/components/lists/list.css b/client/components/lists/list.css index 2988da7e4..6cb03cab1 100644 --- a/client/components/lists/list.css +++ b/client/components/lists/list.css @@ -7,8 +7,9 @@ border-left: 1px solid #ccc; padding: 0; float: left; - min-width: 270px; - max-width: 270px; + width: 270px; /* Orinal width: 270px. Changes not saved yet: */ + resize: both; /* - List width and height resizeable */ + overflow: auto; /* - List width and height resizeable */ } .list:first-child { margin-left: 5px; diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index 59d3c231c..fca807d8a 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -80,6 +80,8 @@ function initSortable(boardComponent, $listsDom) { Lists.update(list._id, { $set: { sort: sortIndex.base, + width: list._id.width(), + height: list._id.height(), }, }); diff --git a/models/lists.js b/models/lists.js index 80e0914dc..09be14248 100644 --- a/models/lists.js +++ b/models/lists.js @@ -79,6 +79,21 @@ Lists.attachSchema( // XXX We should probably provide a default optional: true, }, + width: { + /** + * list width, default 270px + */ + type: String, + defaultValue: '270px', + optional: true, + }, + height: { + /** + * list height + */ + type: String, + optional: true, + }, updatedAt: { /** * last update of the list From cffb5baa680b46d0a9c1accfc26982273f6e9d6a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sun, 19 Jun 2022 09:30:47 +0300 Subject: [PATCH 223/246] Updated ChangeLog. --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8e7ec825..594392333 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ # Upcoming WeKan ® release -This release adds the following updates: +This release adds the following features: + +- [Resizeable size of list width and height. Size is not saved yet. In Progress](https://github.com/wekan/wekan/commit/01d0dd3b1dd0a3c9764e7c9d31eab739db2d3ad8). + Thanks to NLBlackEagle and xet7. + +and adds the following updates: - [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263). Thanks to Ubuntu developers. From 3e5f8f458c354e6c487f17cf4f78a8511900da9c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 20 Jun 2022 08:14:05 +0300 Subject: [PATCH 224/246] Update README.md Fix typos --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d156d672..911885743 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Translations to non-English languages are accepted only at [Transifex](https://transifex.com/wekan/wekan) using webbrowser. New English strings of new features can be added as PRs to edge branch file wekan/i18n/en.i18n.json . -## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues) +## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues) Please add most of your questions as GitHub issue: [WeKan ® Feature Requests and Bugs](https://github.com/wekan/wekan/issues). It's better than at chat where details get lost when chat scrolls up. @@ -28,7 +28,7 @@ It's better than at chat where details get lost when chat scrolls up. [Discussions][discussions] - WeKan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues). -[Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ) +[WeKan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ) ## Docker: Please only use Docker release tags From f2f834e810d0071195f654cdecd3023801ff96d1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 20 Jun 2022 08:18:23 +0300 Subject: [PATCH 225/246] Update README.md Fix typos --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 911885743..0dfd09a6b 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,8 @@ install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. - WeKan ® is used in [most countries of the world](https://snapcraft.io/wekan). -- Wekan largest user has 22k users using Wekan in their company. -- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 105 languages. +- WeKan ® largest user has 22k users using WeKan ® in their company. +- WeKan ® has been [translated](https://transifex.com/wekan/wekan) to about 105 languages. - [Features][features]: WeKan ® has real-time user interface. - [Platforms][platforms]: WeKan ® supports many platforms. WeKan ® is critical part of new platforms Wekan is currently being integrated to. From 28612612bdc441922da04a00cb7dc901ec90e999 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 20 Jun 2022 08:21:21 +0300 Subject: [PATCH 226/246] Update README.md Fix typos --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0dfd09a6b..1eeb48360 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ## [Translate WeKan ® at Transifex](https://transifex.com/wekan/wekan) Translations to non-English languages are accepted only at [Transifex](https://transifex.com/wekan/wekan) using webbrowser. -New English strings of new features can be added as PRs to edge branch file wekan/i18n/en.i18n.json . +New English strings of new features can be added as PRs to master branch file wekan/imports/i18n/data/en.i18n.json . ## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues) From b4c74b8d4c35d85fbad8d391e4b52e5d3f7af78a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 20:34:39 +0000 Subject: [PATCH 227/246] Bump actions/dependency-review-action from 1 to 2 Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 1 to 2. - [Release notes](https://github.com/actions/dependency-review-action/releases) - [Commits](https://github.com/actions/dependency-review-action/compare/v1...v2) --- updated-dependencies: - dependency-name: actions/dependency-review-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/depsreview.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/depsreview.yaml b/.github/workflows/depsreview.yaml index f2605b7a7..a25de591b 100644 --- a/.github/workflows/depsreview.yaml +++ b/.github/workflows/depsreview.yaml @@ -11,4 +11,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@v3 - name: 'Dependency Review' - uses: actions/dependency-review-action@v1 + uses: actions/dependency-review-action@v2 From 6694088ac7fd8884557f9765a15f42a192fe4b82 Mon Sep 17 00:00:00 2001 From: helioguardabaxo <helio.guardabaxo@gmail.com> Date: Fri, 24 Jun 2022 16:40:03 -0300 Subject: [PATCH 228/246] Do not show archived lists on All Boards --- client/components/boards/boardsList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index b1dcc2d79..048420fa7 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -197,7 +197,7 @@ BlazeComponent.extendComponent({ }, boardLists(boardId) { let boardLists = []; - const lists = Lists.find({'boardId' : boardId}) + const lists = Lists.find({'boardId' : boardId, 'archived': false}) lists.forEach(list => { let cardCount = Cards.find({'boardId':boardId, 'listId':list._id}).count() boardLists.push(`${list.title}: ${cardCount}`); From 008fc806e86caebfe0dc090f3c55ed817f9ad42f Mon Sep 17 00:00:00 2001 From: helioguardabaxo <helio.guardabaxo@gmail.com> Date: Fri, 24 Jun 2022 21:50:07 -0300 Subject: [PATCH 229/246] Fix div max-width on My Cards table view --- client/components/main/myCards.css | 1 + 1 file changed, 1 insertion(+) diff --git a/client/components/main/myCards.css b/client/components/main/myCards.css index 4e2de1af1..1929848b9 100644 --- a/client/components/main/myCards.css +++ b/client/components/main/myCards.css @@ -63,6 +63,7 @@ .my-cards-card-title-table { font-weight: bold; padding-left: 2px; + max-width: 243px; } .my-cards-board-badge { width: 36px; From 04e04ead92bda4e8a1f01b2c4cead8eb7b651586 Mon Sep 17 00:00:00 2001 From: helioguardabaxo <helio.guardabaxo@gmail.com> Date: Fri, 24 Jun 2022 22:19:40 -0300 Subject: [PATCH 230/246] Add display timestamp on 'Boards in Archive' --- client/components/boards/boardArchive.jade | 1 + 1 file changed, 1 insertion(+) diff --git a/client/components/boards/boardArchive.jade b/client/components/boards/boardArchive.jade index 5d291f009..d9a251ebd 100644 --- a/client/components/boards/boardArchive.jade +++ b/client/components/boards/boardArchive.jade @@ -14,6 +14,7 @@ template(name="archivedBoards") i.fa.fa-undo | {{_ 'restore-board'}} = title + span {{ moment archivedAt 'LLL' }} else li.no-items-message {{_ 'no-archived-boards'}} From 7ca9e8f4d308a8dfe7dfcb38540c08a447526fa6 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 25 Jun 2022 21:58:00 +0300 Subject: [PATCH 231/246] Updated ChangeLog. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 594392333..fdfe42b87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,13 @@ and adds the following translations: - [Added translation Asturia (Spain)](https://github.com/wekan/wekan/commit/12615fef5d44cf611b3f1d9fc0a7be3e98b8c042). Thanks to translators. +and fixes the following bugs: + +- [Do not show archived lists on All Boards](https://github.com/wekan/wekan/pull/4573). + Thanks to helioguardabaxo. +- [Fix div max-width on My Cards table view](https://github.com/wekan/wekan/pull/4574). + Thanks to helioguardabaxo. + Thanks to above GitHub users for their contributions and translators for their translations. # v6.28 2022-06-08 WeKan ® release From 99b2fdbf99f26ee9df2e1ff906db2d740210f902 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 30 Jun 2022 18:35:37 +0300 Subject: [PATCH 232/246] Added translations: Arabic (Algeria) (ar_DZ), Azerbaijani (az), Azerbaijani (Azerbaijan) (az_AZ), Azerbaijani (Latin) (az@latin). Thanks to translators ! --- .tx/config | 2 +- imports/i18n/data/ar-DZ.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/ar.i18n.json | 64 +- imports/i18n/data/az-AZ.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/az-LA.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/az.i18n.json | 1181 ++++++++++++++++++++ imports/i18n/data/ko.i18n.json | 18 +- imports/i18n/languages.js | 24 + releases/translations/pull-translations.sh | 14 +- 9 files changed, 4803 insertions(+), 43 deletions(-) create mode 100644 imports/i18n/data/ar-DZ.i18n.json create mode 100644 imports/i18n/data/az-AZ.i18n.json create mode 100644 imports/i18n/data/az-LA.i18n.json create mode 100644 imports/i18n/data/az.i18n.json diff --git a/.tx/config b/.tx/config index 617b84956..8cf33ebae 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, ast_ES:ast-ES, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA +lang_map = ar_DZ:ar-DZ, ar_EG:ar-EG, az_AZ:az-AZ, az@latin:az-LA, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, ast_ES:ast-ES, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA [wekan.application] file_filter = imports/i18n/data/<lang>.i18n.json diff --git a/imports/i18n/data/ar-DZ.i18n.json b/imports/i18n/data/ar-DZ.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/ar-DZ.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index 91a72e55d..f38fa7365 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -107,7 +107,7 @@ "and-n-other-card_plural": "And __count__ other بطاقات", "apply": "طبق", "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", + "app-try-reconnect": "محاولة إعادة الاتصال.", "archive": "نقل الى الارشيف", "archive-all": "نقل الكل الى الارشيف", "archive-board": "نقل اللوح الى الارشيف", @@ -136,9 +136,9 @@ "back": "رجوع", "board-change-color": "تغيير اللومr", "show-at-all-boards-page": "Show at All Boards page", - "board-info-on-my-boards": "All Boards Settings", - "boardInfoOnMyBoardsPopup-title": "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", + "board-info-on-my-boards": "جميع إعدادات اللوحات", + "boardInfoOnMyBoardsPopup-title": "جميع إعدادات اللوحات", + "boardInfoOnMyBoards-title": "جميع إعدادات اللوحات", "show-card-counter-per-list": "Show card count per list", "show-board_members-avatar": "Show Board members avatars", "board-nb-stars": "%s نجوم", @@ -150,13 +150,13 @@ "boardChangeTitlePopup-title": "إعادة تسمية اللوحة", "boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية", "boardChangeWatchPopup-title": "تغيير المتابعة", - "boardMenuPopup-title": "Board Settings", + "boardMenuPopup-title": "إعدادات اللوحة", "boardChangeViewPopup-title": "عرض اللوحات", "boards": "لوحات", "board-view": "عرض اللوحات", "board-view-cal": "التقويم", "board-view-swimlanes": "خطوط السباحة", - "board-view-collapse": "Collapse", + "board-view-collapse": "انهيار", "board-view-gantt": "Gantt", "board-view-lists": "القائمات", "bucket-example": "مثل « todo list » على سبيل المثال", @@ -193,7 +193,7 @@ "vote-public": "Show who voted what", "vote-for-it": "مع", "vote-against": "ضد", - "deleteVotePopup-title": "Delete vote?", + "deleteVotePopup-title": "حذف التصويت؟", "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", "cardStartPlanningPokerPopup-title": "Start a Planning Poker", "card-edit-planning-poker": "Edit Planning Poker", @@ -208,10 +208,10 @@ "poker-twenty": "20", "poker-forty": "40", "poker-oneHundred": "100", - "poker-unsure": "?", + "poker-unsure": "؟", "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", + "poker-result-votes": "الأصوات", + "poker-result-who": "من", "poker-replay": "Replay", "set-estimation": "Set Estimation", "deletePokerPopup-title": "Delete planning poker?", @@ -274,7 +274,7 @@ "color-slateblue": "slateblue", "color-white": "أبيض", "color-yellow": "yellow", - "unset-color": "Unset", + "unset-color": "غير محدد", "comment": "تعليق", "comment-placeholder": "أكتب تعليق", "comment-only": "التعليق فقط", @@ -283,7 +283,7 @@ "deleteCommentPopup-title": "Delete comment?", "no-comments": "لا يوجد تعليقات", "no-comments-desc": "Can not see comments and activities.", - "worker": "Worker", + "worker": "عامل", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "حاسوب", "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", @@ -307,7 +307,7 @@ "current": "الحالي", "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", + "custom-field-currency": "عملة", "custom-field-currency-option": "Currency Code", "custom-field-date": "تاريخ", "custom-field-dropdown": "Dropdown List", @@ -543,7 +543,7 @@ "restore": "استعادة", "save": "حفظ", "search": "بحث", - "rules": "Rules", + "rules": "قواعد", "search-cards": "Search from card/list titles, descriptions and custom fields on this board", "search-example": "Write text you search and press Enter", "select-color": "اختيار اللون", @@ -832,14 +832,14 @@ "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", "r-when-a-card-is-moved": "When a card is moved to another list", "r-set": "Set", - "r-update": "Update", + "r-update": "تحديث", "r-datefield": "date field", "r-df-start-at": "بداية", "r-df-due-at": "due", "r-df-end-at": "نهاية", "r-df-received-at": "received", "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", + "r-remove-value-from": "إزالة القيمة من", "ldap": "LDAP", "oauth2": "OAuth2", "cas": "CAS", @@ -862,9 +862,9 @@ "swimlaneDeletePopup-title": "Delete Swimlane ?", "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", "restore-all": "Restore all", - "delete-all": "Delete all", + "delete-all": "حذف الكل", "loading": "Loading, please wait.", - "previous_as": "last time was", + "previous_as": "كانت آخر مرة", "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", @@ -893,13 +893,13 @@ "addmore-detail": "Add a more detailed description", "show-on-card": "Show on Card", "show-on-minicard": "Show on Minicard", - "new": "New", + "new": "جديد", "editOrgPopup-title": "Edit Organization", "newOrgPopup-title": "New Organization", "editTeamPopup-title": "Edit Team", "newTeamPopup-title": "New Team", "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", + "newUserPopup-title": "مستخدم جديد", "notifications": "Notifications", "view-all": "View All", "filter-by-unread": "Filter by Unread", @@ -909,18 +909,18 @@ "allowRenamePopup-title": "Allow Rename", "start-day-of-week": "Set day of the week start", "monday": "Monday", - "tuesday": "Tuesday", + "tuesday": "الثلاثاء", "wednesday": "Wednesday", - "thursday": "Thursday", + "thursday": "الخميس", "friday": "Friday", - "saturday": "Saturday", + "saturday": "السبت", "sunday": "Sunday", "status": "Status", "swimlane": "Swimlane", "owner": "Owner", "last-modified-at": "Last modified at", "last-activity": "Last activity", - "voting": "Voting", + "voting": "التصويت", "archived": "Archived", "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", @@ -932,8 +932,8 @@ "teams": "Teams", "displayName": "Display Name", "shortName": "Short Name", - "website": "Website", - "person": "Person", + "website": "موقع الكتروني", + "person": "شخص", "my-cards": "My Cards", "card": "بطاقة", "board": "Board", @@ -968,7 +968,7 @@ "n-cards-found": "%s Cards Found", "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", "operator-board": "لوح", - "operator-board-abbrev": "b", + "operator-board-abbrev": "ب", "operator-swimlane": "swimlane", "operator-swimlane-abbrev": "s", "operator-list": "قائمة", @@ -987,7 +987,7 @@ "operator-created": "created", "operator-modified": "modified", "operator-sort": "sort", - "operator-comment": "comment", + "operator-comment": "تعليق", "operator-has": "has", "operator-limit": "limit", "operator-debug": "debug", @@ -1114,12 +1114,12 @@ "open": "مفتوح", "pending": "Pending", "closed": "مقفل", - "resolved": "Resolved", + "resolved": "تم الحل", "cancelled": "الغاء", "history": "تاريخ", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", + "request": "طلب", + "requests": "الطلبات", + "help-request": "طلب مساعدة", "editCardSortOrderPopup-title": "Change Sorting", "cardDetailsPopup-title": "نقاصيل البطاقة", "add-teams": "اضافة فرق", diff --git a/imports/i18n/data/az-AZ.i18n.json b/imports/i18n/data/az-AZ.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/az-AZ.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/az-LA.i18n.json b/imports/i18n/data/az-LA.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/az-LA.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/az.i18n.json b/imports/i18n/data/az.i18n.json new file mode 100644 index 000000000..213f6e856 --- /dev/null +++ b/imports/i18n/data/az.i18n.json @@ -0,0 +1,1181 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "show-at-all-boards-page": "Show at All Boards page", + "board-info-on-my-boards": "All Boards Settings", + "boardInfoOnMyBoardsPopup-title": "All Boards Settings", + "boardInfoOnMyBoards-title": "All Boards Settings", + "show-card-counter-per-list": "Show card count per list", + "show-board_members-avatar": "Show Board members avatars", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "subtaskDeletePopup-title": "Delete Subtask?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", + "remove-labels-multiselect": "Multi-Selection removes labels 1-9", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "disable-forgot-password": "Disable Forgot Password", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "minicard-settings": "Minicard Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "boardMinicardSettingsPopup-title": "Minicard Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "description-on-minicard": "Description on minicard", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after <body> start", + "add-custom-html-before-body-end": "Add Custom HTML before </body> end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "show-on-minicard": "Show on Minicard", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsViewChange-title": "My Cards View", + "myCardsViewChangePopup-title": "My Cards View", + "myCardsViewChange-choice-boards": "Boards", + "myCardsViewChange-choice-table": "Table", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "org-name-not-found": "Organization '%s' not found.", + "team-name-not-found": "Team '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "operator-debug": "debug", + "operator-org": "org", + "operator-team": "team", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "predicate-selector": "selector", + "predicate-projection": "projection", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-debug-invalid": "%s is not a valid debug predicate", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "boardsReportTitle": "Boards Report", + "cardsReportTitle": "Cards Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!", + "checklistActionsPopup-title": "Checklist Actions", + "moveChecklist": "Move Checklist", + "moveChecklistPopup-title": "Move Checklist", + "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", + "copyChecklist": "Copy Checklist", + "copyChecklistPopup-title": "Copy Checklist", + "card-show-lists": "Card Show Lists", + "subtaskActionsPopup-title": "Subtask Actions", + "attachmentActionsPopup-title": "Attachment Actions", + "attachment-move-storage-fs": "Move attachment to filesystem", + "attachment-move-storage-gridfs": "Move attachment to GridFS", + "attachment-move": "Move Attachment", + "move-all-attachments-to-fs": "Move all attachments to filesystem", + "move-all-attachments-to-gridfs": "Move all attachments to GridFS", + "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", + "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", + "path": "Path", + "version-name": "Version-Name", + "size": "Size", + "storage": "Storage", + "action": "Action", + "board-title": "Board Title", + "attachmentRenamePopup-title": "Rename" +} \ No newline at end of file diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json index f97fbc05b..9f55d7fcf 100644 --- a/imports/i18n/data/ko.i18n.json +++ b/imports/i18n/data/ko.i18n.json @@ -1156,11 +1156,11 @@ "legalNotice": "legal notice", "copied": "복사됨", "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", + "moveChecklist": "체크리스트 이동", + "moveChecklistPopup-title": "체크리스트 이동", "newlineBecomesNewChecklistItem": "Newline becomes new checklist item", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", + "copyChecklist": "체크리스트 복사", + "copyChecklistPopup-title": "체크리스트 복사", "card-show-lists": "Card Show Lists", "subtaskActionsPopup-title": "Subtask Actions", "attachmentActionsPopup-title": "Attachment Actions", @@ -1171,11 +1171,11 @@ "move-all-attachments-to-gridfs": "Move all attachments to GridFS", "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", + "path": "경로", + "version-name": "버전 이름", + "size": "크기", + "storage": "저장소", "action": "동작", - "board-title": "Board Title", + "board-title": "보드 제목", "attachmentRenamePopup-title": "새이름" } \ No newline at end of file diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index 3b297d26a..74ddafcee 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -1,4 +1,10 @@ export default { + "ar-DZ": { + code: "ar", + tag: "ar-DZ", + name: "دزيرية", + load: () => import('./data/ar-DZ.i18n.json'), + }, "ar-EG": { code: "ar", tag: "ar-EG", @@ -17,6 +23,24 @@ export default { name: "عربي مغربي", load: () => import('./data/ary.i18n.json'), }, + "az-AZ": { + code: "az", + tag: "az-AZ", + name: "Azərbaycan (Azərbaycan)", + load: () => import('./data/az-AZ.i18n.json'), + }, + "az-LA": { + code: "az", + tag: "az-LA", + name: "Azərbaycan (Latin)", + load: () => import('./data/az-LA.i18n.json'), + }, + "az": { + code: "az", + tag: "az", + name: "Azərbaycan", + load: () => import('./data/az.i18n.json'), + }, "bg": { code: "bg", tag: "bg", diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index a6931f1a3..51ed34c24 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -6,9 +6,21 @@ tx pull -f -l ar echo "Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo):" tx pull -f -l ar_EG -echo "Arabic (Moroccan)" +echo "Arabic (Moroccan):" tx pull -f -l ary +echo "Arabic (Algeria):" +tx pull -f -l ar_DZ + +echo "Azerbaijani:" +tx pull -f -l az + +echo "Azerbaijani (Azerbaijan):" +tx pull -f -l az_AZ + +echo "Azerbaijani (Latin):" +tx pull -f -l az@latin + echo "Armenian:" tx pull -f -l hy From 83a78c792a71c1485f427cb6e15951db2c43288c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 30 Jun 2022 18:40:04 +0300 Subject: [PATCH 233/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdfe42b87..48468db6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ and adds the following translations: - [Added translation Asturia (Spain)](https://github.com/wekan/wekan/commit/12615fef5d44cf611b3f1d9fc0a7be3e98b8c042). Thanks to translators. +- [Added translations: Arabic (Algeria) (ar_DZ), Azerbaijani (az), Azerbaijani (Azerbaijan) (az_AZ), Azerbaijani (Latin) (az@latin)](https://github.com/wekan/wekan/commit/99b2fdbf99f26ee9df2e1ff906db2d740210f902). + Thanks to translators. and fixes the following bugs: From c3bfcb78e9047a84d43041bebcec56718eaa140b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 30 Jun 2022 18:43:37 +0300 Subject: [PATCH 234/246] Updated ostrio:files . Thanks to developers of dependencies ! --- .meteor/versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.meteor/versions b/.meteor/versions index 5b9bed272..1ac3027c5 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -125,7 +125,7 @@ ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 ostrio:cookies@2.7.2 ostrio:cstorage@4.0.1 -ostrio:files@2.1.1 +ostrio:files@2.2.1 ostrio:i18n@3.2.0 pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 From 88f05e8c4ec87af766fe1eab268cffdb52df970c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Thu, 30 Jun 2022 18:45:11 +0300 Subject: [PATCH 235/246] Updated ChangeLog. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48468db6f..0bd53e6e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ and adds the following updates: - [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263). Thanks to Ubuntu developers. -- [Updated ostrio:files](https://github.com/wekan/wekan/commit/0d67a86f2c9c1c9696d8507c60e53d47a226a6ad). +- Updated ostrio:files. + [Part 1](https://github.com/wekan/wekan/commit/0d67a86f2c9c1c9696d8507c60e53d47a226a6ad), + [Part 1](https://github.com/wekan/wekan/commit/c3bfcb78e9047a84d43041bebcec56718eaa140b). Thanks to developers of dependencies. and adds the following translations: From 20d87f22990fbf86e930b1b0ada47fdaa38f9479 Mon Sep 17 00:00:00 2001 From: Jonas Pfeifer <pfeifer@b1-systems.de> Date: Mon, 4 Jul 2022 15:24:21 +0200 Subject: [PATCH 236/246] fixed Typo --- client/components/boards/boardColors.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/boards/boardColors.css b/client/components/boards/boardColors.css index f9a641799..3b03e043c 100644 --- a/client/components/boards/boardColors.css +++ b/client/components/boards/boardColors.css @@ -1141,7 +1141,7 @@ color: rgba(0,0,0,0.5); position: absolute; margin-top: -34px; - margin-let: -11px; + margin-left: -11px; } .board-color-clearblue a.fa, .board-color-clearblue a i.fa { From 920b32735ff20e492d7bcd0c7a41f26abb35cf04 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 4 Jul 2022 17:46:20 +0300 Subject: [PATCH 237/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bd53e6e7..e23a258b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ and fixes the following bugs: Thanks to helioguardabaxo. - [Fix div max-width on My Cards table view](https://github.com/wekan/wekan/pull/4574). Thanks to helioguardabaxo. +- [Fixed one Typo in CSS Style Sheet](https://github.com/wekan/wekan/pull/4577). + Thanks to JonasPfeiferb1. Thanks to above GitHub users for their contributions and translators for their translations. From 724d1386f6943ad87b8e32f5544cc84ae211904c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 4 Jul 2022 17:46:36 +0300 Subject: [PATCH 238/246] Comment out unused CSS. Thanks to xet7 ! --- client/components/boards/boardsList.css | 2 +- client/components/main/layouts.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/boards/boardsList.css b/client/components/boards/boardsList.css index 4dce7862a..edca37900 100644 --- a/client/components/boards/boardsList.css +++ b/client/components/boards/boardsList.css @@ -1,4 +1,4 @@ -@import url("css/reset.css") print, screen; +/* @import url("css/reset.css") print, screen; */ .board-list { margin: 0 8px; diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index bd8a899a4..0a4a092f6 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -16,7 +16,7 @@ head meta(name="application-name" content="Wekan") meta(name="msapplication-TileColor" content="#00aba9") meta(name="theme-color" content="#ffffff") - link(rel='stylesheet', href='css/html5-default-theme.css', type='text/css') + //link(rel="stylesheet" type="text/css" class="__meteor-css__" href="css/html5-default-theme.css") template(name="userFormsLayout") section.auth-layout From 0596595284914f3c9c3e28ce5a8d005b71579adb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 4 Jul 2022 17:47:54 +0300 Subject: [PATCH 239/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e23a258b6..b36beb712 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ and fixes the following bugs: Thanks to helioguardabaxo. - [Fixed one Typo in CSS Style Sheet](https://github.com/wekan/wekan/pull/4577). Thanks to JonasPfeiferb1. +- [Comment out unused CSS](https://github.com/wekan/wekan/commit/724d1386f6943ad87b8e32f5544cc84ae211904c). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 7ae15cae27aa58980c89789f6bfdbe682b865e65 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Mon, 4 Jul 2022 17:54:59 +0300 Subject: [PATCH 240/246] Updated translations. --- imports/i18n/data/ar.i18n.json | 72 +++++++++++++++++----------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index f38fa7365..b9504f78d 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -1,41 +1,41 @@ { "accept": "قبول", "act-activity-notify": "اشعار النشاط", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-addAttachment": "ماتمت اضافتة__اضافة_للكرت\n__الكرت__في قائمة__قائمة__في المنطقة العائمة \n__المنطقة العائمة__في اللوح__اللوح__", + "act-deleteAttachment": "حذف الاضافة__الاضافة__في كرت\n__كرت__في قائمة__قائمة__في المنطقة العائمة\n__المنطقة العائمة__في اللوح__اللوح__", + "act-addSubtask": "مهمة فرعية مضافة__مهمة فرعية__ للكرت\n__الكرت__في قائمة__قائمة__في المنطقة العائمة\n__المنطقة العائمة__في اللوح__اللوح__", + "act-addLabel": "العلامة المضافة__العلامة__للكرت__كرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-addedLabel": "العلامة المضافة__العلامة__للكرت__كرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-removeLabel": "العلامة المحذوفة__العلامة__من الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-removedLabel": "العلامة المحذوفة__العلامة__من الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-addChecklist": "قائمة التأكد المضافة__قائمة التأكد__للكرت__كرت__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-addChecklistItem": "عنصر قائمة التأكد المضافة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-removeChecklist": " قائمة التأكد المحذوفة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-removeChecklistItem": "عنصر قائمة التأكد المحذوف__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-checkedItem": "مختار__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-uncheckedItem": "غير مختار__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-completeChecklist": "قائمة تأكد مكتملة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-uncompleteChecklist": "قائمة تأكد غير مكتملة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-addComment": "تعليق على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-editComment": "تعليق معدل على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-deleteComment": "تعليق محذوف على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-createBoard": "لوح مكون__لوح__", + "act-createSwimlane": "منطقة عائمة مكونة__منطقة عائمة__في اللوح__اللوح__", + "act-createCard": "كرت مكون__كرت__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-createCustomField": "مجال مخصوص مكون__مجال مخصوص__في اللوح__اللوح__", + "act-deleteCustomField": "مجال مخصوص محذوف__مجال مخصوص__في اللوح__اللوح__", + "act-setCustomField": "مجال مخصوص معدل__مجال مخصوص__:__قيمة مجال مخصوص__للكرت_الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-createList": "قائمة مضافة__قائمة__ في اللوح __اللوح__", + "act-addBoardMember": "عضو مضاف__عضو__في اللوح__اللوح__", + "act-archivedBoard": "اللوح__اللوح__منقول الى الارشيف", + "act-archivedCard": "الكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في قائمة__القائمة__ منقول الى الارشيف", + "act-archivedList": "القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__ منقول الى الارشيف", + "act-archivedSwimlane": "المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__ منقول الى الارشيف", + "act-importBoard": "اللوح المستورد__اللوح__", + "act-importCard": "الكرت المستورد__الكرت__في القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-importList": " القائمة المستوردة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-joinMember": "العضو المضاف__العضو__للكرت_الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", + "act-moveCard": "الكرت المحذوف__الكرت__في اللوح_اللوح__من قائمة__قائمة قديمة__في المنطقة العائمة__منطقة عائمة قديمة__في القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__", "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", "act-removeBoardMember": "removed member __member__ from board __board__", "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", @@ -71,7 +71,7 @@ "add": "أضف", "activity-checked-item-card": "checked %s in checklist %s", "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-completed-card": "قائمة تأكد مكتماة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__", "activity-checklist-uncompleted-card": "uncompleted the checklist %s", "activity-editComment": "edited comment %s", "activity-deleteComment": "تعليق محذوف %s", From 6c94b57cfcd0dbaf4c2ca7a5f777945cac883906 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Mon, 25 Apr 2022 15:54:25 +0200 Subject: [PATCH 241/246] 00checkStartup, on error give more details on current user which run's Wekan --- server/00checkStartup.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/00checkStartup.js b/server/00checkStartup.js index 9589aa586..dfea3702f 100644 --- a/server/00checkStartup.js +++ b/server/00checkStartup.js @@ -1,4 +1,5 @@ var fs = require('fs'); +var os = require('os'); let errors = []; if (!process.env.WRITABLE_PATH) { @@ -9,6 +10,7 @@ if (!process.env.WRITABLE_PATH) { } catch (err) { errors.push("can't write to " + process.env.WRITABLE_PATH, err); errors.push("the path of WRITABLE_PATH (" + process.env.WRITABLE_PATH + ") must be writable !!!"); + errors.push("username: " + userInfo["username"] + " - uid: " + userInfo["uid"] + " - gid: " + userInfo["gid"]); } } From cb78501b04a0ae6ec72e92854b59c79d20481284 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Tue, 5 Jul 2022 23:40:28 +0300 Subject: [PATCH 242/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b36beb712..9f313738d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This release adds the following features: - [Resizeable size of list width and height. Size is not saved yet. In Progress](https://github.com/wekan/wekan/commit/01d0dd3b1dd0a3c9764e7c9d31eab739db2d3ad8). Thanks to NLBlackEagle and xet7. +- [00checkStartup, on error give more details on current user which run's wekan](https://github.com/wekan/wekan/pull/4581). + Thanks to mfilser. and adds the following updates: From 490ad65b6ed1a08fd564cc78dcc389a7c67b8d10 Mon Sep 17 00:00:00 2001 From: Martin Filser <github-wekan@linux-email.de> Date: Tue, 8 Feb 2022 22:26:56 +0100 Subject: [PATCH 243/246] Move/Copy card closes now the popup if done - Resolves discussion: #4337 --- client/components/cards/cardDetails.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index baf7887be..ee8ac4193 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -839,7 +839,7 @@ Template.moveCardPopup.events({ this.swimlaneId = swimlaneId; this.listId = listId; - Popup.back(); + Popup.back(2); }, }); BlazeComponent.extendComponent({ @@ -975,7 +975,7 @@ Template.copyCardPopup.events({ // See https://github.com/wekan/wekan/issues/80 Filter.addException(_id); - Popup.back(); + Popup.back(2); } }, }); From ae09f0f0083a96c2211fdc02e60b4ff6a2f413ca Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 6 Jul 2022 00:31:13 +0300 Subject: [PATCH 244/246] Updated dependencies. --- package-lock.json | 53 ++++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index c60a0c011..1f40263e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -378,20 +378,20 @@ "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==" }, "@wekanteam/cli-table3": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.6.tgz", - "integrity": "sha512-9du7W4M5jbPlNGsESIasVORVL3M4coI4Kb/hHhqsSLuEETqr6cqyLyQZEJ7uGYEmWxwm/N+DkmpbR5dZRTDS3A==", + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.7.tgz", + "integrity": "sha512-UVXVKMHeWsZl7DiDBFekH9xMzUeqoim8VDAFtdGsDOhy+yhOw/FAaLVTm2epDyHFBzQGewurOtPolu2Y7ti+Ig==", "requires": { "string-width": "^5.1.2" } }, "@wekanteam/markdown-it-mermaid": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.4.tgz", - "integrity": "sha512-2DcRIaQV8WcPbBja+ohmiMTBNmvpeThj9gTwMYW2OMXs+Bp9XeiERZZ6VRiG8CNqT20cFohHZvVTgrE0086fWA==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.5.tgz", + "integrity": "sha512-Td29lYV1P2BSv8kAlYsMqRhsWR4NNhU7b9D+kot4owM04rMBcxK+2UbJo8eTe96oflERvBO4uEEhwU4JzzTUsg==", "requires": { - "@wekanteam/cli-table3": "^0.7.6", - "mermaid": "^9.0.1" + "@wekanteam/cli-table3": "^0.7.7", + "mermaid": "^9.1.3" } }, "abbrev": { @@ -888,16 +888,16 @@ } }, "d3": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz", - "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz", + "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==", "requires": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", - "d3-contour": "3", + "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", @@ -925,9 +925,9 @@ } }, "d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", + "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", "requires": { "internmap": "1 - 2" } @@ -968,11 +968,11 @@ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, "d3-contour": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", - "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz", + "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==", "requires": { - "d3-array": "2 - 3" + "d3-array": "^3.2.0" } }, "d3-delaunay": { @@ -2272,26 +2272,19 @@ "optional": true }, "mermaid": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.1.tgz", - "integrity": "sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.1.3.tgz", + "integrity": "sha512-jTIYiqKwsUXVCoxHUVkK8t0QN3zSKIdJlb9thT0J5jCnzXyc+gqTbZE2QmjRfavFTPPn5eRy5zaFp7V+6RhxYg==", "requires": { "@braintree/sanitize-url": "^6.0.0", "d3": "^7.0.0", "dagre": "^0.8.5", "dagre-d3": "^0.6.4", - "dompurify": "2.3.6", + "dompurify": "2.3.8", "graphlib": "^2.1.8", "khroma": "^2.0.0", "moment-mini": "^2.24.0", "stylis": "^4.0.10" - }, - "dependencies": { - "dompurify": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz", - "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==" - } } }, "message-box": { diff --git a/package.json b/package.json index e68995bf9..36222c7c0 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@babel/core": "^7.15.5", "@babel/runtime": "^7.15.4", "@mapbox/node-pre-gyp": "^1.0.8", - "@wekanteam/markdown-it-mermaid": "^0.5.4", + "@wekanteam/markdown-it-mermaid": "^0.5.5", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", From b1c41518dfcc76ee4855b0c6e8df34d20449930c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 6 Jul 2022 00:32:37 +0300 Subject: [PATCH 245/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f313738d..06520d559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and adds the following updates: [Part 1](https://github.com/wekan/wekan/commit/0d67a86f2c9c1c9696d8507c60e53d47a226a6ad), [Part 1](https://github.com/wekan/wekan/commit/c3bfcb78e9047a84d43041bebcec56718eaa140b). Thanks to developers of dependencies. +- [Updated dependencies](https://github.com/wekan/wekan/commit/ae09f0f0083a96c2211fdc02e60b4ff6a2f413ca). + Thanks to developers of dependencies. and adds the following translations: From ccea223ef745f0ce91d1ad98f12a6755ae8746a9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Wed, 6 Jul 2022 00:34:27 +0300 Subject: [PATCH 246/246] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06520d559..1cdb5e759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ and fixes the following bugs: Thanks to JonasPfeiferb1. - [Comment out unused CSS](https://github.com/wekan/wekan/commit/724d1386f6943ad87b8e32f5544cc84ae211904c). Thanks to xet7. +- [Move/Copy card closes now the popup if done](https://github.com/wekan/wekan/pull/4582). + Thanks to mfilser. Thanks to above GitHub users for their contributions and translators for their translations.