diff --git a/front/package-lock.json b/front/package-lock.json
index d6aec33..bc99a01 100644
--- a/front/package-lock.json
+++ b/front/package-lock.json
@@ -20,41 +20,41 @@
}
},
"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==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.16.0"
+ "@babel/highlight": "^7.16.7"
},
"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==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
+ "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.12",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
+ "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
"dev": true,
"dependencies": {
- "@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.16.7",
+ "@babel/generator": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helpers": "^7.16.7",
+ "@babel/parser": "^7.16.12",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.10",
+ "@babel/types": "^7.16.8",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -71,12 +71,12 @@
}
},
"node_modules/@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.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
+ "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0",
+ "@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
},
@@ -85,39 +85,39 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
- "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz",
- "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
"dev": true,
"dependencies": {
- "@babel/helper-explode-assignable-expression": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz",
- "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.16.6",
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.17.5",
"semver": "^6.3.0"
},
"engines": {
@@ -128,17 +128,18 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
- "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz",
+ "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0"
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -148,12 +149,12 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz",
- "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
+ "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
"regexpu-core": "^4.7.1"
},
"engines": {
@@ -164,9 +165,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz",
- "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
"dev": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.13.0",
@@ -182,156 +183,169 @@
"@babel/core": "^7.4.0-0"
}
},
- "node_modules/@babel/helper-explode-assignable-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz",
- "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==",
+ "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==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
"dev": true,
"dependencies": {
- "@babel/helper-get-function-arity": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-get-function-arity": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.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==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
+ "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
"dev": true,
"dependencies": {
- "@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-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"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==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-wrap-function": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-wrap-function": "^7.16.8",
+ "@babel/types": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
"dev": true,
"dependencies": {
- "@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-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -350,71 +364,71 @@
}
},
"node_modules/@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.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==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
},
"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==",
+ "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==",
"dev": true,
"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==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz",
- "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
"dev": true,
"dependencies": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.8",
+ "@babel/types": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz",
- "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
+ "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
},
"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==",
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
@@ -423,9 +437,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz",
- "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==",
+ "version": "7.16.12",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
+ "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -435,12 +449,12 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz",
- "integrity": "sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
+ "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -450,14 +464,14 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -467,13 +481,13 @@
}
},
"node_modules/@babel/plugin-proposal-async-generator-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz",
- "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
+ "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
"@babel/plugin-syntax-async-generators": "^7.8.4"
},
"engines": {
@@ -484,13 +498,13 @@
}
},
"node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
- "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -500,13 +514,13 @@
}
},
"node_modules/@babel/plugin-proposal-class-static-block": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz",
- "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
+ "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
@@ -517,12 +531,12 @@
}
},
"node_modules/@babel/plugin-proposal-dynamic-import": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz",
- "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
@@ -533,12 +547,12 @@
}
},
"node_modules/@babel/plugin-proposal-export-namespace-from": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz",
- "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
+ "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
@@ -549,12 +563,12 @@
}
},
"node_modules/@babel/plugin-proposal-json-strings": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz",
- "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
+ "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
@@ -565,12 +579,12 @@
}
},
"node_modules/@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz",
- "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
+ "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
@@ -581,12 +595,12 @@
}
},
"node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz",
- "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
+ "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
@@ -597,12 +611,12 @@
}
},
"node_modules/@babel/plugin-proposal-numeric-separator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz",
- "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
@@ -613,16 +627,16 @@
}
},
"node_modules/@babel/plugin-proposal-object-rest-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz",
- "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
+ "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.16.0"
+ "@babel/plugin-transform-parameters": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -632,12 +646,12 @@
}
},
"node_modules/@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz",
- "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
@@ -648,12 +662,12 @@
}
},
"node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
@@ -665,13 +679,13 @@
}
},
"node_modules/@babel/plugin-proposal-private-methods": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz",
- "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==",
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
+ "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-class-features-plugin": "^7.16.10",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -681,14 +695,14 @@
}
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz",
- "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
+ "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
@@ -699,13 +713,13 @@
}
},
"node_modules/@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz",
- "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
+ "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=4"
@@ -892,12 +906,12 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz",
- "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
+ "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -907,14 +921,14 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
"dev": true,
"dependencies": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0"
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
},
"engines": {
"node": ">=6.9.0"
@@ -924,12 +938,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz",
- "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -939,12 +953,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz",
- "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
+ "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -954,17 +968,18 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz",
- "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
+ "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
"globals": "^11.1.0"
},
"engines": {
@@ -975,12 +990,12 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz",
- "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
+ "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -990,12 +1005,12 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz",
- "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
+ "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1005,13 +1020,13 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz",
- "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1021,12 +1036,12 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz",
- "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
+ "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1036,13 +1051,13 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz",
- "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
"dev": true,
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1052,12 +1067,12 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz",
- "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
+ "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1067,13 +1082,14 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz",
- "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
"dev": true,
"dependencies": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1083,12 +1099,12 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz",
- "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
+ "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1098,12 +1114,12 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz",
- "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1113,13 +1129,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz",
- "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
+ "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
@@ -1130,14 +1146,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz",
- "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-simple-access": "^7.16.0",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
@@ -1148,15 +1164,15 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz",
- "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
+ "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
"dev": true,
"dependencies": {
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"engines": {
@@ -1167,13 +1183,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz",
- "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
+ "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1183,12 +1199,12 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz",
- "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
+ "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1198,12 +1214,12 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz",
- "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
+ "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1213,13 +1229,13 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz",
- "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0"
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1229,12 +1245,12 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz",
- "integrity": "sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
+ "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1244,12 +1260,12 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz",
- "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1259,9 +1275,9 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz",
- "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
+ "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
"dev": true,
"dependencies": {
"regenerator-transform": "^0.14.2"
@@ -1274,12 +1290,12 @@
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz",
- "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
+ "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1289,12 +1305,12 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz",
- "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1304,12 +1320,12 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz",
- "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
+ "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
},
"engines": {
@@ -1320,12 +1336,12 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz",
- "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1335,12 +1351,12 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz",
- "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
+ "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1350,12 +1366,12 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz",
- "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
+ "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1365,12 +1381,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz",
- "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1380,13 +1396,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz",
- "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1396,32 +1412,32 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz",
- "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==",
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
+ "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.16.0",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-class-static-block": "^7.16.0",
- "@babel/plugin-proposal-dynamic-import": "^7.16.0",
- "@babel/plugin-proposal-export-namespace-from": "^7.16.0",
- "@babel/plugin-proposal-json-strings": "^7.16.0",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.16.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.16.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.16.0",
+ "@babel/compat-data": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
+ "@babel/plugin-proposal-class-static-block": "^7.16.7",
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+ "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-private-methods": "^7.16.11",
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
@@ -1436,44 +1452,44 @@
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-transform-arrow-functions": "^7.16.0",
- "@babel/plugin-transform-async-to-generator": "^7.16.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.16.0",
- "@babel/plugin-transform-block-scoping": "^7.16.0",
- "@babel/plugin-transform-classes": "^7.16.0",
- "@babel/plugin-transform-computed-properties": "^7.16.0",
- "@babel/plugin-transform-destructuring": "^7.16.0",
- "@babel/plugin-transform-dotall-regex": "^7.16.0",
- "@babel/plugin-transform-duplicate-keys": "^7.16.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.16.0",
- "@babel/plugin-transform-for-of": "^7.16.0",
- "@babel/plugin-transform-function-name": "^7.16.0",
- "@babel/plugin-transform-literals": "^7.16.0",
- "@babel/plugin-transform-member-expression-literals": "^7.16.0",
- "@babel/plugin-transform-modules-amd": "^7.16.0",
- "@babel/plugin-transform-modules-commonjs": "^7.16.0",
- "@babel/plugin-transform-modules-systemjs": "^7.16.0",
- "@babel/plugin-transform-modules-umd": "^7.16.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0",
- "@babel/plugin-transform-new-target": "^7.16.0",
- "@babel/plugin-transform-object-super": "^7.16.0",
- "@babel/plugin-transform-parameters": "^7.16.0",
- "@babel/plugin-transform-property-literals": "^7.16.0",
- "@babel/plugin-transform-regenerator": "^7.16.0",
- "@babel/plugin-transform-reserved-words": "^7.16.0",
- "@babel/plugin-transform-shorthand-properties": "^7.16.0",
- "@babel/plugin-transform-spread": "^7.16.0",
- "@babel/plugin-transform-sticky-regex": "^7.16.0",
- "@babel/plugin-transform-template-literals": "^7.16.0",
- "@babel/plugin-transform-typeof-symbol": "^7.16.0",
- "@babel/plugin-transform-unicode-escapes": "^7.16.0",
- "@babel/plugin-transform-unicode-regex": "^7.16.0",
+ "@babel/plugin-transform-arrow-functions": "^7.16.7",
+ "@babel/plugin-transform-async-to-generator": "^7.16.8",
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+ "@babel/plugin-transform-block-scoping": "^7.16.7",
+ "@babel/plugin-transform-classes": "^7.16.7",
+ "@babel/plugin-transform-computed-properties": "^7.16.7",
+ "@babel/plugin-transform-destructuring": "^7.16.7",
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.16.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+ "@babel/plugin-transform-for-of": "^7.16.7",
+ "@babel/plugin-transform-function-name": "^7.16.7",
+ "@babel/plugin-transform-literals": "^7.16.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+ "@babel/plugin-transform-modules-amd": "^7.16.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.16.7",
+ "@babel/plugin-transform-modules-umd": "^7.16.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
+ "@babel/plugin-transform-new-target": "^7.16.7",
+ "@babel/plugin-transform-object-super": "^7.16.7",
+ "@babel/plugin-transform-parameters": "^7.16.7",
+ "@babel/plugin-transform-property-literals": "^7.16.7",
+ "@babel/plugin-transform-regenerator": "^7.16.7",
+ "@babel/plugin-transform-reserved-words": "^7.16.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+ "@babel/plugin-transform-spread": "^7.16.7",
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
+ "@babel/plugin-transform-template-literals": "^7.16.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.16.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.16.0",
- "babel-plugin-polyfill-corejs2": "^0.2.3",
- "babel-plugin-polyfill-corejs3": "^0.3.0",
- "babel-plugin-polyfill-regenerator": "^0.2.3",
- "core-js-compat": "^3.19.0",
+ "@babel/types": "^7.16.8",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "core-js-compat": "^3.20.2",
"semver": "^6.3.0"
},
"engines": {
@@ -1500,9 +1516,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.0.tgz",
- "integrity": "sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
+ "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.13.4"
@@ -1518,32 +1534,33 @@
"dev": true
},
"node_modules/@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@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.16.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz",
- "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==",
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
+ "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
"dev": true,
"dependencies": {
- "@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.0",
- "@babel/types": "^7.16.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.16.8",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.16.10",
+ "@babel/types": "^7.16.8",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -1552,12 +1569,12 @@
}
},
"node_modules/@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.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
+ "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -1565,9 +1582,9 @@
}
},
"node_modules/@discoveryjs/json-ext": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz",
- "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==",
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
"dev": true,
"engines": {
"node": ">=10.0.0"
@@ -1608,10 +1625,48 @@
"node": ">= 8"
}
},
+ "node_modules/@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "dev": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+ "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+ "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+ "dev": true,
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/eslint": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz",
- "integrity": "sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==",
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
+ "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -1619,9 +1674,9 @@
}
},
"node_modules/@types/eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==",
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+ "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dev": true,
"dependencies": {
"@types/eslint": "*",
@@ -1634,10 +1689,33 @@
"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
"dev": true
},
+ "node_modules/@types/express": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
+ "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.18",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.17.28",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
+ "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
"node_modules/@types/http-proxy": {
- "version": "1.17.7",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
- "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==",
+ "version": "1.17.8",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
+ "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
"dev": true,
"dependencies": {
"@types/node": "*"
@@ -1649,10 +1727,28 @@
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
"dev": true
},
+ "node_modules/@types/mime": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
+ "dev": true
+ },
"node_modules/@types/node": {
- "version": "16.11.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz",
- "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==",
+ "version": "17.0.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz",
+ "integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==",
+ "dev": true
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+ "dev": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"dev": true
},
"node_modules/@types/retry": {
@@ -1661,6 +1757,43 @@
"integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
"dev": true
},
+ "node_modules/@types/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.13.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
+ "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.33",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+ "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
+ "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -1808,9 +1941,9 @@
}
},
"node_modules/@webpack-cli/configtest": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
- "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
+ "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
"dev": true,
"peerDependencies": {
"webpack": "4.x.x || 5.x.x",
@@ -1818,9 +1951,9 @@
}
},
"node_modules/@webpack-cli/info": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz",
- "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz",
+ "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==",
"dev": true,
"dependencies": {
"envinfo": "^7.7.3"
@@ -1830,9 +1963,9 @@
}
},
"node_modules/@webpack-cli/serve": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
- "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
+ "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
"dev": true,
"peerDependencies": {
"webpack-cli": "4.x.x"
@@ -1869,9 +2002,9 @@
}
},
"node_modules/acorn": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
- "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+ "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1918,6 +2051,45 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
"node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -2029,13 +2201,13 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz",
- "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.2.4",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
"semver": "^6.1.1"
},
"peerDependencies": {
@@ -2043,25 +2215,25 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz",
- "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz",
+ "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==",
"dev": true,
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.2.4",
- "core-js-compat": "^3.18.0"
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.20.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz",
- "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
"dev": true,
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.2.4"
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
@@ -2125,30 +2297,30 @@
}
},
"node_modules/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
+ "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
"dev": true,
"dependencies": {
- "bytes": "3.1.0",
+ "bytes": "3.1.1",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
- "http-errors": "1.7.2",
+ "http-errors": "1.8.1",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
+ "qs": "6.9.6",
+ "raw-body": "2.4.2",
+ "type-is": "~1.6.18"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/body-parser/node_modules/bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
+ "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
"dev": true,
"engines": {
"node": ">= 0.8"
@@ -2206,13 +2378,13 @@
}
},
"node_modules/browserslist": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz",
- "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==",
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+ "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
"dev": true,
"dependencies": {
- "caniuse-lite": "^1.0.30001271",
- "electron-to-chromium": "^1.3.878",
+ "caniuse-lite": "^1.0.30001286",
+ "electron-to-chromium": "^1.4.17",
"escalade": "^3.1.1",
"node-releases": "^2.0.1",
"picocolors": "^1.0.0"
@@ -2263,9 +2435,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001274",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz",
- "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==",
+ "version": "1.0.30001301",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz",
+ "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -2287,10 +2459,16 @@
}
},
"node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -2433,17 +2611,37 @@
}
},
"node_modules/content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dev": true,
"dependencies": {
- "safe-buffer": "5.1.2"
+ "safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/content-disposition/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==",
+ "dev": true,
+ "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/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
@@ -2463,9 +2661,9 @@
}
},
"node_modules/cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
"dev": true,
"engines": {
"node": ">= 0.6"
@@ -2481,17 +2679,17 @@
"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.3 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.",
+ "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.",
"dev": true,
"hasInstallScript": true
},
"node_modules/core-js-compat": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.0.tgz",
- "integrity": "sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==",
+ "version": "3.20.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz",
+ "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==",
"dev": true,
"dependencies": {
- "browserslist": "^4.17.5",
+ "browserslist": "^4.19.1",
"semver": "7.0.0"
},
"funding": {
@@ -2529,9 +2727,9 @@
}
},
"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==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -2682,9 +2880,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.3.885",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz",
- "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==",
+ "version": "1.4.52",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.52.tgz",
+ "integrity": "sha512-JGkh8HEh5PnVrhU4HbpyyO0O791dVY6k7AdqfDeqbcRMeoGxtNHWT77deR2nhvbLe4dKpxjlDEvdEwrvRLGu2Q==",
"dev": true
},
"node_modules/emojis-list": {
@@ -2860,17 +3058,17 @@
}
},
"node_modules/express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz",
+ "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==",
"dev": true,
"dependencies": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
+ "body-parser": "1.19.1",
+ "content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.4.0",
+ "cookie": "0.4.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
@@ -2884,13 +3082,13 @@
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.9.6",
"range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.17.2",
+ "serve-static": "1.14.2",
+ "setprototypeof": "1.2.0",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
@@ -2921,6 +3119,26 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
+ "node_modules/express/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==",
+ "dev": true,
+ "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/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2928,9 +3146,9 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -2940,7 +3158,7 @@
"micromatch": "^4.0.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=8.6.0"
}
},
"node_modules/fast-json-stable-stringify": {
@@ -3052,9 +3270,9 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.14.5",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
- "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==",
+ "version": "1.14.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
+ "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
"dev": true,
"funding": [
{
@@ -3204,16 +3422,16 @@
}
},
"node_modules/globby": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
- "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
@@ -3224,9 +3442,9 @@
}
},
"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==",
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
"dev": true
},
"node_modules/handle-thing": {
@@ -3332,25 +3550,25 @@
"dev": true
},
"node_modules/http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
"dev": true,
"dependencies": {
"depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
+ "toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/http-parser-js": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
- "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
+ "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
"dev": true
},
"node_modules/http-proxy": {
@@ -3368,12 +3586,12 @@
}
},
"node_modules/http-proxy-middleware": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz",
- "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz",
+ "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==",
"dev": true,
"dependencies": {
- "@types/http-proxy": "^1.17.5",
+ "@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"is-plain-obj": "^3.0.0",
@@ -3381,6 +3599,9 @@
},
"engines": {
"node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
}
},
"node_modules/human-signals": {
@@ -3405,18 +3626,18 @@
}
},
"node_modules/ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/import-local": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
- "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
"dev": true,
"dependencies": {
"pkg-dir": "^4.2.0",
@@ -3427,6 +3648,9 @@
},
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/indent-string": {
@@ -3449,38 +3673,11 @@
}
},
"node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "node_modules/internal-ip": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz",
- "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==",
- "dev": true,
- "dependencies": {
- "default-gateway": "^6.0.0",
- "ipaddr.js": "^1.9.1",
- "is-ip": "^3.1.0",
- "p-event": "^4.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/internal-ip?sponsor=1"
- }
- },
- "node_modules/internal-ip/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/interpret": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
@@ -3496,15 +3693,6 @@
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"dev": true
},
- "node_modules/ip-regex": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz",
- "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ipaddr.js": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
@@ -3543,9 +3731,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
@@ -3605,18 +3793,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-ip": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz",
- "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==",
- "dev": true,
- "dependencies": {
- "ip-regex": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -3730,9 +3906,9 @@
}
},
"node_modules/jest-worker": {
- "version": "27.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz",
- "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==",
+ "version": "27.4.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz",
+ "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==",
"dev": true,
"dependencies": {
"@types/node": "*",
@@ -3905,9 +4081,9 @@
}
},
"node_modules/memfs": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz",
- "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
+ "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
"dev": true,
"dependencies": {
"fs-monkey": "1.0.3"
@@ -3972,21 +4148,21 @@
}
},
"node_modules/mime-db": {
- "version": "1.50.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
- "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
+ "version": "1.51.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
+ "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
- "version": "2.1.33",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz",
- "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==",
+ "version": "2.1.34",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
+ "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dev": true,
"dependencies": {
- "mime-db": "1.50.0"
+ "mime-db": "1.51.0"
},
"engines": {
"node": ">= 0.6"
@@ -4078,12 +4254,12 @@
"dev": true
},
"node_modules/node-forge": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
- "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
+ "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
"dev": true,
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 6.13.0"
}
},
"node_modules/node-releases": {
@@ -4224,30 +4400,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-event": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
- "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==",
- "dev": true,
- "dependencies": {
- "p-timeout": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -4303,18 +4455,6 @@
"node": ">=8"
}
},
- "node_modules/p-timeout": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
- "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
- "dev": true,
- "dependencies": {
- "p-finally": "^1.0.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",
@@ -4388,9 +4528,9 @@
"dev": true
},
"node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
@@ -4472,22 +4612,15 @@
}
},
"node_modules/qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "version": "6.9.6",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
+ "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
"dev": true,
"engines": {
"node": ">=0.6"
- }
- },
- "node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
- "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
- "dev": true,
- "engines": {
- "node": ">=0.4.x"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/queue-microtask": {
@@ -4529,13 +4662,13 @@
}
},
"node_modules/raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
+ "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
"dev": true,
"dependencies": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
+ "bytes": "3.1.1",
+ "http-errors": "1.8.1",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
@@ -4544,9 +4677,9 @@
}
},
"node_modules/raw-body/node_modules/bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
+ "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
"dev": true,
"engines": {
"node": ">= 0.8"
@@ -4624,9 +4757,9 @@
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
- "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
+ "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
@@ -4683,6 +4816,15 @@
"jsesc": "bin/jsesc"
}
},
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -4690,13 +4832,17 @@
"dev": true
},
"node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4817,12 +4963,15 @@
"dev": true
},
"node_modules/selfsigned": {
- "version": "1.10.11",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
- "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
+ "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
"dev": true,
"dependencies": {
- "node-forge": "^0.10.0"
+ "node-forge": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/semver": {
@@ -4835,9 +4984,9 @@
}
},
"node_modules/send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "version": "0.17.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
+ "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
"dev": true,
"dependencies": {
"debug": "2.6.9",
@@ -4847,9 +4996,9 @@
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
- "http-errors": "~1.7.2",
+ "http-errors": "1.8.1",
"mime": "1.6.0",
- "ms": "2.1.1",
+ "ms": "2.1.3",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
@@ -4874,9 +5023,9 @@
"dev": true
},
"node_modules/send/node_modules/ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/serialize-javascript": {
@@ -4930,6 +5079,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
"node_modules/serve-index/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -4943,24 +5098,24 @@
"dev": true
},
"node_modules/serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
+ "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
"dev": true,
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.17.1"
+ "send": "0.17.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
},
"node_modules/shallow-clone": {
@@ -4997,9 +5152,9 @@
}
},
"node_modules/signal-exit": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
- "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
+ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
"dev": true
},
"node_modules/slash": {
@@ -5012,13 +5167,13 @@
}
},
"node_modules/sockjs": {
- "version": "0.3.21",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
- "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
"dev": true,
"dependencies": {
"faye-websocket": "^0.11.3",
- "uuid": "^3.4.0",
+ "uuid": "^8.3.2",
"websocket-driver": "^0.7.4"
}
},
@@ -5032,9 +5187,9 @@
}
},
"node_modules/source-map-support": {
- "version": "0.5.20",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz",
- "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==",
+ "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==",
"dev": true,
"dependencies": {
"buffer-from": "^1.0.0",
@@ -5154,6 +5309,18 @@
"node": ">=4"
}
},
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -5164,9 +5331,9 @@
}
},
"node_modules/terser": {
- "version": "5.9.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz",
- "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==",
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
+ "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"dev": true,
"dependencies": {
"commander": "^2.20.0",
@@ -5178,16 +5345,23 @@
},
"engines": {
"node": ">=10"
+ },
+ "peerDependencies": {
+ "acorn": "^8.5.0"
+ },
+ "peerDependenciesMeta": {
+ "acorn": {
+ "optional": true
+ }
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz",
- "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz",
+ "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==",
"dev": true,
"dependencies": {
- "jest-worker": "^27.0.6",
- "p-limit": "^3.1.0",
+ "jest-worker": "^27.4.1",
"schema-utils": "^3.1.1",
"serialize-javascript": "^6.0.0",
"source-map": "^0.6.1",
@@ -5215,21 +5389,6 @@
}
}
},
- "node_modules/terser-webpack-plugin/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/terser-webpack-plugin/node_modules/schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@@ -5294,9 +5453,9 @@
}
},
"node_modules/toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"engines": {
"node": ">=0.6"
@@ -5373,22 +5532,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "dev": true,
- "dependencies": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- }
- },
- "node_modules/url/node_modules/punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -5405,13 +5548,12 @@
}
},
"node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true,
"bin": {
- "uuid": "bin/uuid"
+ "uuid": "dist/bin/uuid"
}
},
"node_modules/vary": {
@@ -5424,9 +5566,9 @@
}
},
"node_modules/watchpack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz",
- "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+ "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
"dev": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
@@ -5446,9 +5588,9 @@
}
},
"node_modules/webpack": {
- "version": "5.61.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.61.0.tgz",
- "integrity": "sha512-fPdTuaYZ/GMGFm4WrPi2KRCqS1vDp773kj9S0iI5Uc//5cszsFEDgHNaX4Rj1vobUiU1dFIV3mA9k1eHeluFpw==",
+ "version": "5.67.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz",
+ "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.0",
@@ -5465,7 +5607,7 @@
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.4",
+ "graceful-fs": "^4.2.9",
"json-parse-better-errors": "^1.0.2",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
@@ -5473,8 +5615,8 @@
"schema-utils": "^3.1.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.2.0",
- "webpack-sources": "^3.2.0"
+ "watchpack": "^2.3.1",
+ "webpack-sources": "^3.2.3"
},
"bin": {
"webpack": "bin/webpack.js"
@@ -5493,15 +5635,15 @@
}
},
"node_modules/webpack-cli": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
- "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz",
+ "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==",
"dev": true,
"dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.1.0",
- "@webpack-cli/info": "^1.4.0",
- "@webpack-cli/serve": "^1.6.0",
+ "@webpack-cli/configtest": "^1.1.1",
+ "@webpack-cli/info": "^1.4.1",
+ "@webpack-cli/serve": "^1.6.1",
"colorette": "^2.0.14",
"commander": "^7.0.0",
"execa": "^5.0.0",
@@ -5545,16 +5687,16 @@
}
},
"node_modules/webpack-dev-middleware": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz",
- "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
+ "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
"dev": true,
"dependencies": {
"colorette": "^2.0.10",
"memfs": "^3.2.2",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
- "schema-utils": "^3.1.0"
+ "schema-utils": "^4.0.0"
},
"engines": {
"node": ">= 12.13.0"
@@ -5567,18 +5709,53 @@
"webpack": "^4.0.0 || ^5.0.0"
}
},
- "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "node_modules/webpack-dev-middleware/node_modules/ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
"dev": true,
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
@@ -5586,35 +5763,39 @@
}
},
"node_modules/webpack-dev-server": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz",
- "integrity": "sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA==",
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
+ "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
"dev": true,
"dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/serve-index": "^1.9.1",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.2.2",
"ansi-html-community": "^0.0.8",
"bonjour": "^3.5.0",
"chokidar": "^3.5.2",
"colorette": "^2.0.10",
"compression": "^1.7.4",
"connect-history-api-fallback": "^1.6.0",
+ "default-gateway": "^6.0.3",
"del": "^6.0.0",
"express": "^4.17.1",
"graceful-fs": "^4.2.6",
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.0",
- "internal-ip": "^6.2.0",
"ipaddr.js": "^2.0.1",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"portfinder": "^1.0.28",
- "schema-utils": "^3.1.0",
- "selfsigned": "^1.10.11",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.0.0",
"serve-index": "^1.9.1",
"sockjs": "^0.3.21",
"spdy": "^4.0.2",
"strip-ansi": "^7.0.0",
- "url": "^0.11.0",
- "webpack-dev-middleware": "^5.2.1",
+ "webpack-dev-middleware": "^5.3.0",
"ws": "^8.1.0"
},
"bin": {
@@ -5632,18 +5813,53 @@
}
}
},
- "node_modules/webpack-dev-server/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "node_modules/webpack-dev-server/node_modules/ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
"dev": true,
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-server/node_modules/schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
@@ -5664,9 +5880,9 @@
}
},
"node_modules/webpack-sources": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz",
- "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true,
"engines": {
"node": ">=10.13.0"
@@ -5741,9 +5957,9 @@
"dev": true
},
"node_modules/ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
+ "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
"dev": true,
"engines": {
"node": ">=10.0.0"
@@ -5760,51 +5976,39 @@
"optional": true
}
}
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
}
},
"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==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.16.0"
+ "@babel/highlight": "^7.16.7"
}
},
"@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==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
+ "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
"dev": true
},
"@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.16.12",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
+ "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
"dev": true,
"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.16.7",
+ "@babel/generator": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helpers": "^7.16.7",
+ "@babel/parser": "^7.16.12",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.10",
+ "@babel/types": "^7.16.8",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -5814,75 +6018,76 @@
}
},
"@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.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
+ "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0",
+ "@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
},
"@babel/helper-annotate-as-pure": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
- "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz",
- "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
"dev": true,
"requires": {
- "@babel/helper-explode-assignable-expression": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@babel/helper-compilation-targets": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz",
- "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.16.6",
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.17.5",
"semver": "^6.3.0"
}
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
- "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz",
+ "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0"
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
}
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz",
- "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
+ "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
"regexpu-core": "^4.7.1"
}
},
"@babel/helper-define-polyfill-provider": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz",
- "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
"dev": true,
"requires": {
"@babel/helper-compilation-targets": "^7.13.0",
@@ -5895,123 +6100,133 @@
"semver": "^6.1.2"
}
},
- "@babel/helper-explode-assignable-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz",
- "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==",
+ "@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==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
"dev": true,
"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.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@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.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==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
+ "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
"dev": true,
"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-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@babel/helper-optimise-call-expression": {
- "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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
"dev": true
},
"@babel/helper-remap-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-wrap-function": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-wrap-function": "^7.16.8",
+ "@babel/types": "^7.16.8"
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
"dev": true,
"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-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@babel/helper-simple-access": {
- "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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.16.7"
}
},
"@babel/helper-skip-transparent-expression-wrappers": {
@@ -6024,242 +6239,242 @@
}
},
"@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.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==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@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==",
"dev": true
},
"@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==",
"dev": true
},
"@babel/helper-wrap-function": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz",
- "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.8",
+ "@babel/types": "^7.16.8"
}
},
"@babel/helpers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz",
- "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
+ "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
"dev": true,
"requires": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@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.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
"dev": true,
"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.16.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz",
- "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==",
+ "version": "7.16.12",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
+ "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
"dev": true
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz",
- "integrity": "sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
+ "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7"
}
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz",
- "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
+ "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
"@babel/plugin-syntax-async-generators": "^7.8.4"
}
},
"@babel/plugin-proposal-class-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
- "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-proposal-class-static-block": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz",
- "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
+ "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
}
},
"@babel/plugin-proposal-dynamic-import": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz",
- "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
}
},
"@babel/plugin-proposal-export-namespace-from": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz",
- "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
+ "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
}
},
"@babel/plugin-proposal-json-strings": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz",
- "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
+ "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-json-strings": "^7.8.3"
}
},
"@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz",
- "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
+ "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
}
},
"@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz",
- "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
+ "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
}
},
"@babel/plugin-proposal-numeric-separator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz",
- "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz",
- "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
+ "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.16.0"
+ "@babel/plugin-transform-parameters": "^7.16.7"
}
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz",
- "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
}
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
}
},
"@babel/plugin-proposal-private-methods": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz",
- "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==",
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
+ "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-class-features-plugin": "^7.16.10",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-proposal-private-property-in-object": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz",
- "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
+ "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz",
- "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
+ "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-syntax-async-generators": {
@@ -6389,344 +6604,346 @@
}
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz",
- "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
+ "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0"
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
}
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz",
- "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz",
- "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
+ "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz",
- "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
+ "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
"globals": "^11.1.0"
}
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz",
- "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
+ "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz",
- "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
+ "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz",
- "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-duplicate-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz",
- "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
+ "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz",
- "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
"dev": true,
"requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz",
- "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
+ "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz",
- "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz",
- "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
+ "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-member-expression-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz",
- "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-modules-amd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz",
- "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
+ "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz",
- "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-simple-access": "^7.16.0",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz",
- "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
+ "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-umd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz",
- "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
+ "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz",
- "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
+ "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz",
- "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
+ "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz",
- "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0"
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7"
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz",
- "integrity": "sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
+ "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-property-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz",
- "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz",
- "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
+ "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
"dev": true,
"requires": {
"regenerator-transform": "^0.14.2"
}
},
"@babel/plugin-transform-reserved-words": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz",
- "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
+ "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz",
- "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz",
- "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
+ "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
}
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz",
- "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz",
- "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
+ "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz",
- "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
+ "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-unicode-escapes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz",
- "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz",
- "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
}
},
"@babel/preset-env": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz",
- "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==",
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
+ "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.16.0",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-class-static-block": "^7.16.0",
- "@babel/plugin-proposal-dynamic-import": "^7.16.0",
- "@babel/plugin-proposal-export-namespace-from": "^7.16.0",
- "@babel/plugin-proposal-json-strings": "^7.16.0",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.16.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.16.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.16.0",
+ "@babel/compat-data": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
+ "@babel/plugin-proposal-class-static-block": "^7.16.7",
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+ "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-private-methods": "^7.16.11",
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
@@ -6741,44 +6958,44 @@
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-transform-arrow-functions": "^7.16.0",
- "@babel/plugin-transform-async-to-generator": "^7.16.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.16.0",
- "@babel/plugin-transform-block-scoping": "^7.16.0",
- "@babel/plugin-transform-classes": "^7.16.0",
- "@babel/plugin-transform-computed-properties": "^7.16.0",
- "@babel/plugin-transform-destructuring": "^7.16.0",
- "@babel/plugin-transform-dotall-regex": "^7.16.0",
- "@babel/plugin-transform-duplicate-keys": "^7.16.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.16.0",
- "@babel/plugin-transform-for-of": "^7.16.0",
- "@babel/plugin-transform-function-name": "^7.16.0",
- "@babel/plugin-transform-literals": "^7.16.0",
- "@babel/plugin-transform-member-expression-literals": "^7.16.0",
- "@babel/plugin-transform-modules-amd": "^7.16.0",
- "@babel/plugin-transform-modules-commonjs": "^7.16.0",
- "@babel/plugin-transform-modules-systemjs": "^7.16.0",
- "@babel/plugin-transform-modules-umd": "^7.16.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0",
- "@babel/plugin-transform-new-target": "^7.16.0",
- "@babel/plugin-transform-object-super": "^7.16.0",
- "@babel/plugin-transform-parameters": "^7.16.0",
- "@babel/plugin-transform-property-literals": "^7.16.0",
- "@babel/plugin-transform-regenerator": "^7.16.0",
- "@babel/plugin-transform-reserved-words": "^7.16.0",
- "@babel/plugin-transform-shorthand-properties": "^7.16.0",
- "@babel/plugin-transform-spread": "^7.16.0",
- "@babel/plugin-transform-sticky-regex": "^7.16.0",
- "@babel/plugin-transform-template-literals": "^7.16.0",
- "@babel/plugin-transform-typeof-symbol": "^7.16.0",
- "@babel/plugin-transform-unicode-escapes": "^7.16.0",
- "@babel/plugin-transform-unicode-regex": "^7.16.0",
+ "@babel/plugin-transform-arrow-functions": "^7.16.7",
+ "@babel/plugin-transform-async-to-generator": "^7.16.8",
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+ "@babel/plugin-transform-block-scoping": "^7.16.7",
+ "@babel/plugin-transform-classes": "^7.16.7",
+ "@babel/plugin-transform-computed-properties": "^7.16.7",
+ "@babel/plugin-transform-destructuring": "^7.16.7",
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.16.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+ "@babel/plugin-transform-for-of": "^7.16.7",
+ "@babel/plugin-transform-function-name": "^7.16.7",
+ "@babel/plugin-transform-literals": "^7.16.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+ "@babel/plugin-transform-modules-amd": "^7.16.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.16.7",
+ "@babel/plugin-transform-modules-umd": "^7.16.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
+ "@babel/plugin-transform-new-target": "^7.16.7",
+ "@babel/plugin-transform-object-super": "^7.16.7",
+ "@babel/plugin-transform-parameters": "^7.16.7",
+ "@babel/plugin-transform-property-literals": "^7.16.7",
+ "@babel/plugin-transform-regenerator": "^7.16.7",
+ "@babel/plugin-transform-reserved-words": "^7.16.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+ "@babel/plugin-transform-spread": "^7.16.7",
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
+ "@babel/plugin-transform-template-literals": "^7.16.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.16.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.16.0",
- "babel-plugin-polyfill-corejs2": "^0.2.3",
- "babel-plugin-polyfill-corejs3": "^0.3.0",
- "babel-plugin-polyfill-regenerator": "^0.2.3",
- "core-js-compat": "^3.19.0",
+ "@babel/types": "^7.16.8",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "core-js-compat": "^3.20.2",
"semver": "^6.3.0"
}
},
@@ -6796,9 +7013,9 @@
}
},
"@babel/runtime": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.0.tgz",
- "integrity": "sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==",
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
+ "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
@@ -6813,47 +7030,48 @@
}
},
"@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.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
}
},
"@babel/traverse": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz",
- "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==",
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
+ "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
"dev": true,
"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.0",
- "@babel/types": "^7.16.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.16.8",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.16.10",
+ "@babel/types": "^7.16.8",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
- "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
+ "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
}
},
"@discoveryjs/json-ext": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz",
- "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==",
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
"dev": true
},
"@nodelib/fs.scandir": {
@@ -6882,10 +7100,48 @@
"fastq": "^1.6.0"
}
},
+ "@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "dev": true,
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/bonjour": {
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+ "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/connect-history-api-fallback": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+ "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
"@types/eslint": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz",
- "integrity": "sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA==",
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
+ "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
"dev": true,
"requires": {
"@types/estree": "*",
@@ -6893,9 +7149,9 @@
}
},
"@types/eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==",
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+ "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
"dev": true,
"requires": {
"@types/eslint": "*",
@@ -6908,10 +7164,33 @@
"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
"dev": true
},
+ "@types/express": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
+ "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.18",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.17.28",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
+ "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
"@types/http-proxy": {
- "version": "1.17.7",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
- "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==",
+ "version": "1.17.8",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
+ "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
"dev": true,
"requires": {
"@types/node": "*"
@@ -6923,10 +7202,28 @@
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
"dev": true
},
+ "@types/mime": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
+ "dev": true
+ },
"@types/node": {
- "version": "16.11.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz",
- "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==",
+ "version": "17.0.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz",
+ "integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==",
+ "dev": true
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+ "dev": true
+ },
+ "@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"dev": true
},
"@types/retry": {
@@ -6935,6 +7232,43 @@
"integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
"dev": true
},
+ "@types/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+ "dev": true,
+ "requires": {
+ "@types/express": "*"
+ }
+ },
+ "@types/serve-static": {
+ "version": "1.13.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
+ "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+ "dev": true,
+ "requires": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "@types/sockjs": {
+ "version": "0.3.33",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+ "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/ws": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
+ "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -7082,25 +7416,25 @@
}
},
"@webpack-cli/configtest": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
- "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
+ "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
"dev": true,
"requires": {}
},
"@webpack-cli/info": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz",
- "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz",
+ "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==",
"dev": true,
"requires": {
"envinfo": "^7.7.3"
}
},
"@webpack-cli/serve": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
- "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
+ "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
"dev": true,
"requires": {}
},
@@ -7127,9 +7461,9 @@
}
},
"acorn": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
- "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+ "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
"dev": true
},
"acorn-import-assertions": {
@@ -7161,6 +7495,35 @@
"uri-js": "^4.2.2"
}
},
+ "ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
+ }
+ },
"ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -7242,33 +7605,33 @@
}
},
"babel-plugin-polyfill-corejs2": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz",
- "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
"dev": true,
"requires": {
"@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.2.4",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
"semver": "^6.1.1"
}
},
"babel-plugin-polyfill-corejs3": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz",
- "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz",
+ "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==",
"dev": true,
"requires": {
- "@babel/helper-define-polyfill-provider": "^0.2.4",
- "core-js-compat": "^3.18.0"
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.20.0"
}
},
"babel-plugin-polyfill-regenerator": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz",
- "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
"dev": true,
"requires": {
- "@babel/helper-define-polyfill-provider": "^0.2.4"
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
}
},
"babel-polyfill": {
@@ -7325,27 +7688,27 @@
"dev": true
},
"body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz",
+ "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==",
"dev": true,
"requires": {
- "bytes": "3.1.0",
+ "bytes": "3.1.1",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
- "http-errors": "1.7.2",
+ "http-errors": "1.8.1",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
+ "qs": "6.9.6",
+ "raw-body": "2.4.2",
+ "type-is": "~1.6.18"
},
"dependencies": {
"bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
+ "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
"dev": true
},
"debug": {
@@ -7399,13 +7762,13 @@
}
},
"browserslist": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz",
- "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==",
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+ "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001271",
- "electron-to-chromium": "^1.3.878",
+ "caniuse-lite": "^1.0.30001286",
+ "electron-to-chromium": "^1.4.17",
"escalade": "^3.1.1",
"node-releases": "^2.0.1",
"picocolors": "^1.0.0"
@@ -7440,9 +7803,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001274",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz",
- "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==",
+ "version": "1.0.30001301",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz",
+ "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==",
"dev": true
},
"chalk": {
@@ -7457,9 +7820,9 @@
}
},
"chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
@@ -7582,12 +7945,20 @@
"dev": true
},
"content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "safe-buffer": "5.2.1"
+ },
+ "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==",
+ "dev": true
+ }
}
},
"content-type": {
@@ -7606,9 +7977,9 @@
}
},
"cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
"dev": true
},
"cookie-signature": {
@@ -7624,12 +7995,12 @@
"dev": true
},
"core-js-compat": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.0.tgz",
- "integrity": "sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==",
+ "version": "3.20.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz",
+ "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==",
"dev": true,
"requires": {
- "browserslist": "^4.17.5",
+ "browserslist": "^4.19.1",
"semver": "7.0.0"
},
"dependencies": {
@@ -7659,9 +8030,9 @@
}
},
"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.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -7780,9 +8151,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.885",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz",
- "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==",
+ "version": "1.4.52",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.52.tgz",
+ "integrity": "sha512-JGkh8HEh5PnVrhU4HbpyyO0O791dVY6k7AdqfDeqbcRMeoGxtNHWT77deR2nhvbLe4dKpxjlDEvdEwrvRLGu2Q==",
"dev": true
},
"emojis-list": {
@@ -7912,17 +8283,17 @@
}
},
"express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz",
+ "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==",
"dev": true,
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
+ "body-parser": "1.19.1",
+ "content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.4.0",
+ "cookie": "0.4.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
@@ -7936,13 +8307,13 @@
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.9.6",
"range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.17.2",
+ "serve-static": "1.14.2",
+ "setprototypeof": "1.2.0",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
@@ -7969,6 +8340,12 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
+ },
+ "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==",
+ "dev": true
}
}
},
@@ -7979,9 +8356,9 @@
"dev": true
},
"fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@@ -8084,9 +8461,9 @@
}
},
"follow-redirects": {
- "version": "1.14.5",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
- "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==",
+ "version": "1.14.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
+ "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
"dev": true
},
"forwarded": {
@@ -8185,23 +8562,23 @@
"dev": true
},
"globby": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
- "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
"slash": "^3.0.0"
}
},
"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.9",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
"dev": true
},
"handle-thing": {
@@ -8291,22 +8668,22 @@
"dev": true
},
"http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
"dev": true,
"requires": {
"depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
+ "toidentifier": "1.0.1"
}
},
"http-parser-js": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
- "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
+ "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
"dev": true
},
"http-proxy": {
@@ -8321,12 +8698,12 @@
}
},
"http-proxy-middleware": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz",
- "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz",
+ "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==",
"dev": true,
"requires": {
- "@types/http-proxy": "^1.17.5",
+ "@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"is-plain-obj": "^3.0.0",
@@ -8349,15 +8726,15 @@
}
},
"ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true
},
"import-local": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
- "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
"dev": true,
"requires": {
"pkg-dir": "^4.2.0",
@@ -8381,31 +8758,11 @@
}
},
"inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "internal-ip": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz",
- "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==",
- "dev": true,
- "requires": {
- "default-gateway": "^6.0.0",
- "ipaddr.js": "^1.9.1",
- "is-ip": "^3.1.0",
- "p-event": "^4.2.0"
- },
- "dependencies": {
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true
- }
- }
- },
"interpret": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
@@ -8418,12 +8775,6 @@
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"dev": true
},
- "ip-regex": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz",
- "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==",
- "dev": true
- },
"ipaddr.js": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
@@ -8450,9 +8801,9 @@
}
},
"is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
"dev": true,
"requires": {
"has": "^1.0.3"
@@ -8488,15 +8839,6 @@
"is-extglob": "^2.1.1"
}
},
- "is-ip": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz",
- "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==",
- "dev": true,
- "requires": {
- "ip-regex": "^4.0.0"
- }
- },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -8574,9 +8916,9 @@
"dev": true
},
"jest-worker": {
- "version": "27.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz",
- "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==",
+ "version": "27.4.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz",
+ "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==",
"dev": true,
"requires": {
"@types/node": "*",
@@ -8705,9 +9047,9 @@
"dev": true
},
"memfs": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz",
- "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
+ "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
"dev": true,
"requires": {
"fs-monkey": "1.0.3"
@@ -8754,18 +9096,18 @@
"dev": true
},
"mime-db": {
- "version": "1.50.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
- "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
+ "version": "1.51.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
+ "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"dev": true
},
"mime-types": {
- "version": "2.1.33",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz",
- "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==",
+ "version": "2.1.34",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
+ "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dev": true,
"requires": {
- "mime-db": "1.50.0"
+ "mime-db": "1.51.0"
}
},
"mimic-fn": {
@@ -8839,9 +9181,9 @@
"dev": true
},
"node-forge": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
- "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
+ "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
"dev": true
},
"node-releases": {
@@ -8943,21 +9285,6 @@
"is-wsl": "^2.2.0"
}
},
- "p-event": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
- "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==",
- "dev": true,
- "requires": {
- "p-timeout": "^3.1.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true
- },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -8995,15 +9322,6 @@
"retry": "^0.13.1"
}
},
- "p-timeout": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
- "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
- "dev": true,
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -9059,9 +9377,9 @@
"dev": true
},
"picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"pkg-dir": {
@@ -9126,15 +9444,9 @@
"dev": true
},
"qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
- "dev": true
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "version": "6.9.6",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
+ "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
"dev": true
},
"queue-microtask": {
@@ -9159,21 +9471,21 @@
"dev": true
},
"raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
+ "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==",
"dev": true,
"requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
+ "bytes": "3.1.1",
+ "http-errors": "1.8.1",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
+ "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==",
"dev": true
}
}
@@ -9238,9 +9550,9 @@
}
},
"regexp.prototype.flags": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
- "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
+ "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -9284,6 +9596,12 @@
}
}
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -9291,13 +9609,14 @@
"dev": true
},
"resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
}
},
"resolve-cwd": {
@@ -9375,12 +9694,12 @@
"dev": true
},
"selfsigned": {
- "version": "1.10.11",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
- "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
+ "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
"dev": true,
"requires": {
- "node-forge": "^0.10.0"
+ "node-forge": "^1.2.0"
}
},
"semver": {
@@ -9390,9 +9709,9 @@
"dev": true
},
"send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "version": "0.17.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
+ "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
"dev": true,
"requires": {
"debug": "2.6.9",
@@ -9402,9 +9721,9 @@
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
- "http-errors": "~1.7.2",
+ "http-errors": "1.8.1",
"mime": "1.6.0",
- "ms": "2.1.1",
+ "ms": "2.1.3",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
@@ -9428,9 +9747,9 @@
}
},
"ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
}
}
@@ -9480,6 +9799,12 @@
"statuses": ">= 1.4.0 < 2"
}
},
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -9495,21 +9820,21 @@
}
},
"serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
+ "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.17.1"
+ "send": "0.17.2"
}
},
"setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
},
"shallow-clone": {
@@ -9537,9 +9862,9 @@
"dev": true
},
"signal-exit": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
- "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
+ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
"dev": true
},
"slash": {
@@ -9549,13 +9874,13 @@
"dev": true
},
"sockjs": {
- "version": "0.3.21",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
- "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
"dev": true,
"requires": {
"faye-websocket": "^0.11.3",
- "uuid": "^3.4.0",
+ "uuid": "^8.3.2",
"websocket-driver": "^0.7.4"
}
},
@@ -9566,9 +9891,9 @@
"dev": true
},
"source-map-support": {
- "version": "0.5.20",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz",
- "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==",
+ "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==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
@@ -9657,6 +9982,12 @@
"has-flag": "^3.0.0"
}
},
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -9664,9 +9995,9 @@
"dev": true
},
"terser": {
- "version": "5.9.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz",
- "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==",
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
+ "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"dev": true,
"requires": {
"commander": "^2.20.0",
@@ -9683,28 +10014,18 @@
}
},
"terser-webpack-plugin": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz",
- "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz",
+ "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==",
"dev": true,
"requires": {
- "jest-worker": "^27.0.6",
- "p-limit": "^3.1.0",
+ "jest-worker": "^27.4.1",
"schema-utils": "^3.1.1",
"serialize-javascript": "^6.0.0",
"source-map": "^0.6.1",
"terser": "^5.7.2"
},
"dependencies": {
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
"schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@@ -9746,9 +10067,9 @@
}
},
"toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true
},
"type-is": {
@@ -9804,24 +10125,6 @@
"punycode": "^2.1.0"
}
},
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "dev": true,
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- }
- }
- },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -9835,9 +10138,9 @@
"dev": true
},
"uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true
},
"vary": {
@@ -9847,9 +10150,9 @@
"dev": true
},
"watchpack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz",
- "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+ "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
"dev": true,
"requires": {
"glob-to-regexp": "^0.4.1",
@@ -9866,9 +10169,9 @@
}
},
"webpack": {
- "version": "5.61.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.61.0.tgz",
- "integrity": "sha512-fPdTuaYZ/GMGFm4WrPi2KRCqS1vDp773kj9S0iI5Uc//5cszsFEDgHNaX4Rj1vobUiU1dFIV3mA9k1eHeluFpw==",
+ "version": "5.67.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz",
+ "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.0",
@@ -9885,7 +10188,7 @@
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.4",
+ "graceful-fs": "^4.2.9",
"json-parse-better-errors": "^1.0.2",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
@@ -9893,8 +10196,8 @@
"schema-utils": "^3.1.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.2.0",
- "webpack-sources": "^3.2.0"
+ "watchpack": "^2.3.1",
+ "webpack-sources": "^3.2.3"
},
"dependencies": {
"schema-utils": {
@@ -9911,15 +10214,15 @@
}
},
"webpack-cli": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
- "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz",
+ "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==",
"dev": true,
"requires": {
"@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.1.0",
- "@webpack-cli/info": "^1.4.0",
- "@webpack-cli/serve": "^1.6.0",
+ "@webpack-cli/configtest": "^1.1.1",
+ "@webpack-cli/info": "^1.4.1",
+ "@webpack-cli/serve": "^1.6.1",
"colorette": "^2.0.14",
"commander": "^7.0.0",
"execa": "^5.0.0",
@@ -9939,73 +10242,133 @@
}
},
"webpack-dev-middleware": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz",
- "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
+ "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
"dev": true,
"requires": {
"colorette": "^2.0.10",
"memfs": "^3.2.2",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
- "schema-utils": "^3.1.0"
+ "schema-utils": "^4.0.0"
},
"dependencies": {
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
}
}
}
},
"webpack-dev-server": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz",
- "integrity": "sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA==",
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
+ "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
"dev": true,
"requires": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/serve-index": "^1.9.1",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.2.2",
"ansi-html-community": "^0.0.8",
"bonjour": "^3.5.0",
"chokidar": "^3.5.2",
"colorette": "^2.0.10",
"compression": "^1.7.4",
"connect-history-api-fallback": "^1.6.0",
+ "default-gateway": "^6.0.3",
"del": "^6.0.0",
"express": "^4.17.1",
"graceful-fs": "^4.2.6",
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.0",
- "internal-ip": "^6.2.0",
"ipaddr.js": "^2.0.1",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"portfinder": "^1.0.28",
- "schema-utils": "^3.1.0",
- "selfsigned": "^1.10.11",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.0.0",
"serve-index": "^1.9.1",
"sockjs": "^0.3.21",
"spdy": "^4.0.2",
"strip-ansi": "^7.0.0",
- "url": "^0.11.0",
- "webpack-dev-middleware": "^5.2.1",
+ "webpack-dev-middleware": "^5.3.0",
"ws": "^8.1.0"
},
"dependencies": {
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "ajv": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
}
}
}
@@ -10021,9 +10384,9 @@
}
},
"webpack-sources": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz",
- "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true
},
"websocket-driver": {
@@ -10065,17 +10428,11 @@
"dev": true
},
"ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
+ "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
"dev": true,
"requires": {}
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
}
}
}
diff --git a/front/package.json b/front/package.json
index 679edc4..529b1b4 100644
--- a/front/package.json
+++ b/front/package.json
@@ -6,7 +6,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
- "start": "webpack-dev-server"
+ "start": "webpack serve --no-live-reload"
},
"repository": {
"type": "git",
diff --git a/front/public/JS/accountUser.app.js b/front/public/JS/accountUser.app.js
index d1d863c..ae2e7ed 100644
--- a/front/public/JS/accountUser.app.js
+++ b/front/public/JS/accountUser.app.js
@@ -1,294 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/accountUser.js":
-/*!****************************!*\
- !*** ./src/accountUser.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n/* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/webportage.js */ \"./src/tools/webportage.js\");\n// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT\n/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas.\n/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire.\n/// Une information est affichée concernant la possibilité de parrainage et liste les filleuls existants.\n/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc.\n/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement.\n/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.\n// Fichier de configuration côté client :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // besoin de toutes les déclarations pour la fonction : updateAccountLink()\n\n\nconst {\n beginCodeGodfather\n} = __webpack_require__(/*! ../../config/instance */ \"../config/instance.js\");\n\nconst configUsers = __webpack_require__(/*! ../../config/users */ \"../config/users.js\"); // besoin de tous le fichier pour configurer le formulaire\n// Fonctions utiles au script\n\n\n\n\n\n\n\n // Spécifique WebPortage pour paiements:\n\n // Dictionnaires :\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n infosUserNbGodChilds,\n infosUserNoGodchilds,\n needBeConnected\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\");\n\nconst {\n infosExpirated,\n infosNbDays\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/subscription$\")(\"./\" + lang + \"/subscription\"); // Principaux éléments du DOM manipulés :\n\n\nconst divCrash = document.getElementById(\"crash\");\nconst divMain = document.getElementById(\"main-content\");\nconst divMessage = document.getElementById(\"message\");\nconst divResponse = document.getElementById(\"response\");\nconst divGodfatherInfos = document.getElementById(\"godfatherInfos\");\nconst divGodchilds = document.getElementById(\"godchilds\");\nconst divSubscribeInfos = document.getElementById(\"subscribeInfos\");\nconst divSubscribeIntro = document.getElementById(\"subscribeIntro\");\nconst formAccount = document.getElementById(\"accountUpdate\");\nconst newPassword = document.getElementById(\"newPassword\");\nconst showGFEmail = document.getElementById(\"godfatherEmail\");\nconst showGFCode = document.getElementById(\"godfatherCode\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\nconst initialise = async () => {\n try {\n // Si l'utilisateur n'est pas connecté avec le bon statut, pas la peine d'aller + loin :\n const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.checkSession)([\"user\"], \"/\" + configTemplate.connectionPage, {\n message: needBeConnected,\n color: \"error\"\n }, window.location);\n\n if (isConnected) {\n divMain.style.display = \"block\"; // l'éventuelle ancre est ignorée, car absente du DOM avant d'avoir vérifié la connexion\n\n if (window.location.hash !== undefined) window.location.assign(window.location.hash);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\"))) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divMessage, \"p\", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\", true).message, \"\", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\", true).color], \"\", false);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.removeLocaly)(\"message\");\n }\n\n const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.updateAccountLink)(user.status, configTemplate); // Initialise le formulaire permettant de mettre à jour les infos :\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configUsers, formAccount); // Certains navigateurs remplissent les champs password :\n\n newPassword.value = \"\"; // Fonction affichant les infos connues au premier affichage, puis après envoi mise à jour\n\n const getInfos = () => {\n const xhrGetInfos = new XMLHttpRequest();\n xhrGetInfos.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.getUserInfos + user.id);\n\n xhrGetInfos.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.User != undefined && response.Subscription != undefined) {\n for (let data in response.User) {\n if (formAccount.elements[data] !== undefined) {\n if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !\n formAccount.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien \n formAccount.elements[\"\" + data].checked = \"checked\";\n }\n } // jours de réception\n\n\n for (let i in response.Subscription.receiptDays) formAccount.elements[\"d\" + response.Subscription.receiptDays[i]].checked = \"checked\"; // \"codes\" possibles à transmettre pour parrainer d'autres utilisateurs \n\n\n showGFEmail.innerHTML = response.User.email;\n showGFCode.innerHTML = beginCodeGodfather + response.User.id;\n }\n\n const beginSubTS = new Date(response.Subscription.createdAt).getTime();\n\n if (response.Subscription.numberOfDays !== 0) {\n divGodfatherInfos.style.display = \"block\";\n divSubscribeInfos.style.display = \"block\";\n const nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);\n if (nbDaysOk > 0) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSubscribeIntro, \"p\", infosNbDays.replace(\"NB_DAYS\", nbDaysOk), \"\", [\"info\"]);else {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSubscribeIntro, \"p\", infosExpirated.replace(\"NB_DAYS\", nbDaysOk), \"\", [\"error\"]);\n window.location.assign(\"#subscribe\");\n }\n }\n }\n };\n\n xhrGetInfos.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrGetInfos.send();\n }; // Remonte les infos déjà enregistrées :\n\n\n getInfos(); // Traitement de l'envoi d'une mise à jour des infos\n\n formAccount.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n divResponse.innerHTML = \"\";\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formAccount); // recomposition des jours valables pour l'abonnement :\n\n datas.receiptDays = \"\";\n\n for (let i = 1; i <= 7; i++) {\n if (datas[\"d\" + i] !== undefined) datas.receiptDays += \"\" + i;\n }\n\n datas.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.getTimeDifference)();\n const xhrUserUpdate = new XMLHttpRequest();\n if (datas.deleteOk !== undefined) xhrUserUpdate.open(\"DELETE\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + \"/\" + user.id);else xhrUserUpdate.open(\"PUT\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.updateUserInfos + user.id);\n\n xhrUserUpdate.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.message != undefined) {\n if (Array.isArray(response.message)) response.message = response.message.join(\"
\");else response.message = response.message;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]); // dans tous les cas, je mets à jour le contenu du formulaire :\n\n\n getInfos();\n }\n };\n\n xhrUserUpdate.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrUserUpdate.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n\n if (datas) {\n datas.output = \"html\";\n xhrUserUpdate.send(JSON.stringify(datas));\n }\n }); // on passe à la caisse ?\n\n const abo9 = document.getElementById(\"abo9\");\n const abo18 = document.getElementById(\"abo18\");\n const abo36 = document.getElementById(\"abo36\");\n const abo54 = document.getElementById(\"abo54\");\n const CGV = document.getElementById(\"CGVOk\");\n const divWPBtns = document.getElementById(\"WPBtns\");\n divWPBtns.style.display = \"none\";\n abo9.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.unCheckAllOthers)(\"abo9\");\n });\n abo18.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.unCheckAllOthers)(\"abo18\");\n });\n abo36.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.unCheckAllOthers)(\"abo36\");\n });\n abo54.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.unCheckAllOthers)(\"abo54\");\n });\n CGV.addEventListener(\"change\", function (e) {\n if (CGV.checked === true) {\n divWPBtns.style.display = \"block\";\n if (abo9.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.showBtnPayment)(\"btn9\");else if (abo18.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.showBtnPayment)(\"btn18\");else if (abo36.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.showBtnPayment)(\"btn36\");else if (abo54.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__.showBtnPayment)(\"btn54\");else {\n divWPBtns.style.display = \"none\";\n CGV.checked = false;\n }\n } else divWPBtns.style.display = \"none\";\n }); // Liste des filleuls, si il y en a\n\n const xhrGetGodchilds = new XMLHttpRequest();\n xhrGetGodchilds.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.getGodChilds);\n\n xhrGetGodchilds.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText),\n txtGodchilds = \"\";\n\n if (this.status === 200) {\n const nbGodchilds = response.length;\n if (nbGodchilds === 0) txtGodchilds = infosUserNoGodchilds;else {\n txtGodchilds = infosUserNbGodChilds.replace(\"#NB\", nbGodchilds);\n\n for (let i in response) txtGodchilds += response[i].name + \" (\" + response[i].email + \") \";\n }\n }\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divGodchilds, \"p\", txtGodchilds, \"\", [\"info\"]);\n }\n };\n\n xhrGetGodchilds.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrGetGodchilds.send();\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divCrash, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/accountUser.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "./src/tools/webportage.js":
-/*!*********************************!*\
- !*** ./src/tools/webportage.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"unCheckAllOthers\": function() { return /* binding */ unCheckAllOthers; },\n/* harmony export */ \"showBtnPayment\": function() { return /* binding */ showBtnPayment; }\n/* harmony export */ });\nconst checkBoxes = {\n \"CGV\": document.getElementById(\"CGVOk\"),\n \"abo1\": document.getElementById(\"abo1\"),\n \"abo2\": document.getElementById(\"abo2\"),\n \"abo3\": document.getElementById(\"abo3\"),\n \"abo4\": document.getElementById(\"abo4\")\n};\nconst divWPBtns = document.getElementById(\"WPBtns\"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés\n\nconst unCheckAllOthers = choice => {\n for (let id in checkBoxes) {\n if (id !== choice) checkBoxes[id].checked = false;\n divWPBtns.style.display = \"none\";\n }\n};\nconst btns = {\n \"btn1\": document.getElementById(\"WPBtn1\"),\n \"btn2\": document.getElementById(\"WPBtn2\"),\n \"btn3\": document.getElementById(\"WPBtn3\"),\n \"btn4\": document.getElementById(\"WPBtn4\")\n}; // Affiche le bon bouton de paiement et cache les autres\n\nconst showBtnPayment = choice => {\n for (let id in btns) {\n if (id !== choice) btns[id].style.display = \"none\";else btns[id].style.display = \"block\";\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/webportage.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/subscription.js":
-/*!**********************************!*\
- !*** ../lang/fr/subscription.js ***!
- \**********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n allSubscriptionProcessed: \"Tous les abonnés ont été traités pour le moment.\",\n infosExpirated: \"Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
Pour ce faire, suivez sans tarder les indications ci-dessous :\",\n infosExpiratedAdmin: \"Cet abonnement a expiré.\",\n infosNbDays: \"Votre abonnement est encore valable pendant NB_DAYS jours.
Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :\",\n infosNbDaysAdmin: \"Cet abonnement est encore valable pendant NB_DAYS jours.\",\n infosPaymentsAdmin: \"DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.\",\n isNotValided: \"Cet utilisateur n'a pas encore validé son compte.
Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.\",\n mailEndFreeTimeBodyHTML: \"
Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.
Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.
Votre abonnement à SITE_NAME va expirer d'ici quelques jours.
Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.
Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.
\",\n mailDeleteBodyTxt: \"Bonjour USER_NAME,\\n\\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\\nLINK_URL\",\n mailDeleteLinkAlreadyMessage: \"Il semble que vous ayez déjà validé la suppression de votre compte.\",\n mailDeleteLinkFailMessage: \"Votre lien de suppression n'est pas valide ou alors il a expiré.\",\n mailDeleteLinkMessage: \"Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.\",\n mailDeleteLinkOkMessage: \"Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.\",\n mailDeleteLinkTxt: \"Confirmer.\",\n mailDeleteSubject: \"Confirmer la suppression de votre compte.\",\n mailLoginLinkBodyHTML: \"Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
\",\n mailLoginLinkBodyTxt: \"Bonjour USER_NAME,\\n\\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\\nLINK_URL\",\n mailLoginLinkMessage: \"Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant *TIMING* !\",\n mailLoginLinkSubject: \"Votre lien de connexion.\",\n mailLoginLinkTxt: \"Me connecter.\",\n mailThankGodfatherBodyHTML: \"Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.
Encore merci et à bientôt !
\",\n mailThankGodfatherBodyTxt: \"Bonjour USER_NAME,\\nGrâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\\nEncore merci et à bientôt !\",\n mailThankGodfatherLinkTxt: \"Me connecter à mon compte.\",\n mailThankGodfatherSubject: \"Merci !\",\n mailUpdateLoginBodyHTML: \"Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.
\",\n mailUpdateLoginBodyTxt: \"Bonjour USER_NAME,\\n\\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\\nLINK_URL\",\n mailUpdateLoginLinkMessage: \"Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement.Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.
\",\n mailValidationLinkSBodyTxt: \"Bonjour USER_NAME,\\n\\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\\nLINK_URL\",\n mailValidationLinkSubject: \"Merci de valider votre inscription\",\n mailValidationLinkTxt: \"Valider mon compte.\",\n mailValidationMessage: \"Votre inscription est bien enregistrée.\\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient d'être envoyé à votre adresse e-mail (#EMAIL).\",\n mailWelcomeBodyHTML: \"Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.
Aristote : « L’homme a naturellement la passion de connaître… »\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur.
WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous.
\",\n explanationElementTxt: \"WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.).
Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations.
Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu.
Vous apprenez ainsi régulièrement de nouvelles choses très simplement.
\",\n\n /* Autres */\n illustrationDir: \"/img/quizs/\",\n twitterAccount: \"WikiLerni\",\n maxQuestionnairesByPage: 12,\n maxQuestionnairesSiteHomePage: 3,\n nbQuestionnairesUserHomePage: 3\n};\n\n//# sourceURL=webpack://wikilerni/../views/wikilerni/config/fr.js?"); - -/***/ }), - -/***/ "../lang sync recursive ^\\.\\/.*\\/general$": -/*!***************************************!*\ - !*** ../lang/ sync ^\.\/.*\/general$ ***! - \***************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -eval("var map = {\n\t\"./fr/general\": \"../lang/fr/general.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\";\n\n//# sourceURL=webpack://wikilerni/../lang/_sync_^\\.\\/.*\\/general$?"); - -/***/ }), - -/***/ "../lang sync recursive ^\\.\\/.*\\/subscription$": -/*!********************************************!*\ - !*** ../lang/ sync ^\.\/.*\/subscription$ ***! - \********************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -eval("var map = {\n\t\"./fr/subscription\": \"../lang/fr/subscription.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../lang sync recursive ^\\\\.\\\\/.*\\\\/subscription$\";\n\n//# sourceURL=webpack://wikilerni/../lang/_sync_^\\.\\/.*\\/subscription$?"); - -/***/ }), - -/***/ "../lang sync recursive ^\\.\\/.*\\/user$": -/*!************************************!*\ - !*** ../lang/ sync ^\.\/.*\/user$ ***! - \************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -eval("var map = {\n\t\"./fr/user\": \"../lang/fr/user.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\";\n\n//# sourceURL=webpack://wikilerni/../lang/_sync_^\\.\\/.*\\/user$?"); - -/***/ }), - -/***/ "../views sync recursive ^\\.\\/.*\\.js$": -/*!***********************************!*\ - !*** ../views/ sync ^\.\/.*\.js$ ***! - \***********************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -eval("var map = {\n\t\"./default/config/fr.js\": \"../views/default/config/fr.js\",\n\t\"./wikilerni/config/fr.js\": \"../views/wikilerni/config/fr.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\";\n\n//# sourceURL=webpack://wikilerni/../views/_sync_^\\.\\/.*\\.js$?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ !function() { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function() { return module['default']; } : -/******/ function() { return module; }; -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/accountUser.js"); -/******/ -/******/ })() -; \ No newline at end of file +!function(){var e={6028:function(e,n,t){const i=t(671),s=t(4988);e.exports={apiUrl:"http://localhost:3000/api",siteUrl:"http://localhost:8080",siteUrlProd:"https://www.wikilerni.com",adminName:"Fab",adminEmail:"dev@wikilerni.com",senderName:"WikiLerni",senderEmail:"bonjour@wikilerni.com",adminLang:"fr",theme:"wikilerni",availableLangs:["fr"],siteName:"WikiLerni",beginCodeGodfather:"WL",defaultReceiptDays:"147",cronTimingAlertInSeconde:120,responseTimingAlertInSeconde:3,tokenSignupValidationTimeInHours:"48h",tokenLoginLinkTimeInHours:"1h",tokenConnexionMinTimeInHours:"24h",tokenConnexionMaxTimeInDays:"180 days",tokenLoginChangingTimeInHours:"1h",tokenDeleteUserTimeInHours:"1h",tokenUnsubscribeLinkTimeInDays:"7 days",freeAccountTimingInDays:0,freeAccountExpirationNotificationInDays:3,accountExpirationFirstNotificationInDays:10,accountExpirationSecondNotificationInDays:3,inactiveAccountTimeToDeleteInDays:180,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbNewQuestionnaires:12,hourGiveNewQuestionnaireBegin:3,hourGiveNewQuestionnaireEnd:8,maxQuestionnaireSendedAtSameTime:50,minSearchQuestionnaires:3,fieldNewQuestionnaires:"publishingAt",nbQuestionnairesByGroupMin:1,nbQuestionnairesByGroupMax:0,nbIllustrationsMin:1,nbIllustrationsMax:1,maxIllustrationSizeinOctet:1e6,mimeTypesForIllustration:["image/jpg","image/jpeg","image/png","image/gif","image/png"],illustrationsWidthMaxInPx:500,illustrationsMiniaturesWidthMaxInPx:200,nbLinksMin:1,nbLinksMax:0,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,passwordMinLength:i.password.minlength,dirCacheUsers:i.dirCacheUsers,dirCacheUsersAnswers:i.dirCacheUsersAnswers,dirCacheQuestionnaires:s.dirCacheQuestionnaires,dirCacheQuestions:s.dirCacheQuestions,dirCacheUsersQuestionnaires:s.dirCacheUsersQuestionnaires,dirHTMLQuestionnaires:s.dirHTMLQuestionnaires,dirWebQuestionnaires:s.dirWebQuestionnaires}},4988:function(e){e.exports={questionnaireRoutes:"/questionnaire",getListNextQuestionnaires:"/getlistnextquestionnaires/",getQuestionnaireRoutes:"/get",getRandomQuestionnairesRoute:"/getrandom",getStatsQuestionnaires:"/stats/",previewQuestionnaireRoutes:"/preview",publishedQuestionnaireRoutes:"/quiz/",regenerateHTML:"/htmlregenerated",searchAdminQuestionnairesRoute:"/searchadmin",searchQuestionnairesRoute:"/search",groupRoutes:"/group",getGroupRoute:"/get/",previewGroupRoutes:"/preview",searchGroupsRoute:"/search",questionsRoute:"/question/",tagsSearchRoute:"/tags/search/",getAdminStats:"/getadminstats/",getPreviousAnswers:"/user/answers/",getStatsAnswers:"/user/anwswers/stats/",saveAnswersRoute:"/answer/",Questionnaire:{title:{maxlength:255,required:!0},slug:{maxlength:150},introduction:{required:!0}},searchQuestionnaires:{minlength:3,required:!0},Group:{title:{maxlength:255,required:!0},slug:{maxlength:150}},Question:{text:{maxlength:255,required:!0},rank:{required:!0,min:1,defaultValue:1}},Choice:{text:{maxlength:255,required:!0}},search:{minlength:3,required:!0},searchGroups:{minlength:3,required:!0},dirCacheGroups:"datas/questionnaires/groups",dirCacheQuestionnaires:"datas/questionnaires",dirCacheQuestions:"datas/questionnaires/questions",dirCacheTags:"datas/questionnaires/tags",dirCacheUsersQuestionnaires:"datas/users/questionnaires",dirHTMLGroups:"front/public/quiz/gp",dirHTMLQuestionnaires:"front/public/quiz",dirHTMLNews:"front/public/quizs",dirHTMLTags:"front/public/quizs",dirWebGroups:"quiz/gp",dirWebQuestionnaires:"quiz",dirWebNews:"quizs/",dirWebTags:"quizs/",nbRandomResults:3,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbTagsMin:0,nbTagsMax:0}},671:function(e){e.exports={userRoutes:"/user",checkDeleteLinkRoute:"/confirmdelete/",checkIfIsEmailfreeRoute:"/isemailfree",checkLoginRoute:"/checklogin/",checkNewLoginLinkRoute:"/confirmnewlogin/",checkSubscribeTokenRoute:"/validation/",connectionRoute:"/login",connectionWithLinkRoute:"/checkloginlink",createUserRoute:"/create",getAdminStats:"/getadminstats/",getGodChilds:"/getgodchilds/",getGodfatherRoute:"/getgodfatherid",getLoginLinkRoute:"/getloginlink",getPayments:"/payment/getforoneuser/",getUserInfos:"/get/",getUsersQuestionnairesRoute:"/getusersquestionnaires/",searchUserRoute:"/search/",signupCompletionRoute:"/signupcompletion/",subscribeRoute:"/signup",unsubscribeRoute:"/subscription/stop/",updateUserInfos:"/modify/",validateUserRoute:"/validate/",name:{maxlength:70,required:!0},email:{maxlength:255,required:!0},password:{minlength:8,maxlength:72,required:!0},newPassword:{minlength:8,maxlength:72},codeGodfather:{maxlength:255},cguOk:{value:"true",required:!0},search:{minlength:1,required:!0},timeDifferenceMin:-720,timeDifferenceMax:840,dirCacheUsers:"datas/users",dirCacheUsersAnswers:"datas/users/questionnaires/answers",dirCacheUsersWithoutAnswers:"datas/users/questionnaires/without"}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.
Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.
Votre abonnement à SITE_NAME va expirer d'ici quelques jours.
Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.
Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.
",mailDeleteBodyTxt:"Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",mailDeleteLinkAlreadyMessage:"Il semble que vous ayez déjà validé la suppression de votre compte.",mailDeleteLinkFailMessage:"Votre lien de suppression n'est pas valide ou alors il a expiré.",mailDeleteLinkMessage:"Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.",mailDeleteLinkOkMessage:"Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",mailDeleteLinkTxt:"Confirmer.",mailDeleteSubject:"Confirmer la suppression de votre compte.",mailLoginLinkBodyHTML:"Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",mailLoginLinkBodyTxt:"Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",mailLoginLinkMessage:"Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant *TIMING* !",mailLoginLinkSubject:"Votre lien de connexion.",mailLoginLinkTxt:"Me connecter.",mailThankGodfatherBodyHTML:"Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.
Encore merci et à bientôt !
",mailThankGodfatherBodyTxt:"Bonjour USER_NAME,\nGrâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\nEncore merci et à bientôt !",mailThankGodfatherLinkTxt:"Me connecter à mon compte.",mailThankGodfatherSubject:"Merci !",mailUpdateLoginBodyHTML:"Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.
",mailUpdateLoginBodyTxt:"Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",mailUpdateLoginLinkMessage:"Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement.Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.
",mailValidationLinkSBodyTxt:"Bonjour USER_NAME,\n\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",mailValidationLinkSubject:"Merci de valider votre inscription",mailValidationLinkTxt:"Valider mon compte.",mailValidationMessage:"Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient d'être envoyé à votre adresse e-mail (#EMAIL).",mailWelcomeBodyHTML:"Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. \" + wantToSaveResponses + \" Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Votre abonnement à SITE_NAME va expirer d'ici quelques jours. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Votre abonnement à SITE_NAME va expirer d'ici quelques jours. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder. Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE. Encore merci et à bientôt ! Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder. Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h. Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue ! Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement.
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class n{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return n.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,n){return(e+="").length>n&&(e=e.substring(0,n-3)+"…"),e}static replaceAll(e,n){const t=new RegExp(Object.keys(n).join("|"),"gi");return e.replace(t,(e=>n[e]))}static getRandomInt(e,n){return e=Math.ceil(e),n=Math.floor(n),Math.floor(Math.random()*(n-e))+e}static dateFormat(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(n.isEmpty(e))return"";let i=new Date(e),s=i.getDate()+"";1===s.length&&(s="0"+s);let r=i.getMonth()+1+"";1===r.length&&(r="0"+r);let o=i.getFullYear();return"fr"===t?s+"/"+r+"/"+o:"form"===t?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,n){const t=e+Math.floor(Math.random()*(n-e)),i="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=i[Math.floor(Math.random()*i.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var a=t(671);const u=e.availableLangs[0],l=t(9729)("./"+e.theme+"/config/"+u+".js"),c=(e,t,i)=>{(0,r.isEmpty)(t)||n("message",t),(0,r.isEmpty)(i)||n("url",i),(0,r.isEmpty)(e)||window.location.assign(e)},d={CGV:document.getElementById("CGVOk"),abo1:document.getElementById("abo1"),abo2:document.getElementById("abo2"),abo3:document.getElementById("abo3"),abo4:document.getElementById("abo4")},m=document.getElementById("WPBtns"),p=e=>{for(let n in d)n!==e&&(d[n].checked=!1),m.style.display="none"},v={btn1:document.getElementById("WPBtn1"),btn2:document.getElementById("WPBtn2"),btn3:document.getElementById("WPBtn3"),btn4:document.getElementById("WPBtn4")},g=e=>{for(let n in v)v[n].style.display=n!==e?"none":"block"},h=e.availableLangs[0],b=t(9729)("./"+e.theme+"/config/"+h+".js"),{beginCodeGodfather:f}=t(6028),L=t(671),{serverError:E}=t(2111)("./"+h+"/general"),{infosUserNbGodChilds:M,infosUserNoGodchilds:T,needBeConnected:k}=t(176)("./"+h+"/user"),{infosExpirated:y,infosNbDays:S}=t(7325)("./"+h+"/subscription"),q=document.getElementById("crash"),x=document.getElementById("main-content"),N=document.getElementById("message"),I=document.getElementById("response"),U=document.getElementById("godfatherInfos"),z=document.getElementById("godchilds"),R=document.getElementById("subscribeInfos"),A=document.getElementById("subscribeIntro"),B=document.getElementById("accountUpdate"),P=document.getElementById("newPassword"),D=document.getElementById("godfatherEmail"),w=document.getElementById("godfatherCode");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const t=await async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0,u=arguments.length>2?arguments[2]:void 0,d=arguments.length>3?arguments[3]:void 0;return new Promise(((m,p)=>{const v=i("user");if((0,r.isEmpty)(v))c(o,u,d),m(!1);else{const i=JSON.parse(v);if((0,r.isEmpty)(i.id)||(0,r.isEmpty)(i.token)||(0,r.isEmpty)(i.duration)||i.duration
"):e.errors=E,o(I,"p",e.errors,"",["error"])):o(I,"p",E,"",["error"]),t()}},r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+n.token),s&&(s.output="html",r.send(JSON.stringify(s)))}));const u=document.getElementById("abo9"),l=document.getElementById("abo18"),c=document.getElementById("abo36"),d=document.getElementById("abo54"),m=document.getElementById("CGVOk"),v=document.getElementById("WPBtns");v.style.display="none",u.addEventListener("change",(function(e){p("abo9")})),l.addEventListener("change",(function(e){p("abo18")})),c.addEventListener("change",(function(e){p("abo36")})),d.addEventListener("change",(function(e){p("abo54")})),m.addEventListener("change",(function(e){!0===m.checked?(v.style.display="block",!0===u.checked?g("btn9"):!0===l.checked?g("btn18"):!0===c.checked?g("btn36"):!0===d.checked?g("btn54"):(v.style.display="none",m.checked=!1)):v.style.display="none"}));const h=new XMLHttpRequest;h.open("GET",e.apiUrl+L.userRoutes+L.getGodChilds),h.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText),n="";if(200===this.status){const t=e.length;if(0===t)n=T;else{n=M.replace("#NB",t);for(let t in e)n+=e[t].name+" ("+e[t].email+") "}}o(z,"p",n,"",["info"])}},h.setRequestHeader("Authorization","Bearer "+n.token),h.send()}}catch(e){o(q,"p",E,"",["error"]),console.error(e)}})()}()}();
\ No newline at end of file
diff --git a/front/public/JS/connection.app.js b/front/public/JS/connection.app.js
index a89b7c5..68bd205 100644
--- a/front/public/JS/connection.app.js
+++ b/front/public/JS/connection.app.js
@@ -1,284 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/matomo.js":
-/*!***************************!*\
- !*** ../config/matomo.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.\n// Revoir comment réorganiser cela sous-forme de module indépendant.\nmodule.exports = {\n // Stats Matomo :\n matomo: {\n url: \"https://stats.le-fab-lab.com/\",\n siteId: \"5\"\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/matomo.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/connection.js":
-/*!***************************!*\
- !*** ./src/connection.js ***!
- \***************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/matomo.js */ \"./src/tools/matomo.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER\n/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion.\n/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée.\n/// Le connexion peut se faire directement ici via la saisie d'un mot de passe ou via l'envoi d'un token par e-mail.\n// Fichier de configuration tirés du backend :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // Importation des fonctions utiles au script :\n\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n alreadyConnected,\n needChooseLoginWay\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\"); // Principaux éléments du DOM manipulés :\n\n\nconst myForm = document.getElementById(\"connection\");\nconst divMessage = document.getElementById(\"message\");\nconst divResponse = document.getElementById(\"response\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__.helloDev)(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription.\n\nconst initialise = async () => {\n try {\n const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.checkSession)();\n\n if (isConnected) {\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", {\n message: alreadyConnected,\n color: \"info\"\n }); // pour l'afficher sur la page suivante\n\n const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\", true);\n const homePage = user.status + \"HomePage\";\n window.location.assign(\"/\" + configTemplate[homePage]);\n } else {\n (0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_7__.loadMatomo)();\n myForm.style.display = \"block\";\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"message\"))) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divMessage, \"p\", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"message\", true).message, \"\", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"message\", true).color]);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"message\");\n }\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise(); // Traitement de l'envoi des données de connexion :\n\nmyForm.addEventListener(\"submit\", function (e) {\n try {\n e.preventDefault();\n divResponse.innerHTML = \"\"; // efface d'éventuels messages déjà affichés\n\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_5__.getDatasFromInputs)(myForm);\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.password) && (0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.getLoginLink)) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"div\", needChooseLoginWay, \"\", [\"error\"]);else {\n const xhr = new XMLHttpRequest();\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.getLoginLink)) xhr.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.getLoginLinkRoute);else xhr.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.connectionRoute);\n\n xhr.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.message)) {\n // cas d'une demande de lien de connexion avec succès.\n myForm.style.display = \"none\";\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n } else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.userId) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.connexionTime) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.token)) {\n // cas d'une connexion via mot de passe avec succès : on crée une session de connexion et redirige l'utilisateur.\n let connexionMaxTime = Date.now();\n if (response.connexionTime.endsWith(\"days\")) // l'utilisateur a demandé à rester connecté sur la durée.\n connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000;\n (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.setSession)(response.userId, response.token, connexionMaxTime);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"lastAnswer\"); // ! important pour ne pas enregister plusieurs fois son éventuel résultat au quiz. \n\n myForm.style.display = \"none\"; // l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'accueil :\n\n let url = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"url\", true);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(url) && url.href.indexOf(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl) !== -1) {\n url = url.href;\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"url\");\n } else url = configTemplate[response.status + \"HomePage\"];\n\n window.location.assign(url);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n if (datas) {\n datas.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.getTimeDifference)(); // Si l'utilisateur a répondu à un quiz, j'ajoute les infos de son résultat aux données envoyées :\n\n datas = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.checkAnswerDatas)(datas);\n xhr.send(JSON.stringify(datas));\n }\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n});\n\n//# sourceURL=webpack://wikilerni/./src/connection.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/matomo.js":
-/*!*****************************!*\
- !*** ./src/tools/matomo.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadMatomo\": function() { return /* binding */ loadMatomo; }\n/* harmony export */ });\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ \"../config/matomo.js\");\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction chargeant le code matomo\n\nconst loadMatomo = () => {\n // chargement de matomo\n var _paq = window._paq = window._paq || []; //ajout cnil :\n\n\n _paq.push([function () {\n var self = this;\n\n function getOriginalVisitorCookieTimeout() {\n var now = new Date(),\n nowTs = Math.round(now.getTime() / 1000),\n visitorInfo = self.getVisitorInfo();\n var createTs = parseInt(visitorInfo[2]);\n var cookieTimeout = 33696000; // 13 mois en secondes\n\n var originalTimeout = createTs + cookieTimeout - nowTs;\n return originalTimeout;\n }\n\n this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());\n }]); //--fin ajout cnil\n\n\n _paq.push(['trackPageView']);\n\n _paq.push(['enableLinkTracking']);\n\n (function () {\n var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;\n\n _paq.push(['setTrackerUrl', u + 'matomo.php']);\n\n _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);\n\n var d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\n g.type = 'text/javascript';\n g.async = true;\n g.src = u + 'matomo.js';\n s.parentNode.insertBefore(g, s);\n })();\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/matomo.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const t=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(t,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let n=new Date(e),s=n.getDate()+"";1===s.length&&(s="0"+s);let r=n.getMonth()+1+"";1===r.length&&(r="0"+r);let o=n.getFullYear();return"fr"===t?s+"/"+r+"/"+o:"form"===t?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,i){const t=e+Math.floor(Math.random()*(i-e)),n="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=n[Math.floor(Math.random()*n.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var u=t(45);const l=()=>{var e=window._paq=window._paq||[];e.push([function(){var e,i,t;this.setVisitorCookieTimeout((e=new Date,i=Math.round(e.getTime()/1e3),t=this.getVisitorInfo(),parseInt(t[2])+33696e3-i))}]),e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){var i=u.matomo.url;e.push(["setTrackerUrl",i+"matomo.php"]),e.push(["setSiteId",u.matomo.siteId]);var t=document,n=t.createElement("script"),s=t.getElementsByTagName("script")[0];n.type="text/javascript",n.async=!0,n.src=i+"matomo.js",s.parentNode.insertBefore(n,s)}()},c=e.availableLangs[0],d=t(9729)("./"+e.theme+"/config/"+c+".js"),m=(e,i,t)=>{(0,o.isEmpty)(i)||n("message",i),(0,o.isEmpty)(t)||n("url",t),(0,o.isEmpty)(e)||window.location.assign(e)},p=e.availableLangs[0],v=t(9729)("./"+e.theme+"/config/"+p+".js"),{serverError:g}=t(2111)("./"+p+"/general"),{alreadyConnected:h,needChooseLoginWay:b}=t(176)("./"+p+"/user"),f=document.getElementById("connection"),L=document.getElementById("message"),M=document.getElementById("response");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const t=await async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],a=arguments.length>1?arguments[1]:void 0,u=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0;return new Promise(((c,p)=>{const v=s("user");if((0,o.isEmpty)(v))m(a,u,l),c(!1);else{const s=JSON.parse(v);if((0,o.isEmpty)(s.id)||(0,o.isEmpty)(s.token)||(0,o.isEmpty)(s.duration)||s.duration
"):u.errors=g,a(M,"p",u.errors,"",["error"])):a(M,"p",g,"",["error"])}var i,t},t.setRequestHeader("Content-Type","application/json"),u&&(u.timeDifference=(()=>{const e=-1*(new Date).getTimezoneOffset();return e>i.timeDifferenceMax||e
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
-/*!***************************************!*\
- !*** ../lang/ sync ^\.\/.*\/general$ ***!
- \***************************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("var map = {\n\t\"./fr/general\": \"../lang/fr/general.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\";\n\n//# sourceURL=webpack://wikilerni/../lang/_sync_^\\.\\/.*\\/general$?");
-
-/***/ }),
-
-/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
-/*!************************************!*\
- !*** ../lang/ sync ^\.\/.*\/user$ ***!
- \************************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("var map = {\n\t\"./fr/user\": \"../lang/fr/user.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\";\n\n//# sourceURL=webpack://wikilerni/../lang/_sync_^\\.\\/.*\\/user$?");
-
-/***/ })
-
-/******/ });
-/************************************************************************/
-/******/ // The module cache
-/******/ var __webpack_module_cache__ = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/ // Check if module is in cache
-/******/ var cachedModule = __webpack_module_cache__[moduleId];
-/******/ if (cachedModule !== undefined) {
-/******/ return cachedModule.exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = __webpack_module_cache__[moduleId] = {
-/******/ // no module.id needed
-/******/ // no module.loaded needed
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/************************************************************************/
-/******/ /* webpack/runtime/compat get default export */
-/******/ !function() {
-/******/ // getDefaultExport function for compatibility with non-harmony modules
-/******/ __webpack_require__.n = function(module) {
-/******/ var getter = module && module.__esModule ?
-/******/ function() { return module['default']; } :
-/******/ function() { return module; };
-/******/ __webpack_require__.d(getter, { a: getter });
-/******/ return getter;
-/******/ };
-/******/ }();
-/******/
-/******/ /* webpack/runtime/define property getters */
-/******/ !function() {
-/******/ // define getter functions for harmony exports
-/******/ __webpack_require__.d = function(exports, definition) {
-/******/ for(var key in definition) {
-/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
-/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
-/******/ }
-/******/ }
-/******/ };
-/******/ }();
-/******/
-/******/ /* webpack/runtime/hasOwnProperty shorthand */
-/******/ !function() {
-/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
-/******/ }();
-/******/
-/******/ /* webpack/runtime/make namespace object */
-/******/ !function() {
-/******/ // define __esModule on exports
-/******/ __webpack_require__.r = function(exports) {
-/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ }
-/******/ Object.defineProperty(exports, '__esModule', { value: true });
-/******/ };
-/******/ }();
-/******/
-/************************************************************************/
-/******/
-/******/ // startup
-/******/ // Load entry module and return exports
-/******/ // This entry module can't be inlined because the eval devtool is used.
-/******/ var __webpack_exports__ = __webpack_require__("./src/deconnection.js");
-/******/
-/******/ })()
-;
\ No newline at end of file
+!function(){var e={6028:function(e,n,i){const t=i(671),r=i(4988);e.exports={apiUrl:"http://localhost:3000/api",siteUrl:"http://localhost:8080",siteUrlProd:"https://www.wikilerni.com",adminName:"Fab",adminEmail:"dev@wikilerni.com",senderName:"WikiLerni",senderEmail:"bonjour@wikilerni.com",adminLang:"fr",theme:"wikilerni",availableLangs:["fr"],siteName:"WikiLerni",beginCodeGodfather:"WL",defaultReceiptDays:"147",cronTimingAlertInSeconde:120,responseTimingAlertInSeconde:3,tokenSignupValidationTimeInHours:"48h",tokenLoginLinkTimeInHours:"1h",tokenConnexionMinTimeInHours:"24h",tokenConnexionMaxTimeInDays:"180 days",tokenLoginChangingTimeInHours:"1h",tokenDeleteUserTimeInHours:"1h",tokenUnsubscribeLinkTimeInDays:"7 days",freeAccountTimingInDays:0,freeAccountExpirationNotificationInDays:3,accountExpirationFirstNotificationInDays:10,accountExpirationSecondNotificationInDays:3,inactiveAccountTimeToDeleteInDays:180,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbNewQuestionnaires:12,hourGiveNewQuestionnaireBegin:3,hourGiveNewQuestionnaireEnd:8,maxQuestionnaireSendedAtSameTime:50,minSearchQuestionnaires:3,fieldNewQuestionnaires:"publishingAt",nbQuestionnairesByGroupMin:1,nbQuestionnairesByGroupMax:0,nbIllustrationsMin:1,nbIllustrationsMax:1,maxIllustrationSizeinOctet:1e6,mimeTypesForIllustration:["image/jpg","image/jpeg","image/png","image/gif","image/png"],illustrationsWidthMaxInPx:500,illustrationsMiniaturesWidthMaxInPx:200,nbLinksMin:1,nbLinksMax:0,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,passwordMinLength:t.password.minlength,dirCacheUsers:t.dirCacheUsers,dirCacheUsersAnswers:t.dirCacheUsersAnswers,dirCacheQuestionnaires:r.dirCacheQuestionnaires,dirCacheQuestions:r.dirCacheQuestions,dirCacheUsersQuestionnaires:r.dirCacheUsersQuestionnaires,dirHTMLQuestionnaires:r.dirHTMLQuestionnaires,dirWebQuestionnaires:r.dirWebQuestionnaires}},4988:function(e){e.exports={questionnaireRoutes:"/questionnaire",getListNextQuestionnaires:"/getlistnextquestionnaires/",getQuestionnaireRoutes:"/get",getRandomQuestionnairesRoute:"/getrandom",getStatsQuestionnaires:"/stats/",previewQuestionnaireRoutes:"/preview",publishedQuestionnaireRoutes:"/quiz/",regenerateHTML:"/htmlregenerated",searchAdminQuestionnairesRoute:"/searchadmin",searchQuestionnairesRoute:"/search",groupRoutes:"/group",getGroupRoute:"/get/",previewGroupRoutes:"/preview",searchGroupsRoute:"/search",questionsRoute:"/question/",tagsSearchRoute:"/tags/search/",getAdminStats:"/getadminstats/",getPreviousAnswers:"/user/answers/",getStatsAnswers:"/user/anwswers/stats/",saveAnswersRoute:"/answer/",Questionnaire:{title:{maxlength:255,required:!0},slug:{maxlength:150},introduction:{required:!0}},searchQuestionnaires:{minlength:3,required:!0},Group:{title:{maxlength:255,required:!0},slug:{maxlength:150}},Question:{text:{maxlength:255,required:!0},rank:{required:!0,min:1,defaultValue:1}},Choice:{text:{maxlength:255,required:!0}},search:{minlength:3,required:!0},searchGroups:{minlength:3,required:!0},dirCacheGroups:"datas/questionnaires/groups",dirCacheQuestionnaires:"datas/questionnaires",dirCacheQuestions:"datas/questionnaires/questions",dirCacheTags:"datas/questionnaires/tags",dirCacheUsersQuestionnaires:"datas/users/questionnaires",dirHTMLGroups:"front/public/quiz/gp",dirHTMLQuestionnaires:"front/public/quiz",dirHTMLNews:"front/public/quizs",dirHTMLTags:"front/public/quizs",dirWebGroups:"quiz/gp",dirWebQuestionnaires:"quiz",dirWebNews:"quizs/",dirWebTags:"quizs/",nbRandomResults:3,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbTagsMin:0,nbTagsMax:0}},671:function(e){e.exports={userRoutes:"/user",checkDeleteLinkRoute:"/confirmdelete/",checkIfIsEmailfreeRoute:"/isemailfree",checkLoginRoute:"/checklogin/",checkNewLoginLinkRoute:"/confirmnewlogin/",checkSubscribeTokenRoute:"/validation/",connectionRoute:"/login",connectionWithLinkRoute:"/checkloginlink",createUserRoute:"/create",getAdminStats:"/getadminstats/",getGodChilds:"/getgodchilds/",getGodfatherRoute:"/getgodfatherid",getLoginLinkRoute:"/getloginlink",getPayments:"/payment/getforoneuser/",getUserInfos:"/get/",getUsersQuestionnairesRoute:"/getusersquestionnaires/",searchUserRoute:"/search/",signupCompletionRoute:"/signupcompletion/",subscribeRoute:"/signup",unsubscribeRoute:"/subscription/stop/",updateUserInfos:"/modify/",validateUserRoute:"/validate/",name:{maxlength:70,required:!0},email:{maxlength:255,required:!0},password:{minlength:8,maxlength:72,required:!0},newPassword:{minlength:8,maxlength:72},codeGodfather:{maxlength:255},cguOk:{value:"true",required:!0},search:{minlength:1,required:!0},timeDifferenceMin:-720,timeDifferenceMax:840,dirCacheUsers:"datas/users",dirCacheUsersAnswers:"datas/users/questionnaires/answers",dirCacheUsersWithoutAnswers:"datas/users/questionnaires/without"}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class n{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return n.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,n){return(e+="").length>n&&(e=e.substring(0,n-3)+"…"),e}static replaceAll(e,n){const i=new RegExp(Object.keys(n).join("|"),"gi");return e.replace(i,(e=>n[e]))}static getRandomInt(e,n){return e=Math.ceil(e),n=Math.floor(n),Math.floor(Math.random()*(n-e))+e}static dateFormat(e){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(n.isEmpty(e))return"";let t=new Date(e),r=t.getDate()+"";1===r.length&&(r="0"+r);let s=t.getMonth()+1+"";1===s.length&&(s="0"+s);let o=t.getFullYear();return"fr"===i?r+"/"+s+"/"+o:"form"===i?o+"-"+s+"-"+r:s+"/"+r+"/"+o}static getPassword(e,n){const i=e+Math.floor(Math.random()*(n-e)),t="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",r="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let s=t[Math.floor(Math.random()*t.length)];for(let e=1;e
")),a&&(e.innerHTML=""),e.appendChild(u)}},s=e.availableLangs[0],{serverError:o}=i(2111)("./"+s+"/general"),{byebyeMessage:a}=i(176)("./"+s+"/user"),u=document.getElementById("response");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{n("user"),n("url"),n("message"),r(u,"p",a,"",["success"])}catch(e){r(u,"p",o,"",["error"])}})()}()}();
\ No newline at end of file
diff --git a/front/public/JS/deleteValidation.app.js b/front/public/JS/deleteValidation.app.js
index 7d35e8e..097e04e 100644
--- a/front/public/JS/deleteValidation.app.js
+++ b/front/public/JS/deleteValidation.app.js
@@ -1,284 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/matomo.js":
-/*!***************************!*\
- !*** ../config/matomo.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.\n// Revoir comment réorganiser cela sous-forme de module indépendant.\nmodule.exports = {\n // Stats Matomo :\n matomo: {\n url: \"https://stats.le-fab-lab.com/\",\n siteId: \"5\"\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/matomo.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/deleteValidation.js":
-/*!*********************************!*\
- !*** ./src/deleteValidation.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/matomo.js */ \"./src/tools/matomo.js\");\n/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/url.js */ \"./src/tools/url.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- GESTION DE LA PAGE PERMETTANT DE VALIDER LA DEMANDE DE SUPPRESSION DE SON COMPTE\n/// Un token est transmis en paramètre de l'Url. Il a une validité limitée dans le temps.\n/// Si le token est ok, on valide la suppression, supprime la session de l'utilisateur et affiche un message de confirmation.\n// Fichier de configuration côté client :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst {\n accountPage\n} = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\nconst {\n checkDeleteLinkRoute,\n userRoutes\n} = __webpack_require__(/*! ../../config/users */ \"../config/users.js\"); // Importation des fonctions utile au script :\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n badLinkValidationMessage\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\");\n\nconst divResponse = document.getElementById(\"response\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\nconst initialise = async () => {\n try {\n const datas = (0,_tools_url_js__WEBPACK_IMPORTED_MODULE_5__.getUrlParams)();\n\n if (datas && datas.t !== undefined) {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + userRoutes + checkDeleteLinkRoute + datas.t);\n\n xhr.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.message != undefined) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.removeLocaly)(\"user\");\n } else if (this.status === 400 && response.errors != undefined) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", badLinkValidationMessage.replace(\"#URL\", accountPage), \"\", [\"error\"]);\n }\n };\n\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + datas.t);\n xhr.send();\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/deleteValidation.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/matomo.js":
-/*!*****************************!*\
- !*** ./src/tools/matomo.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadMatomo\": function() { return /* binding */ loadMatomo; }\n/* harmony export */ });\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ \"../config/matomo.js\");\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction chargeant le code matomo\n\nconst loadMatomo = () => {\n // chargement de matomo\n var _paq = window._paq = window._paq || []; //ajout cnil :\n\n\n _paq.push([function () {\n var self = this;\n\n function getOriginalVisitorCookieTimeout() {\n var now = new Date(),\n nowTs = Math.round(now.getTime() / 1000),\n visitorInfo = self.getVisitorInfo();\n var createTs = parseInt(visitorInfo[2]);\n var cookieTimeout = 33696000; // 13 mois en secondes\n\n var originalTimeout = createTs + cookieTimeout - nowTs;\n return originalTimeout;\n }\n\n this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());\n }]); //--fin ajout cnil\n\n\n _paq.push(['trackPageView']);\n\n _paq.push(['enableLinkTracking']);\n\n (function () {\n var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;\n\n _paq.push(['setTrackerUrl', u + 'matomo.php']);\n\n _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);\n\n var d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\n g.type = 'text/javascript';\n g.async = true;\n g.src = u + 'matomo.js';\n s.parentNode.insertBefore(g, s);\n })();\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/matomo.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const n=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(n,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let t=new Date(e),r=t.getDate()+"";1===r.length&&(r="0"+r);let s=t.getMonth()+1+"";1===s.length&&(s="0"+s);let o=t.getFullYear();return"fr"===n?r+"/"+s+"/"+o:"form"===n?o+"-"+s+"-"+r:s+"/"+r+"/"+o}static getPassword(e,i){const n=e+Math.floor(Math.random()*(i-e)),t="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",r="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let s=t[Math.floor(Math.random()*t.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};n(45),n(671);const r=e.availableLangs[0],s=(n(9729)("./"+e.theme+"/config/"+r+".js"),e.availableLangs[0]),{accountPage:o}=n(9729)("./"+e.theme+"/config/"+s+".js"),{checkDeleteLinkRoute:a,userRoutes:u}=n(671),{serverError:l}=n(2111)("./"+s+"/general"),{badLinkValidationMessage:c}=n(176)("./"+s+"/user"),d=document.getElementById("response");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const n=(()=>{if((0,i.isEmpty)(location.search))return!1;const e=location.search.substring(1).split("&");if(!Array.isArray(e)||0===e.length)return!1;let n,t={};for(let i in e)n=e[i].split("="),2===n.length&&(t[n[0]]=decodeURI(n[1]));return t})();if(n&&void 0!==n.t){const i=new XMLHttpRequest;i.open("GET",e.apiUrl+u+a+n.t),i.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);200===this.status&&null!=e.message?(t(d,"p",e.message,"",["success"]),"user",localStorage.removeItem("user")):400===this.status&&null!=e.errors?(Array.isArray(e.errors)?e.errors=e.errors.join("
"):e.errors=l,t(d,"p",e.errors,"",["error"])):t(d,"p",c.replace("#URL",o),"",["error"])}},i.setRequestHeader("Authorization","Bearer "+n.t),i.send()}}catch(e){t(d,"p",l,"",["error"]),console.error(e)}})()}()}();
\ No newline at end of file
diff --git a/front/public/JS/group.app.js b/front/public/JS/group.app.js
index 7921420..6cb2414 100644
--- a/front/public/JS/group.app.js
+++ b/front/public/JS/group.app.js
@@ -1,305 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/matomo.js":
-/*!***************************!*\
- !*** ../config/matomo.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.\n// Revoir comment réorganiser cela sous-forme de module indépendant.\nmodule.exports = {\n // Stats Matomo :\n matomo: {\n url: \"https://stats.le-fab-lab.com/\",\n siteId: \"5\"\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/matomo.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/config/general.js":
-/*!*******************************!*\
- !*** ./src/config/general.js ***!
- \*******************************/
-/***/ (function(module) {
-
-eval("// à supprimer une fois que tout récupérer du backend :\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n usersGetConfigUrl: \"/user/getconfig\",\n lang: \"fr\",\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\"\n};\n\n//# sourceURL=webpack://wikilerni/./src/config/general.js?");
-
-/***/ }),
-
-/***/ "./src/group.js":
-/*!**********************!*\
- !*** ./src/group.js ***!
- \**********************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/questionnaires.js */ \"../config/questionnaires.js\");\n/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _tools_answers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/answers.js */ \"./src/tools/answers.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/matomo.js */ \"./src/tools/matomo.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN GROUPE DE QUIZS\n/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat.\n/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat.\n/// Dans ce but son résultat est stocké dans son navigateur.\n/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés.\n// Fichier de configuration tirés du backend :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n noPreviousAnswer,\n previousAnswersLine,\n previousAnswersStats,\n previousAnswersTitle,\n responseSavedError,\n wantToSaveResponses\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/answer$\")(\"./\" + lang + \"/answer\");\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\"); // Principaux éléments du DOM manipulés :\n\n\nconst btnSubmit = document.getElementById(\"checkResponses\");\nconst divResponse = document.getElementById(\"response\");\nconst explanationsTitle = document.getElementById(\"explanationsTitle\");\nconst explanationsContent = document.getElementById(\"explanationsContent\");\nconst myForm = document.getElementById(\"group\"); // Affiche le bouton de soumission + déclenche le chronomètre mesurant la durée de la réponse.\n\nlet chronoBegin = 0;\n\nconst beginAnswer = () => {\n chronoBegin = Date.now();\n btnSubmit.style.display = \"block\";\n};\n\nlet isConnected, user;\n\nconst initialise = async () => {\n try {\n // Si JS activé, on affiche le bouton de soumission du formulaire :\n beginAnswer();\n isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_9__.checkSession)([\"user\"]); // \"user\" car seuls les utilisateurs de base peuvent enregistrer leurs réponses aux quizs\n // Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux\n\n if (isConnected) {\n user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__.updateAccountLink)(user.status, configTemplate); // lien vers le compte adapté pour les utilisateurs connectés\n\n checkPreviousResponses(user);\n } else (0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_8__.loadMatomo)();\n } catch (e) {\n console.error(e);\n }\n};\n\ninitialise();\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__.helloDev)(); // Traitement de l'envoi de la réponse de l'utilisateur :\n\nlet answer = {};\nmyForm.addEventListener(\"submit\", function (e) {\n try {\n e.preventDefault();\n btnSubmit.style.display = \"none\"; // seulement un envoi à la fois, SVP :)\n\n divResponse.innerHTML = \"\"; // supprime les éventuels messages déjà affichés.\n\n const userResponses = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_6__.getDatasFromInputs)(myForm);\n answer.duration = Math.round((Date.now() - chronoBegin) / 1000);\n answer.nbQuestions = 0;\n answer.nbCorrectAnswers = 0;\n answer.GroupId = document.getElementById(\"groupId\").value; // Les réponses sont regroupées par question, donc quand idQuestion change, on connaît le résultat pour la question précédente.\n // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à la question ET cocher aucune des mauvaises.\n\n let idChoice,\n idQuestion = \"\",\n goodResponse = false;\n\n for (let item in userResponses) {\n if (item.startsWith(\"isCorrect_response_\")) // = Nouvelle réponse possible.\n {\n idChoice = item.substring(item.lastIndexOf(\"_\") + 1);\n\n if (userResponses[\"question_id_response_\" + idChoice] != idQuestion) // = on commence à traiter une nouvelle question.\n {\n idQuestion = userResponses[\"question_id_response_\" + idChoice];\n answer.nbQuestions++;\n if (goodResponse) // = pas d'erreur à la question précédente\n answer.nbCorrectAnswers++;\n goodResponse = true; // La réponse est considérée comme bonne, jusqu'à la première erreur...\n }\n\n if (userResponses[item] == \"true\") {\n document.getElementById(\"response_\" + idChoice).parentNode.classList.add(\"isCorrect\");\n if (userResponses[\"response_\" + idChoice] === undefined) // = une bonne réponse n'a pas été sélectionnée\n goodResponse = false;\n } else {\n if (userResponses[\"response_\" + idChoice] === \"on\") {\n goodResponse = false; // = une mauvaise réponse a été sélectionnée\n\n document.getElementById(\"response_\" + idChoice).parentNode.classList.add(\"isNotCorrect\");\n }\n }\n }\n } // Si j'ai bien répondu à la dernière question, il faut le compter ici, car on est sorti de la boucle :\n\n\n if (goodResponse) answer.nbCorrectAnswers++; // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score :\n\n let getOuput = (0,_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__.checkAnswerOuput)(answer);\n\n if (isConnected) {\n // Si l'utilisateur est connecté, on passe son résultat au serveur pour le sauvegarder.\n const xhrSaveAnswer = new XMLHttpRequest();\n xhrSaveAnswer.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__.groupRoutes + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__.saveAnswersRoute);\n\n xhrSaveAnswer.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let xhrResponse = JSON.parse(this.responseText);\n\n if (this.status === 201 && xhrResponse.message) {\n getOuput += \"
\" + xhrResponse.message.replace(\"#URL\", configTemplate.userHomePage);\n checkPreviousResponses(user);\n } else getOuput += \"
\" + responseSavedError.replace(\"#URL\", configTemplate.userHomePage); // Puis on le redirige vers son résultat :\n\n\n window.location.hash = \"\";\n const here = window.location; // window.location à ajouter pour ne pas quitter la page en mode \"preview\"...\n\n window.location.hash = \"explanations\";\n }\n };\n\n xhrSaveAnswer.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrSaveAnswer.setRequestHeader(\"Content-Type\", \"application/json\");\n answer.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_9__.getTimeDifference)(); // On en profite pour mettre les pendules à l'heure.\n\n xhrSaveAnswer.send(JSON.stringify(answer));\n } else {\n // Si internaute non connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion.\n if ((0,_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__.saveAnswer)(answer)) {\n getOuput += \"\" + (0,_tools_main__WEBPACK_IMPORTED_MODULE_7__.replaceAll)(previousAnswersStats, mapLineContent) + \"
\" + previousAnswersContent;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(explanationsContent, \"ul\", previousAnswersContent);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(explanationsContent, \"ul\", noPreviousAnswer); // dans un cas comme dans l'autre, bouton pour revenir à l'accueil du compte\n\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(explanationsContent, \"p\", \"\" + configTemplate.userHomePageTxt + \"\", \"\", [\"btn\"], \"\", false);\n }\n }\n };\n\n xhrPreviousRes.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrPreviousRes.send();\n};\n\n//# sourceURL=webpack://wikilerni/./src/group.js?");
-
-/***/ }),
-
-/***/ "./src/tools/answers.js":
-/*!******************************!*\
- !*** ./src/tools/answers.js ***!
- \******************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveAnswer\": function() { return /* binding */ saveAnswer; },\n/* harmony export */ \"checkAnswerOuput\": function() { return /* binding */ checkAnswerOuput; }\n/* harmony export */ });\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__);\nconst configFrontEnd = __webpack_require__(/*! ../config/general */ \"./src/config/general.js\");\n\n\n\n\nconst txt = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/answer$\")(\"./\" + configFrontEnd.lang + \"/answer\"); // Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté\n\n\nconst saveAnswer = answer => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.GroupId))) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__.saveLocaly)(\"lastAnswer\", answer);\n return true;\n } else return false;\n}; // Retourne un texte suivant le nombre de bonnes réponses\n\nconst checkAnswerOuput = answer => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(answer.nbQuestions)) {\n const ratio = answer.nbCorrectAnswers / answer.nbQuestions;\n const mapObj = {\n DURATION: answer.duration,\n NBCORRECTANSWERS: answer.nbCorrectAnswers,\n NBQUESTIONS: answer.nbQuestions\n };\n let output = \"\";\n if (ratio < 0.4) output = (0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.replaceAll)(txt.checkResponsesOuputFail, mapObj);else if (ratio < 0.8) output = (0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.replaceAll)(txt.checkResponsesOuputMedium, mapObj);else output = (0,_tools_main__WEBPACK_IMPORTED_MODULE_1__.replaceAll)(txt.checkResponsesOuputSuccess, mapObj);\n if (output) return output;else return \"\";\n } else return \"\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/answers.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/matomo.js":
-/*!*****************************!*\
- !*** ./src/tools/matomo.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadMatomo\": function() { return /* binding */ loadMatomo; }\n/* harmony export */ });\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ \"../config/matomo.js\");\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction chargeant le code matomo\n\nconst loadMatomo = () => {\n // chargement de matomo\n var _paq = window._paq = window._paq || []; //ajout cnil :\n\n\n _paq.push([function () {\n var self = this;\n\n function getOriginalVisitorCookieTimeout() {\n var now = new Date(),\n nowTs = Math.round(now.getTime() / 1000),\n visitorInfo = self.getVisitorInfo();\n var createTs = parseInt(visitorInfo[2]);\n var cookieTimeout = 33696000; // 13 mois en secondes\n\n var originalTimeout = createTs + cookieTimeout - nowTs;\n return originalTimeout;\n }\n\n this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());\n }]); //--fin ajout cnil\n\n\n _paq.push(['trackPageView']);\n\n _paq.push(['enableLinkTracking']);\n\n (function () {\n var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;\n\n _paq.push(['setTrackerUrl', u + 'matomo.php']);\n\n _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);\n\n var d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\n g.type = 'text/javascript';\n g.async = true;\n g.src = u + 'matomo.js';\n s.parentNode.insertBefore(g, s);\n })();\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/matomo.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/answer.js":
-/*!****************************!*\
- !*** ../lang/fr/answer.js ***!
- \****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n checkResponsesOuputFail: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est certain, vous ferez mieux la prochaine fois !\",\n checkResponsesOuputMedium: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est pas mal du tout !\",\n checkResponsesOuputSuccess: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. Bravo ! Rien ne vous échappe !\",\n needIntegerNumberCorrectResponses: \"Le nombre de réponses correctes doit être un nombre entier.\",\n needIntegerNumberSecondesResponse: \"La durée de la réponse doit être un nombre entier de secondes.\",\n needIntegerNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.\",\n needMaxNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.\",\n needMinNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.\",\n needNumberCorrectResponses: \"Le nombre de réponses correctes doit être fourni.\",\n needNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.\",\n needMaxNumberCorrectResponses: \"Le nombre de réponses correctes ne peut être supérieur au nombre de questions.\",\n needMinNumberCorrectResponses: \"Le nombre de réponses correctes ne peut être négatif.\",\n needMinNumberSecondesResponse: \"La durée de la réponse ne peut être négative.\",\n noPreviousAnswer: \"On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !\",\n previousAnswersLine: \"Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.\",\n previousAnswersStats: \"En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.\",\n previousAnswersTitle: \"Bonjour #NOM, voici vos précédents résultats à ce quiz\",\n responseSavedError: \"Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.\",\n responseSavedMessage: \"Votre résultat a été enregistré. Accèder à tous vos quizs.\",\n statsUser: \"Vous avez enregistré NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3 sur les NBTOTQUESTIONNAIRES proposéS4 par le site.
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.\",\n wantToSaveResponses: \"Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles \\\"graines de culture\\\" directement sur votre e-mail.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/answer.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.",wantToSaveResponses:'Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles "graines de culture" directement sur votre e-mail.'}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const s=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(s,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let n=new Date(e),i=n.getDate()+"";1===i.length&&(i="0"+i);let r=n.getMonth()+1+"";1===r.length&&(r="0"+r);let o=n.getFullYear();return"fr"===s?i+"/"+r+"/"+o:"form"===s?o+"-"+r+"-"+i:r+"/"+i+"/"+o}static getPassword(e,t){const s=e+Math.floor(Math.random()*(t-e)),n="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",i="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=n[Math.floor(Math.random()*n.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var o=s(45);const a=()=>{var e=window._paq=window._paq||[];e.push([function(){var e,t,s;this.setVisitorCookieTimeout((e=new Date,t=Math.round(e.getTime()/1e3),s=this.getVisitorInfo(),parseInt(s[2])+33696e3-t))}]),e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){var t=o.matomo.url;e.push(["setTrackerUrl",t+"matomo.php"]),e.push(["setSiteId",o.matomo.siteId]);var s=document,n=s.createElement("script"),i=s.getElementsByTagName("script")[0];n.type="text/javascript",n.async=!0,n.src=t+"matomo.js",i.parentNode.insertBefore(n,i)}()};s(671);const u=e.availableLangs[0],l=(s(9729)("./"+e.theme+"/config/"+u+".js"),e.availableLangs[0]),{noPreviousAnswer:c,previousAnswersLine:d,previousAnswersStats:p,previousAnswersTitle:m,responseSavedError:h,wantToSaveResponses:g}=(s(9729)("./"+e.theme+"/config/"+l+".js"),s(9274)("./"+l+"/answer")),{serverError:b}=s(2111)("./"+l+"/general"),v=document.getElementById("checkResponses"),f=document.getElementById("response"),L=(document.getElementById("explanationsTitle"),document.getElementById("explanationsContent"),document.getElementById("group"));let T=0;(async()=>{try{T=Date.now(),v.style.display="block",a()}catch(e){console.error(e)}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");let k={};L.addEventListener("submit",(function(e){try{e.preventDefault(),v.style.display="none",f.innerHTML="";const s=(e=>{const t={},s=new FormData(e);for(let e of s.entries())t[e[0]]=e[1];return t})(L);k.duration=Math.round((Date.now()-T)/1e3),k.nbQuestions=0,k.nbCorrectAnswers=0,k.GroupId=document.getElementById("groupId").value;let n,o="",a=!1;for(let e in s)e.startsWith("isCorrect_response_")&&(n=e.substring(e.lastIndexOf("_")+1),s["question_id_response_"+n]!=o&&(o=s["question_id_response_"+n],k.nbQuestions++,a&&k.nbCorrectAnswers++,a=!0),"true"==s[e]?(document.getElementById("response_"+n).parentNode.classList.add("isCorrect"),void 0===s["response_"+n]&&(a=!1)):"on"===s["response_"+n]&&(a=!1,document.getElementById("response_"+n).parentNode.classList.add("isNotCorrect")));a&&k.nbCorrectAnswers++;let u=(e=>{if((0,t.isEmpty)(e.duration)||(0,t.isEmpty)(e.nbCorrectAnswers)||(0,t.isEmpty)(e.nbQuestions))return"";{const s=e.nbCorrectAnswers/e.nbQuestions,n={DURATION:e.duration,NBCORRECTANSWERS:e.nbCorrectAnswers,NBQUESTIONS:e.nbQuestions};let r="";return r=s<.4?(0,t.replaceAll)(i.checkResponsesOuputFail,n):s<.8?(0,t.replaceAll)(i.checkResponsesOuputMedium,n):(0,t.replaceAll)(i.checkResponsesOuputSuccess,n),r||""}})(k);r(f,"p",u,"",["success"]),window.location.hash="",window.location,window.location.hash="response";const l=document.querySelectorAll(".help");for(let e in l)void 0!==l[e].style&&(l[e].style.display="block")}catch(e){r(f,"p",b,"",["error"]),console.error(e)}}))}()}();
\ No newline at end of file
diff --git a/front/public/JS/groupElement.app.js b/front/public/JS/groupElement.app.js
index 9709db5..f8e7706 100644
--- a/front/public/JS/groupElement.app.js
+++ b/front/public/JS/groupElement.app.js
@@ -1,284 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/matomo.js":
-/*!***************************!*\
- !*** ../config/matomo.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.\n// Revoir comment réorganiser cela sous-forme de module indépendant.\nmodule.exports = {\n // Stats Matomo :\n matomo: {\n url: \"https://stats.le-fab-lab.com/\",\n siteId: \"5\"\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/matomo.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/groupElement.js":
-/*!*****************************!*\
- !*** ./src/groupElement.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/matomo.js */ \"./src/tools/matomo.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- PAGE AFFICHANT L'ÉLÉMENT D'UN GROUPE DE QUIZ ET PROPOSANT DE CRÉER SON COMPTE DE MANIÈRE SIMPLIFIÉE\n/// L'utilisateur peut avoir répondu à un quiz avant de lancer la création de son compte\n/// Dans ce cas il faut enregistrer son résultat en même temps que les informations de son compte\n// Fichier de configuration tirés du backend :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // besoin de toutes les déclarations, car appel dynamique : configTemplate[homePage]\n\n\nconst configUsers = __webpack_require__(/*! ../../config/users */ \"../config/users.js\"); // idem pour configurer formulaire\n// Importation des fonctions utiles au script :\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n needUniqueEmail\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\"); // Principaux éléments du DOM manipulés :\n\n\nconst btnSubmit = document.getElementById(\"submitDatas\");\nconst divResponse = document.getElementById(\"response\");\nconst emailInput = document.getElementById(\"email\");\nconst myForm = document.getElementById(\"subscription\"); // Test de connexion de l'utilisateur + affichage formulaire d'inscription :\n\nconst initialise = async () => {\n try {\n let isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.checkSession)(),\n user;\n\n if (isConnected) {\n user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.updateAccountLink)(user.status, configTemplate); // lien vers le compte adapté pour les utilisateurs connectés\n } else {\n (0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_5__.loadMatomo)();\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configUsers, myForm);\n myForm.style.display = \"block\";\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)(); // Test si l'e-mail saisi est déjà utilisé par un autre compte.\n// Si c'est le cas, la validation du formulaire est bloquée.\n\nemailInput.addEventListener(\"focus\", function (e) {\n document.getElementById(\"emailMessage\").innerHTML = \"\"; // pour supprimer l'éventuel message d'erreur déjà affiché\n});\nemailInput.addEventListener(\"blur\", function (e) {\n const emailValue = emailInput.value.trim();\n\n if (emailValue !== \"\") {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.checkIfIsEmailfreeRoute);\n\n xhr.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.free !== undefined && response.free === false) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(document.getElementById(\"emailMessage\"), \"div\", needUniqueEmail.replace(\"#URL\", configTemplate.connectionPage), \"\", [\"error\"]);\n btnSubmit.setAttribute(\"disabled\", true);\n } else btnSubmit.removeAttribute(\"disabled\");\n }\n };\n\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n const datas = {\n emailTest: emailValue\n };\n xhr.send(JSON.stringify(datas));\n }\n}); // Traitement de l'envoi des données d'inscription :\n\nmyForm.addEventListener(\"submit\", function (e) {\n try {\n e.preventDefault();\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.subscribeRoute);\n\n xhr.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 201) {\n myForm.style.display = \"none\";\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.removeLocaly)(\"lastAnswer\"); // !! important, pour ne pas enregister plusieurs fois le résultat.\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(myForm);\n\n if (datas) {\n datas.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.getTimeDifference)(configUsers); // Si l'utilisateur a précédement répondu à un quiz, on ajoute les données de son résultat :\n\n datas = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.checkAnswerDatas)(datas);\n xhr.send(JSON.stringify(datas));\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n});\n\n//# sourceURL=webpack://wikilerni/./src/groupElement.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/matomo.js":
-/*!*****************************!*\
- !*** ./src/tools/matomo.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadMatomo\": function() { return /* binding */ loadMatomo; }\n/* harmony export */ });\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ \"../config/matomo.js\");\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction chargeant le code matomo\n\nconst loadMatomo = () => {\n // chargement de matomo\n var _paq = window._paq = window._paq || []; //ajout cnil :\n\n\n _paq.push([function () {\n var self = this;\n\n function getOriginalVisitorCookieTimeout() {\n var now = new Date(),\n nowTs = Math.round(now.getTime() / 1000),\n visitorInfo = self.getVisitorInfo();\n var createTs = parseInt(visitorInfo[2]);\n var cookieTimeout = 33696000; // 13 mois en secondes\n\n var originalTimeout = createTs + cookieTimeout - nowTs;\n return originalTimeout;\n }\n\n this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());\n }]); //--fin ajout cnil\n\n\n _paq.push(['trackPageView']);\n\n _paq.push(['enableLinkTracking']);\n\n (function () {\n var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;\n\n _paq.push(['setTrackerUrl', u + 'matomo.php']);\n\n _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);\n\n var d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\n g.type = 'text/javascript';\n g.async = true;\n g.src = u + 'matomo.js';\n s.parentNode.insertBefore(g, s);\n })();\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/matomo.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const n=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(n,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let t=new Date(e),r=t.getDate()+"";1===r.length&&(r="0"+r);let s=t.getMonth()+1+"";1===s.length&&(s="0"+s);let o=t.getFullYear();return"fr"===n?r+"/"+s+"/"+o:"form"===n?o+"-"+s+"-"+r:s+"/"+r+"/"+o}static getPassword(e,i){const n=e+Math.floor(Math.random()*(i-e)),t="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",r="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let s=t[Math.floor(Math.random()*t.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}}(l,"p",a,"",["error"]),console.error(e)}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****")}()}();
\ No newline at end of file
diff --git a/front/public/JS/homeManager.app.js b/front/public/JS/homeManager.app.js
index 07327fb..49072bb 100644
--- a/front/public/JS/homeManager.app.js
+++ b/front/public/JS/homeManager.app.js
@@ -1,272 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/homeManager.js":
-/*!****************************!*\
- !*** ./src/homeManager.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config/questionnaires.js */ \"../config/questionnaires.js\");\n/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- PAGE D'ACCUEIL POUR LES GESTIONNAIRES\n/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.\n/// Si c'est ok, on récupère les stats générales et des dernières 24H et les affiche\n/// On liste ensuite les prochains quizs devant être publiés en faisant ressortir ceux devant être complétés + la prochaine date sans quiz\n/// Un menu permet à l'utilisateur d'accéder aux formulaires permettant de gérer les quizs et les comptes utilisateurs et abonnements\n/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.\n/// Temporairement, c'est ici aussi que l'on peut régénérer tout le HTML -> à terme dans homeAdmin !\n// Fichier de configuration côté client :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\n\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // Fonctions utiles au script :\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n notAllowed,\n serverError,\n statsAdmin\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n nextDateWithoutQuestionnaire,\n nextQuestionnairesList,\n questionnaireNeedBeCompleted\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/questionnaire$\")(\"./\" + lang + \"/questionnaire\");\n\nconst {\n welcomeMessage\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\"); // Principaux éléments du DOM manipulés :\n\n\nconst divMain = document.getElementById(\"main-content\");\nconst divCrash = document.getElementById(\"crash\");\nconst divMessage = document.getElementById(\"message\");\nconst divQuestionnaires = document.getElementById(\"questionnaires\");\nconst btnRegenerate = document.getElementById(\"wantRegenerate\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__.helloDev)();\n\nconst initialise = async () => {\n try {\n const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_7__.checkSession)([\"manager\", \"admin\"], \"/\" + configTemplate.connectionPage, {\n message: notAllowed,\n color: \"error\"\n });\n\n if (isConnected) {\n const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__.updateAccountLink)(user.status, configTemplate);\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__.addElement)(divMessage, \"h2\", welcomeMessage.replace(\"#NAME\", user.name));\n divMain.style.display = \"block\";\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__.getLocaly)(\"message\"))) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__.addElement)(divMessage, \"p\", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__.getLocaly)(\"message\", true).message, \"\", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__.getLocaly)(\"message\", true).color], \"\", false);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__.removeLocaly)(\"message\");\n } // Les stats sur les comptes utilisateurs :\n\n\n const xhrStats = new XMLHttpRequest();\n xhrStats.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.getAdminStats);\n\n xhrStats.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200) {\n const mapText = {\n NB_USERS_24H: response.nbNewUsers24H,\n NB_SUBSCRIPTIONS_24H: response.Subscriptions.nbSubscriptions24H,\n NB_USERS_DELETED_24H: response.nbDeletedUsers24H,\n NB_ANSWERS_24H: response.Answers.nbAnswers24H,\n NB_USERS_TOT: response.nbNewUsersTot,\n NB_SUBSCRIPTIONS_TOT: response.Subscriptions.nbSubscriptionsTot,\n NB_SUBSCRIPTIONS_PREMIUM: response.Subscriptions.nbSubscriptionsPremium,\n NB_ANSWERS_TOT: response.Answers.nbAnswersTot,\n NB_USERS_DELETED_TOT: response.nbDeletedUsersTot,\n NB_USERS_DELETED_VALIDED: response.nbDeletedUsersWasValided,\n NB_USERS_DELETED_PREMIUM: response.nbDeletedUsersTotWasPremium\n };\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__.addElement)(divMessage, \"p\", (0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.replaceAll)(statsAdmin, mapText), \"\", \"\", \"\", false);\n }\n }\n };\n\n xhrStats.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrStats.send(); // Les questionnaires bientôt publiés : \n\n const xhrNextQuestionnaires = new XMLHttpRequest();\n xhrNextQuestionnaires.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__.questionnaireRoutes + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__.getListNextQuestionnaires);\n\n xhrNextQuestionnaires.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && Array.isArray(response.questionnaires)) {\n let listHTML = \"\",\n dayStr,\n optionsDayStr = {\n weekday: 'long'\n };\n\n for (let i in response.questionnaires) {\n dayStr = new Intl.DateTimeFormat(lang, optionsDayStr).format(new Date(response.questionnaires[i].datePublishing));\n listHTML += \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/questionnaire.js":
-/*!***********************************!*\
- !*** ../lang/fr/questionnaire.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n btnProposeConnection: \"Je me connecte.\",\n // déplacé dans general.js\n btnProposeSubscribe: \"Je crée mon compte.\",\n //idem\n btnSendResponse: \"Testez vos réponses.\",\n btnShareQuizTxt: \"Partager via \",\n btnShareQuizMailBody: \"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A\",\n btnShowQuestionnaire: \"Répondre au quiz !\",\n correctAnswerTxt: \"Bonne réponse\",\n estimatedTime: \"Durée de lecture estimée : \",\n estimatedTimeOption: {\n short: \"courte\",\n medium: \"moyenne\",\n long: \"longue\"\n },\n explanationBeforeTxt: \"Extrait :\",\n haveBeenPublished: \":NB nouveaux questionnaires ont été publiés.\",\n haveBeenRegenerated: \"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.\",\n lastUpdated: \"Dernière mise à jour, le \",\n linkGoToNextElement: \"Article suivant\",\n linkGoToQuiz: \"Accéder au quiz\",\n needCorrectPublishingDate: \"La date de publication fournie n'a pas un format valide.\",\n needEstimatedTime: \"Merci de sélectionner une estimation de la durée de ce quiz.\",\n needGroupIfRank: \"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.\",\n needIntroduction: \"Merci de fournir un texte d'introduction à votre quiz.\",\n needKnowIfIsPublished: \"Il faut savoir si ce quiz est publié.\",\n needLanguage: \"Vous devez sélectionner la langue de ce quiz.\",\n needNotTooLongTitle: \"Le titre du quiz ne doit pas compter plus de 255 caractères.\",\n needNumberForRank: \"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.\",\n needTitle: \"Merci de fournir un titre à votre quiz.\",\n needUniqueUrl: \"L'url du quiz doit être unique.\",\n needUrl: \"Merci de fournir l'url à votre quiz.\",\n nextDateWithoutQuestionnaire: \"Prochaine date sans quiz programmé : \",\n nextQuestionnairesList: \"Les #NB prochains quizs devant être publiés\",\n questionnairesName: \"quiz\",\n questionnaireNeedBeCompleted: \"Quiz incomplet\",\n publishedAt: \", le\",\n publishedBy: \"Quiz publié par\",\n searchQuestionnaireResultTitle: \"Résultat pour votre recherche\",\n searchQuestionnaireWithNoResult: \"Aucun quiz n'a été trouvé pour votre recherche.\",\n searchQuestionnaireWithResult: \"Il y a #NB article#S correspondant à votre recherche :\",\n wrongAnswerTxt: \"Mauvaise réponse\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/questionnaire.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},3215:function(e){e.exports={btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnSendResponse:"Testez vos réponses.",btnShareQuizTxt:"Partager via ",btnShareQuizMailBody:"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A",btnShowQuestionnaire:"Répondre au quiz !",correctAnswerTxt:"Bonne réponse",estimatedTime:"Durée de lecture estimée : ",estimatedTimeOption:{short:"courte",medium:"moyenne",long:"longue"},explanationBeforeTxt:"Extrait :",haveBeenPublished:":NB nouveaux questionnaires ont été publiés.",haveBeenRegenerated:"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.",lastUpdated:"Dernière mise à jour, le ",linkGoToNextElement:"Article suivant",linkGoToQuiz:"Accéder au quiz",needCorrectPublishingDate:"La date de publication fournie n'a pas un format valide.",needEstimatedTime:"Merci de sélectionner une estimation de la durée de ce quiz.",needGroupIfRank:"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.",needIntroduction:"Merci de fournir un texte d'introduction à votre quiz.",needKnowIfIsPublished:"Il faut savoir si ce quiz est publié.",needLanguage:"Vous devez sélectionner la langue de ce quiz.",needNotTooLongTitle:"Le titre du quiz ne doit pas compter plus de 255 caractères.",needNumberForRank:"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.",needTitle:"Merci de fournir un titre à votre quiz.",needUniqueUrl:"L'url du quiz doit être unique.",needUrl:"Merci de fournir l'url à votre quiz.",nextDateWithoutQuestionnaire:"Prochaine date sans quiz programmé : ",nextQuestionnairesList:"Les #NB prochains quizs devant être publiés",questionnairesName:"quiz",questionnaireNeedBeCompleted:"Quiz incomplet",publishedAt:", le",publishedBy:"Quiz publié par",searchQuestionnaireResultTitle:"Résultat pour votre recherche",searchQuestionnaireWithNoResult:"Aucun quiz n'a été trouvé pour votre recherche.",searchQuestionnaireWithResult:"Il y a #NB article#S correspondant à votre recherche :",wrongAnswerTxt:"Mauvaise réponse"}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const t=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(t,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let n=new Date(e),s=n.getDate()+"";1===s.length&&(s="0"+s);let r=n.getMonth()+1+"";1===r.length&&(r="0"+r);let o=n.getFullYear();return"fr"===t?s+"/"+r+"/"+o:"form"===t?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,i){const t=e+Math.floor(Math.random()*(i-e)),n="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=n[Math.floor(Math.random()*n.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),o&&(e.innerHTML=""),e.appendChild(u)}},l=e.availableLangs[0],c=t(9729)("./"+e.theme+"/config/"+l+".js"),d=(e,i,t)=>{(0,a.isEmpty)(i)||s("message",i),(0,a.isEmpty)(t)||s("url",t),(0,a.isEmpty)(e)||window.location.assign(e)},p=e.availableLangs[0],m=t(9729)("./"+e.theme+"/config/"+p+".js"),{notAllowed:v,serverError:h,statsAdmin:g}=t(2111)("./"+p+"/general"),{nextDateWithoutQuestionnaire:b,nextQuestionnairesList:f,questionnaireNeedBeCompleted:L}=t(3260)("./"+p+"/questionnaire"),{welcomeMessage:T}=t(176)("./"+p+"/user"),M=document.getElementById("main-content"),q=document.getElementById("crash"),E=document.getElementById("message"),S=document.getElementById("questionnaires"),k=document.getElementById("wantRegenerate");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const t=await async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,u=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0;return new Promise(((p,m)=>{const v=r("user");if((0,a.isEmpty)(v))d(n,u,l),p(!1);else{const r=JSON.parse(v);if((0,a.isEmpty)(r.id)||(0,a.isEmpty)(r.token)||(0,a.isEmpty)(r.duration)||r.duration
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/answer.js":
-/*!****************************!*\
- !*** ../lang/fr/answer.js ***!
- \****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n checkResponsesOuputFail: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est certain, vous ferez mieux la prochaine fois !\",\n checkResponsesOuputMedium: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est pas mal du tout !\",\n checkResponsesOuputSuccess: \"Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. Bravo ! Rien ne vous échappe !\",\n needIntegerNumberCorrectResponses: \"Le nombre de réponses correctes doit être un nombre entier.\",\n needIntegerNumberSecondesResponse: \"La durée de la réponse doit être un nombre entier de secondes.\",\n needIntegerNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.\",\n needMaxNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.\",\n needMinNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.\",\n needNumberCorrectResponses: \"Le nombre de réponses correctes doit être fourni.\",\n needNumberUserResponses: \"Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.\",\n needMaxNumberCorrectResponses: \"Le nombre de réponses correctes ne peut être supérieur au nombre de questions.\",\n needMinNumberCorrectResponses: \"Le nombre de réponses correctes ne peut être négatif.\",\n needMinNumberSecondesResponse: \"La durée de la réponse ne peut être négative.\",\n noPreviousAnswer: \"On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !\",\n previousAnswersLine: \"Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.\",\n previousAnswersStats: \"En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.\",\n previousAnswersTitle: \"Bonjour #NOM, voici vos précédents résultats à ce quiz\",\n responseSavedError: \"Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.\",\n responseSavedMessage: \"Votre résultat a été enregistré. Accèder à tous vos quizs.\",\n statsUser: \"Vous avez enregistré NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3 sur les NBTOTQUESTIONNAIRES proposéS4 par le site.
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.\",\n wantToSaveResponses: \"Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles \\\"graines de culture\\\" directement sur votre e-mail.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/answer.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/questionnaire.js":
-/*!***********************************!*\
- !*** ../lang/fr/questionnaire.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n btnProposeConnection: \"Je me connecte.\",\n // déplacé dans general.js\n btnProposeSubscribe: \"Je crée mon compte.\",\n //idem\n btnSendResponse: \"Testez vos réponses.\",\n btnShareQuizTxt: \"Partager via \",\n btnShareQuizMailBody: \"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A\",\n btnShowQuestionnaire: \"Répondre au quiz !\",\n correctAnswerTxt: \"Bonne réponse\",\n estimatedTime: \"Durée de lecture estimée : \",\n estimatedTimeOption: {\n short: \"courte\",\n medium: \"moyenne\",\n long: \"longue\"\n },\n explanationBeforeTxt: \"Extrait :\",\n haveBeenPublished: \":NB nouveaux questionnaires ont été publiés.\",\n haveBeenRegenerated: \"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.\",\n lastUpdated: \"Dernière mise à jour, le \",\n linkGoToNextElement: \"Article suivant\",\n linkGoToQuiz: \"Accéder au quiz\",\n needCorrectPublishingDate: \"La date de publication fournie n'a pas un format valide.\",\n needEstimatedTime: \"Merci de sélectionner une estimation de la durée de ce quiz.\",\n needGroupIfRank: \"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.\",\n needIntroduction: \"Merci de fournir un texte d'introduction à votre quiz.\",\n needKnowIfIsPublished: \"Il faut savoir si ce quiz est publié.\",\n needLanguage: \"Vous devez sélectionner la langue de ce quiz.\",\n needNotTooLongTitle: \"Le titre du quiz ne doit pas compter plus de 255 caractères.\",\n needNumberForRank: \"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.\",\n needTitle: \"Merci de fournir un titre à votre quiz.\",\n needUniqueUrl: \"L'url du quiz doit être unique.\",\n needUrl: \"Merci de fournir l'url à votre quiz.\",\n nextDateWithoutQuestionnaire: \"Prochaine date sans quiz programmé : \",\n nextQuestionnairesList: \"Les #NB prochains quizs devant être publiés\",\n questionnairesName: \"quiz\",\n questionnaireNeedBeCompleted: \"Quiz incomplet\",\n publishedAt: \", le\",\n publishedBy: \"Quiz publié par\",\n searchQuestionnaireResultTitle: \"Résultat pour votre recherche\",\n searchQuestionnaireWithNoResult: \"Aucun quiz n'a été trouvé pour votre recherche.\",\n searchQuestionnaireWithResult: \"Il y a #NB article#S correspondant à votre recherche :\",\n wrongAnswerTxt: \"Mauvaise réponse\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/questionnaire.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/questionnaireaccess.js":
-/*!*****************************************!*\
- !*** ../lang/fr/questionnaireaccess.js ***!
- \*****************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n lastQuestionnairesForUser: \"Vos dernières lectures :\",\n notFound: \"Les informations d'un questionnaire attribué à un abonné n'ont pas été trouvées : \",\n noQuestionnaireAccess: \"Aucun article ne vous a encore été envoyé par e-mail. Sans doute, venez-vous de créer votre compte. En attendant d'en recevoir, vous pouvez mieux découvrir le site WikiLerni en lisant la page à propos ou encore commencer à parcourir librement son contenu à l'aide du moteur de recherche ci-dessus.\",\n questionnaireRetryInfo: \"Vous avez déjà reçu tous les articles et quizs publiés à ce jour. En attendant la publication de nouveaux contenus, vous pouvez peut-être réessayer de répondre au quiz suivant ?\",\n questionnaireRetryInfoTxt: \"Bonjour USER_NAME,\\n\\nVous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?\\n\\nQUESTIONNAIRE_URL\\n\\nBonne lecture !\\n\\nStopper les envois ?\\nUNSUBSCRIBE_URL\",\n searchIsNotLongEnough: \"Merci de fournir un mot-clés d'au moins deux caractères pour votre recherche.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/questionnaireaccess.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.",wantToSaveResponses:'Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles "graines de culture" directement sur votre e-mail.'}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},3215:function(e){e.exports={btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnSendResponse:"Testez vos réponses.",btnShareQuizTxt:"Partager via ",btnShareQuizMailBody:"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A",btnShowQuestionnaire:"Répondre au quiz !",correctAnswerTxt:"Bonne réponse",estimatedTime:"Durée de lecture estimée : ",estimatedTimeOption:{short:"courte",medium:"moyenne",long:"longue"},explanationBeforeTxt:"Extrait :",haveBeenPublished:":NB nouveaux questionnaires ont été publiés.",haveBeenRegenerated:"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.",lastUpdated:"Dernière mise à jour, le ",linkGoToNextElement:"Article suivant",linkGoToQuiz:"Accéder au quiz",needCorrectPublishingDate:"La date de publication fournie n'a pas un format valide.",needEstimatedTime:"Merci de sélectionner une estimation de la durée de ce quiz.",needGroupIfRank:"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.",needIntroduction:"Merci de fournir un texte d'introduction à votre quiz.",needKnowIfIsPublished:"Il faut savoir si ce quiz est publié.",needLanguage:"Vous devez sélectionner la langue de ce quiz.",needNotTooLongTitle:"Le titre du quiz ne doit pas compter plus de 255 caractères.",needNumberForRank:"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.",needTitle:"Merci de fournir un titre à votre quiz.",needUniqueUrl:"L'url du quiz doit être unique.",needUrl:"Merci de fournir l'url à votre quiz.",nextDateWithoutQuestionnaire:"Prochaine date sans quiz programmé : ",nextQuestionnairesList:"Les #NB prochains quizs devant être publiés",questionnairesName:"quiz",questionnaireNeedBeCompleted:"Quiz incomplet",publishedAt:", le",publishedBy:"Quiz publié par",searchQuestionnaireResultTitle:"Résultat pour votre recherche",searchQuestionnaireWithNoResult:"Aucun quiz n'a été trouvé pour votre recherche.",searchQuestionnaireWithResult:"Il y a #NB article#S correspondant à votre recherche :",wrongAnswerTxt:"Mauvaise réponse"}},148:function(e){e.exports={lastQuestionnairesForUser:"Vos dernières lectures :",notFound:"Les informations d'un questionnaire attribué à un abonné n'ont pas été trouvées : ",noQuestionnaireAccess:"Aucun article ne vous a encore été envoyé par e-mail. Sans doute, venez-vous de créer votre compte. En attendant d'en recevoir, vous pouvez mieux découvrir le site WikiLerni en lisant la page à propos ou encore commencer à parcourir librement son contenu à l'aide du moteur de recherche ci-dessus.",questionnaireRetryInfo:"Vous avez déjà reçu tous les articles et quizs publiés à ce jour. En attendant la publication de nouveaux contenus, vous pouvez peut-être réessayer de répondre au quiz suivant ?",questionnaireRetryInfoTxt:"Bonjour USER_NAME,\n\nVous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",searchIsNotLongEnough:"Merci de fournir un mot-clés d'au moins deux caractères pour votre recherche."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class n{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return n.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,n){return(e+="").length>n&&(e=e.substring(0,n-3)+"…"),e}static replaceAll(e,n){const t=new RegExp(Object.keys(n).join("|"),"gi");return e.replace(t,(e=>n[e]))}static getRandomInt(e,n){return e=Math.ceil(e),n=Math.floor(n),Math.floor(Math.random()*(n-e))+e}static dateFormat(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(n.isEmpty(e))return"";let i=new Date(e),s=i.getDate()+"";1===s.length&&(s="0"+s);let r=i.getMonth()+1+"";1===r.length&&(r="0"+r);let o=i.getFullYear();return"fr"===t?s+"/"+r+"/"+o:"form"===t?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,n){const t=e+Math.floor(Math.random()*(n-e)),i="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=i[Math.floor(Math.random()*i.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}},a=e=>{const n={},t=new FormData(e);for(let e of t.entries())n[e[0]]=e[1];return n};var u=t(671);const l=e.availableLangs[0],c=t(9729)("./"+e.theme+"/config/"+l+".js"),d=(e,t,i)=>{(0,r.isEmpty)(t)||n("message",t),(0,r.isEmpty)(i)||n("url",i),(0,r.isEmpty)(e)||window.location.assign(e)},p=e.availableLangs[0],m=t(9729)("./"+e.theme+"/config/"+p+".js"),{getRandomQuestionnairesRoute:v,getStatsAnswers:h,questionnaireRoutes:g,searchQuestionnaires:b,searchQuestionnairesRoute:f}=t(4988),{getUsersQuestionnairesRoute:L,userRoutes:E}=t(671),{statsUser:T}=t(9274)("./"+p+"/answer"),{nextPage:q,previousPage:M,serverError:S}=t(2111)("./"+p+"/general"),{searchQuestionnaireWithResult:N,searchQuestionnaireWithNoResult:z}=t(3260)("./"+p+"/questionnaire"),{lastQuestionnairesForUser:R,noQuestionnaireAccess:k}=t(6132)("./"+p+"/questionnaireaccess"),{needBeConnected:x,welcomeMessage:I}=t(176)("./"+p+"/user"),A=document.getElementById("main-content"),U=document.getElementById("crash"),y=document.getElementById("message"),w=document.getElementById("quizsIntro"),B=document.getElementById("quizsList"),C=document.getElementById("previous"),P=document.getElementById("next"),O=document.getElementById("search"),D=(document.getElementById("begin"),document.getElementById("random"));console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const t=await async function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0;return new Promise(((p,m)=>{const v=i("user");if((0,r.isEmpty)(v))d(o,a,l),p(!1);else{const i=JSON.parse(v);if((0,r.isEmpty)(i.id)||(0,r.isEmpty)(i.token)||(0,r.isEmpty)(i.duration)||i.duration
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", badLinkValidationMessage.replace(\"#URL\", connectionPage), \"\", [\"error\"]);\n }\n };\n\n datas.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.getTimeDifference)(); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :\n\n datas = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_6__.checkAnswerDatas)(datas);\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr.send(JSON.stringify(datas));\n }\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/loginLink.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const n=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(n,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let t=new Date(e),s=t.getDate()+"";1===s.length&&(s="0"+s);let r=t.getMonth()+1+"";1===r.length&&(r="0"+r);let o=t.getFullYear();return"fr"===n?s+"/"+r+"/"+o:"form"===n?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,i){const n=e+Math.floor(Math.random()*(i-e)),t="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=t[Math.floor(Math.random()*t.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var a=n(671);const u=e.availableLangs[0],l=n(9729)("./"+e.theme+"/config/"+u+".js"),c=(e,n,t)=>{(0,r.isEmpty)(n)||i("message",n),(0,r.isEmpty)(t)||i("url",t),(0,r.isEmpty)(e)||window.location.assign(e)},d=e.availableLangs[0],{connectionPage:p,userHomePage:m}=n(9729)("./"+e.theme+"/config/"+d+".js"),{connectionWithLinkRoute:v,userRoutes:g}=n(671),{serverError:h}=n(2111)("./"+d+"/general"),{alreadyConnected:b,badLinkValidationMessage:f,validationMessage:L}=n(176)("./"+d+"/user"),M=document.getElementById("response");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const n=await async function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0,u=arguments.length>2?arguments[2]:void 0,d=arguments.length>3?arguments[3]:void 0;return new Promise(((p,m)=>{const v=t("user");if((0,r.isEmpty)(v))c(o,u,d),p(!1);else{const t=JSON.parse(v);if((0,r.isEmpty)(t.id)||(0,r.isEmpty)(t.token)||(0,r.isEmpty)(t.duration)||t.duration
"):t.errors=h,o(M,"p",t.errors,"",["error"]));else{let r=Date.now();t.connexionTime.endsWith("days")?r+=24*parseInt(t.connexionTime,10)*3600*1e3:r+=3600*parseInt(t.connexionTime,10)*1e3,e=t.userId,n=t.token,i("user",{id:e,token:n,duration:r}),s("lastAnswer"),o(M,"p",L,"",["success"]),window.location.assign("/"+m)}}var e,n},n.timeDifference=(()=>{const e=-1*(new Date).getTimezoneOffset();return e>a.timeDifferenceMax||e
\");else response.message = response.message;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(response.errors)) {\n if (datas.deleteOk === undefined) showFormGroupInfos(datas.id, user.token); // actualisation de l'affichage après traitement serveur\n else emptyGroupForm();\n }\n }\n };\n\n xhrGroupDatas.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrGroupDatas.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n if (datas) xhrGroupDatas.send(JSON.stringify(datas));\n }); // Envoi d'une recherche\n\n formSearch.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formSearch);\n const xhrSearch = new XMLHttpRequest();\n xhrSearch.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.groupRoutes + configQuestionnaires.searchGroupsRoute);\n\n xhrSearch.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && Array.isArray(response)) {\n if (response.length === 0) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"p\", searchWithoutResult, \"\", [\"info\"]);else {\n let selectHTML = \"\";\n\n for (let i in response) selectHTML += \"\";\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"select\", selectHTML, \"selectSearch\");\n const searchSelect = document.getElementById(\"selectSearch\");\n searchSelect.addEventListener(\"change\", function () {\n if (searchSelect.value !== \"\") showFormGroupInfos(searchSelect.value, user.token);\n });\n }\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhrSearch.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrSearch.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n if (datas) xhrSearch.send(JSON.stringify(datas));\n });\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divCrash, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\n//# sourceURL=webpack://wikilerni/./src/manageGroups.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/group.js":
-/*!***************************!*\
- !*** ../lang/fr/group.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n btnSendResponse: \"Testez vos réponses.\",\n btnShareQuizTxt: \"Partager ce quiz sur \",\n commonIntroTxt: \"Ce quiz vous permet tester ce que vous avez retenu des articles qui vous ont été proposés précédemment à la lecture. Au besoin, cliquez sur le bouton ci-dessous pour les (re)lire.\",\n correctAnswerTxt: \"Bonne réponse\",\n groupsName: \"Quiz\",\n // nom d'un groupe pour l'affichage dans les vues\n groupQuestionnairesList: \"Les #NB éléments enregistrés pour ce groupe\",\n groupQuestionnairesListWithout: \"Aucun élément n'a été enregistré pour ce groupe.\",\n haveBeenPublished: \"#NB nouveaux groupes de quizs ont été publiés.\",\n infosGroupForAdmin: \"Ce groupe de quizs a été créé le DATE_CREA, mise à jour la dernière fois le DATE_UPDATE.
Son identifiant est GROUP_ID. Il regroupe actuellement les questions de NB_ELEMENTS quizs.\",\n linkFirstElementGroup: \"Retour au premier article.\",\n lastUpdated: \"Dernière mise à jour le \",\n needCorrectPublishingDate: \"La date de publication fournie n'a pas un format valide.\",\n needLanguage: \"Vous devez sélectionner la langue de ce groupe de quizs.\",\n needNotTooLongTitle: \"Le titre du groupe de quizs ne doit pas compter plus de 255 caractères.\",\n needTitle: \"Merci de fournir un titre à ce groupe de quizs.\",\n needUniqueUrl: \"L'url du groupe de quizs doit être unique.\",\n needUrl: \"Merci de fournir l'url à ce groupe de quizs.\",\n notFound: \"Le groupe de quizs (#SEARCH) n'a pas été trouvé.\",\n publishedAt: \" le\",\n publishedBy: \"Quiz publié par\",\n searchIsNotLongEnough: \"Vous devez saisir au moins #MIN caractères pour votre recherche.\",\n searchWithoutResult: \"Aucun groupe n'a été trouvé pour votre recherche.\",\n wrongAnswerTxt: \"Mauvaise réponse\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/group.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},6677:function(e){e.exports={btnSendResponse:"Testez vos réponses.",btnShareQuizTxt:"Partager ce quiz sur ",commonIntroTxt:"Ce quiz vous permet tester ce que vous avez retenu des articles qui vous ont été proposés précédemment à la lecture. Au besoin, cliquez sur le bouton ci-dessous pour les (re)lire.",correctAnswerTxt:"Bonne réponse",groupsName:"Quiz",groupQuestionnairesList:"Les #NB éléments enregistrés pour ce groupe",groupQuestionnairesListWithout:"Aucun élément n'a été enregistré pour ce groupe.",haveBeenPublished:"#NB nouveaux groupes de quizs ont été publiés.",infosGroupForAdmin:"Ce groupe de quizs a été créé le DATE_CREA, mise à jour la dernière fois le DATE_UPDATE.
Son identifiant est GROUP_ID. Il regroupe actuellement les questions de NB_ELEMENTS quizs.",linkFirstElementGroup:"Retour au premier article.",lastUpdated:"Dernière mise à jour le ",needCorrectPublishingDate:"La date de publication fournie n'a pas un format valide.",needLanguage:"Vous devez sélectionner la langue de ce groupe de quizs.",needNotTooLongTitle:"Le titre du groupe de quizs ne doit pas compter plus de 255 caractères.",needTitle:"Merci de fournir un titre à ce groupe de quizs.",needUniqueUrl:"L'url du groupe de quizs doit être unique.",needUrl:"Merci de fournir l'url à ce groupe de quizs.",notFound:"Le groupe de quizs (#SEARCH) n'a pas été trouvé.",publishedAt:" le",publishedBy:"Quiz publié par",searchIsNotLongEnough:"Vous devez saisir au moins #MIN caractères pour votre recherche.",searchWithoutResult:"Aucun groupe n'a été trouvé pour votre recherche.",wrongAnswerTxt:"Mauvaise réponse"}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const i=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(i,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let n=new Date(e),r=n.getDate()+"";1===r.length&&(r="0"+r);let s=n.getMonth()+1+"";1===s.length&&(s="0"+s);let o=n.getFullYear();return"fr"===i?r+"/"+s+"/"+o:"form"===i?o+"-"+s+"-"+r:s+"/"+r+"/"+o}static getPassword(e,t){const i=e+Math.floor(Math.random()*(t-e)),n="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",r="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let s=n[Math.floor(Math.random()*n.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}},a=(e,t)=>{for(let i in t.elements)if(!(0,s.isEmpty)(t.elements[i].id)){let n=t.elements[i].id;if(void 0!==e[n]){let t=document.getElementById(n);for(let i in e[n])t.setAttribute(i,e[n][i])}}return!0},u=e=>{const t={},i=new FormData(e);for(let e of i.entries())t[e[0]]=e[1];return t};var l=i(671);const c=e.availableLangs[0],d=i(9729)("./"+e.theme+"/config/"+c+".js"),p=(e,i,n)=>{(0,s.isEmpty)(i)||t("message",i),(0,s.isEmpty)(n)||t("url",n),(0,s.isEmpty)(e)||window.location.assign(e)},m=e.availableLangs[0],v=i(4988),g=i(9729)("./"+e.theme+"/config/"+m+".js"),{addOkMessage:h,serverError:f}=i(2111)("./"+m+"/general"),{groupQuestionnairesList:b,groupQuestionnairesListWithout:L,infosGroupForAdmin:E,searchWithoutResult:M}=i(6213)("./"+m+"/group"),{needBeConnected:T}=i(176)("./"+m+"/user"),k=document.getElementById("wantNewGroup"),q=document.getElementById("previewGroup"),y=document.getElementById("deleteOkLabel"),x=document.getElementById("crash"),S=document.getElementById("groupIntro"),z=document.getElementById("main-content"),N=document.getElementById("message"),A=document.getElementById("questionnairesList"),I=document.getElementById("response"),R=document.getElementById("searchResult"),U=document.getElementById("groups"),P=document.getElementById("search"),w=()=>{(e=>{const t=new FormData(e);for(let i of t.entries())"checkbox"==e.elements[i[0]].type||"radio"==e.elements[i[0]].type?e.elements[i[0]].checked=!1:e.elements[i[0]].value=""})(U),y.style.display="none",q.style.display="none",S.innerHTML=""},D=(t,i)=>{w();const n=new XMLHttpRequest;n.open("GET",e.apiUrl+v.groupRoutes+v.getGroupRoute+t),n.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let n=JSON.parse(this.responseText);if(200===this.status&&null!=n.Group){const r={GROUP_ID:n.Group.id,DATE_CREA:(0,s.dateFormat)(n.Group.createdAt),DATE_UPDATE:(0,s.dateFormat)(n.Group.updatedAt),NB_ELEMENTS:void 0!==n.Questionnaires?n.Questionnaires.length:0},a=(0,s.replaceAll)(E,r);o(S,"p",a,"",["info"]);for(let e in n.Group)void 0!==U.elements[e]&&("publishingAt"===e&&null!==n.Group[e]?U.elements[e].value=(0,s.dateFormat)(n.Group[e],"form"):U.elements[e].value=n.Group[e]);if(y.style.display="block",q.style.display="block",!1===n.Group.isPublishable?q.setAttribute("href",e.apiUrl+v.groupRoutes+v.previewGroupRoutes+"/"+t+"/"+i):q.setAttribute("href",e.siteUrl+"/"+v.dirWebGroups+"/"+n.Group.slug+".html"),void 0!==n.Questionnaires&&0!==n.Questionnaires.length){let e="";for(let t in n.Questionnaires)e+="
"):e.message=e.message,o(I,"p",e.message,"",["success"])):e.errors?(Array.isArray(e.errors)?e.errors=e.errors.join("
"):e.errors=f,o(I,"p",e.errors,"",["error"])):o(I,"p",f,"",["error"]),(0,s.isEmpty)(e.errors)&&(void 0===n.deleteOk?D(n.id,t.token):w())}},r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+t.token),n&&r.send(JSON.stringify(n))})),P.addEventListener("submit",(function(i){i.preventDefault();let n=u(P);const r=new XMLHttpRequest;r.open("POST",e.apiUrl+v.groupRoutes+v.searchGroupsRoute),r.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);if(200===this.status&&Array.isArray(e))if(0===e.length)o(R,"p",M,"",["info"]);else{let i="";for(let t in e)i+="";o(R,"select",i,"selectSearch");const n=document.getElementById("selectSearch");n.addEventListener("change",(function(){""!==n.value&&D(n.value,t.token)}))}else e.errors?(Array.isArray(e.errors)?e.errors=e.errors.join("
"):e.errors=f,o(R,"p",e.errors,"",["error"])):o(R,"p",f,"",["error"])}},r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+t.token),n&&r.send(JSON.stringify(n))}))}}catch(e){o(x,"p",f,"",["error"]),console.error(e)}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****")}()}();
\ No newline at end of file
diff --git a/front/public/JS/manageQuestionnaires.app.js b/front/public/JS/manageQuestionnaires.app.js
index 7494eec..c439e6d 100644
--- a/front/public/JS/manageQuestionnaires.app.js
+++ b/front/public/JS/manageQuestionnaires.app.js
@@ -1,374 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/illustrations.js":
-/*!**********************************!*\
- !*** ../config/illustrations.js ***!
- \**********************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const instance = __webpack_require__(/*! ./instance */ \"../config/instance.js\");\n\nmodule.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n illustrationsRoute: \"/illustration/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Illustration: {\n alt: {\n maxlength: 255\n },\n title: {\n maxlength: 255\n },\n caption: {\n maxlength: 255\n },\n image: {\n required: true,\n accept: instance.mimeTypesForIllustration.join(\",\")\n }\n },\n // files upload tempory dir\n dirIllustrationsTmp: \"temp\",\n dirIllustrations: \"front/public/img/quizs\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/illustrations.js?");
-
-/***/ }),
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/links.js":
-/*!**************************!*\
- !*** ../config/links.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n linksRoute: \"/link/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Link: {\n url: {\n maxlength: 255,\n required: true\n },\n anchor: {\n maxlength: 150,\n required: true\n }\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/links.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/manageQuestionnaires.js":
-/*!*************************************!*\
- !*** ./src/manageQuestionnaires.js ***!
- \*************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ \"./src/tools/url.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.)\n/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.\n/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz\n/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés.\n/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément.\n/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant de saisir un nouveau quiz.\n// Fichiers de configuration :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst config = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n\nconst configIllustrations = __webpack_require__(/*! ../../config/illustrations.js */ \"../config/illustrations.js\");\n\nconst configLinks = __webpack_require__(/*! ../../config/links.js */ \"../config/links.js\");\n\nconst configQuestionnaires = __webpack_require__(/*! ../../config/questionnaires.js */ \"../config/questionnaires.js\");\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // Fonctions :\n\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n addOkMessage,\n deleteBtnTxt,\n serverError,\n updateBtnTxt\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n addIllustrationTxt,\n defaultAlt,\n introNoIllustration,\n introTitleForIllustration\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/illustration$\")(\"./\" + lang + \"/illustration\");\n\nconst {\n addLinkTxt,\n defaultValueForLink,\n introNoLink,\n introTitleForLink\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/link$\")(\"./\" + lang + \"/link\");\n\nconst {\n addQuestionTxt,\n introNoQuestion,\n introTitleForQuestion\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/question$\")(\"./\" + lang + \"/question\");\n\nconst {\n needGroupIfRank,\n nextDateWithoutQuestionnaire,\n nextQuestionnairesList,\n questionnaireNeedBeCompleted,\n searchQuestionnaireWithNoResult\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/questionnaire$\")(\"./\" + lang + \"/questionnaire\");\n\nconst {\n needBeConnected\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\"); // Principaux éléments du DOM manipulés :\n\n\nconst btnNewQuestionnaire = document.getElementById(\"wantNewQuestionnaire\");\nconst btnPreviewQuestionnaire = document.getElementById(\"previewQuestionnaire\");\nconst deleteCheckBox = document.getElementById(\"deleteOkLabel\");\nconst divCrash = document.getElementById(\"crash\");\nconst divIllustrations = document.getElementById(\"illustrationsList\");\nconst divLinks = document.getElementById(\"linksList\");\nconst divMain = document.getElementById(\"main-content\");\nconst divMessage = document.getElementById(\"message\");\nconst divQuestionnaires = document.getElementById(\"questionnairesList\");\nconst divQuestions = document.getElementById(\"questionsList\");\nconst divResponse = document.getElementById(\"response\");\nconst divSearchResult = document.getElementById(\"searchResult\");\nconst formLink = document.getElementById(\"links\");\nconst formIllustration = document.getElementById(\"illustrations\");\nconst formQuestion = document.getElementById(\"questions\");\nconst formQuestionnaire = document.getElementById(\"questionnaires\");\nconst formSearch = document.getElementById(\"search\");\nconst helpClassification = document.getElementById(\"helpClassification\");\nconst helpGroup = document.getElementById(\"helpGroup\");\nconst helpPublishingAt = document.getElementById(\"helpPublishingAt\");\nconst inputClassification = document.getElementById(\"classification\");\nconst inputGroup = document.getElementById(\"group\");\nconst inputRankInGroup = document.getElementById(\"rankInGroup\"); // Vide et cache tous les formulaires annexes au questionnaire :\n\nconst hideAllForms = () => {\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formLink);\n if (defaultValueForLink != 0) document.getElementById(\"anchor\").value = defaultValueForLink;\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formIllustration);\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyAndHideForm)(formQuestion);\n}; // Affiche les données d'un lien dans le formulaire adhoc :\n\n\nconst showFormLinkInfos = Link => {\n // On commence par cacher et vider tous les formulaires annexes\n hideAllForms(); // Puis on affiche celui concerné\n\n formLink.style.display = \"block\"; // + Les contraintes de champ & valeurs par défaut :\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configLinks.Link, formLink);\n\n for (let data in Link) {\n if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];\n }\n}; // Affiche les infos connues concernant les liens du questionnaire affiché :\n\n\nconst showLinkInfos = (Links, token) => {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, \"h2\", introTitleForLink);\n let listLinks = \"\";\n\n for (let i in Links) listLinks += \"
\" + updateBtnTxt + \" \" + deleteBtnTxt + \"
\");else response.message = response.message;\n showLinkInfos(response.questionnaire.Links, token); // le serveur retourne une version actualisée de la liste des liens\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divLinks, \"p\", response.message, \"\", [\"success\"], \"\", false);\n hideAllForms();\n window.location.assign(\"#linksList\");\n showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseLink, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseLink, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhrLinkDatas.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrLinkDatas.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhrLinkDatas.send(JSON.stringify(datas));\n}; // Affiche les données d'une illustration dans le formulaire adhoc :\n\n\nconst showFormIllustrationInfos = Illustration => {\n // On commence par cacher et vider tous les formulaires annexes\n hideAllForms(); // Puis on affiche celui concerné\n\n formIllustration.style.display = \"block\"; // + Les contraintes de champ & valeurs par défaut\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configIllustrations.Illustration, formIllustration); // Mais le champ file n'est plus requis, quand un fichier existe déjà\n\n formIllustration.elements[\"image\"].removeAttribute(\"required\");\n\n for (let data in Illustration) {\n if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];\n }\n}; // Affiche les infos connues concernant les illustrations du questionnaire affiché :\n\n\nconst showIllustrationInfos = (Illustrations, token) => {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, \"h2\", introTitleForIllustration);\n let listIllustrations = \"\";\n\n for (let i in Illustrations) listIllustrations += \"
\" + updateBtnTxt + \" \" + deleteBtnTxt + \"
\");else response.message = response.message;\n showIllustrationInfos(response.questionnaire.Illustrations, token); // le serveur retourne une version actualisée de la liste des liens\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divIllustrations, \"p\", response.message, \"\", [\"success\"], \"\", false);\n hideAllForms();\n window.location.assign(\"#illustrationsList\");\n showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseIllustration, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseIllustration, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhrIllustrationDatas.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhrIllustrationDatas.send(datasWithFiles);\n}; // Affiche les données d'une question + ses réponses possibles dans le formulaire adhoc\n\n\nconst showFormQuestionInfos = Question => {\n // On commence par cacher et vider tous les formulaires annexes\n hideAllForms(); // Puis on affiche celui concerné\n\n formQuestion.style.display = \"block\";\n\n for (let data in Question.Question) {\n if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data];\n } // + Les contraintes de champ & les valeurs par défaut\n\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configQuestionnaires.Question, formQuestion);\n\n for (let data in Question.Choices) {\n if (formQuestion.elements[\"choiceText\" + data] !== undefined) {\n formQuestion.elements[\"choiceText\" + data].value = Question.Choices[data].text;\n if (Question.Choices[data].isCorrect == true) formQuestion.elements[\"choiceIsCorrect\" + data].checked = true;\n formQuestion.elements[\"idChoice\" + data].value = Question.Choices[data].id;\n }\n }\n}; // Affiche les infos des questions du quiz affiché :\n\n\nconst showQuestionInfos = (Questions, token) => {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, \"h2\", introTitleForQuestion);\n let listQuestions = \"\";\n\n for (let i in Questions) listQuestions += \"
\" + updateBtnTxt + \" \" + deleteBtnTxt + \"
\");else response.message = response.message;\n showQuestionInfos(response.questionnaire.Questions, token); // le serveur me retourne une version actualisée de la liste des questions\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divQuestions, \"p\", response.message, \"\", [\"success\"], \"\", false);\n hideAllForms();\n window.location.assign(\"#questionsList\");\n showNextQuestionnaires(token); // car peut avoir évolué suivant ce qui s'est passé\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseQuestion, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponseQuestion, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhrQuestionDatas.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrQuestionDatas.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhrQuestionDatas.send(JSON.stringify(datas));\n}; // Affichant les infos connues concernant un questionnaire et ses dépendances\n\n\nconst showFormQuestionnaireInfos = (id, token) => {\n const xhrGetInfos = new XMLHttpRequest();\n xhrGetInfos.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getQuestionnaireRoutes + \"/\" + id);\n\n xhrGetInfos.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.Questionnaire != undefined) {\n formQuestionnaire.reset(); // pour ne pas garder les données déjà affichées si vide dans ce qui est retourné\n\n for (let data in response.Questionnaire) {\n if (formQuestionnaire.elements[data] !== undefined) {\n if (data === \"publishingAt\" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.Questionnaire[data], \"form\"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type \"date\"\n else formQuestionnaire.elements[data].value = response.Questionnaire[data];\n }\n }\n\n deleteCheckBox.style.display = \"block\";\n } // ajouter gestion des retours en erreur ?\n\n\n if (response.Tags != undefined) {\n let classification = \"\";\n\n for (let i in response.Tags) {\n if (i == 0) classification += response.Tags[i].name;else classification += \",\" + response.Tags[i].name;\n }\n\n formQuestionnaire.elements[\"classification\"].value = classification;\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(response.Group)) formQuestionnaire.elements[\"group\"].value = response.Group.Group.title + \" (\" + response.Group.Group.id + \")\";\n divLinks.style.display = \"block\";\n divQuestions.style.display = \"block\";\n divIllustrations.style.display = \"block\";\n if (response.Links != undefined) showLinkInfos(response.Links, token);\n if (response.Questions != undefined) showQuestionInfos(response.Questions, token);\n if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations, token);\n helpPublishingAt.style.display = \"none\"; // info uniquement utile pour \"placer\" un nouveau quiz\n // à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden :\n\n btnNewQuestionnaire.style.display = \"block\";\n btnNewQuestionnaire.setAttribute(\"href\", configTemplate.questionnairesManagementPage);\n btnPreviewQuestionnaire.style.display = \"block\";\n if (response.Questionnaire[\"isPublished\"] === false) btnPreviewQuestionnaire.setAttribute(\"href\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.previewQuestionnaireRoutes + \"/\" + id + \"/\" + token);else btnPreviewQuestionnaire.setAttribute(\"href\", config.siteUrl + configQuestionnaires.publishedQuestionnaireRoutes + response.Questionnaire[\"slug\"] + \".html\");\n }\n };\n\n xhrGetInfos.send();\n}; // Affiche les questionnaires bientôt publiés.\n\n\nconst showNextQuestionnaires = token => {\n const xhrNextQuestionnaires = new XMLHttpRequest();\n xhrNextQuestionnaires.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getListNextQuestionnaires);\n\n xhrNextQuestionnaires.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && Array.isArray(response.questionnaires)) {\n let listHTML = \"\",\n dayStr,\n optionsDayStr = {\n weekday: 'long'\n };\n\n for (let i in response.questionnaires) {\n dayStr = new Intl.DateTimeFormat(lang, optionsDayStr).format(new Date(response.questionnaires[i].datePublishing));\n listHTML += \"
\");else response.message = response.message;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n showNextQuestionnaires(user.token); // peut avoir évolué suivant ce qui s'est passé\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n\n if (datas.deleteOk === undefined && response.errors === undefined) showFormQuestionnaireInfos(datas.id, user.token); // on actualise les données\n else if (response.errors === undefined) {\n formQuestionnaire.reset();\n divLinks.innerHTML = \"\";\n divIllustrations.innerHTML = \"\";\n divQuestions.innerHTML = \"\";\n }\n }\n };\n\n xhrQuestionnaireDatas.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrQuestionnaireDatas.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n if (datas) xhrQuestionnaireDatas.send(JSON.stringify(datas));\n }\n });\n formLink.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n sendLinkForm(user.token);\n });\n formIllustration.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n sendIllustrationForm(user.token);\n });\n formQuestion.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n sendQuestionForm(user.token);\n });\n }\n } catch (e) {\n console.error(e);\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divCrash, \"p\", serverError, \"\", [\"error\"]);\n }\n};\n\ninitialise();\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\n//# sourceURL=webpack://wikilerni/./src/manageQuestionnaires.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/illustration.js":
-/*!**********************************!*\
- !*** ../lang/fr/illustration.js ***!
- \**********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addedOkMessage: \"L'illustration a bien été enregistrée.\",\n addIllustrationTxt: \"Ajouter une illustration\",\n defaultAlt: \"Illustration du quiz\",\n deletedOkMessage: \"L'illustration a bien été supprimée.\",\n introNoIllustration: \"Aucune illustration pour l'instant.\",\n introTitleForIllustration: \"Illustrations du quiz\",\n needGoodFile: \"Votre fichier n'a pas été accepté.\",\n needGoodLongAlt: \"Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.\",\n needGoodLongCaption: \"Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.\",\n needGoodLongTitle: \"Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.\",\n needGoodLongUrl: \"L'url de l'image doit contenir entre 5 et 255 caractères.\",\n needMaxIllustrationsForQuestionnaire: \"Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.\",\n needQuestionnaireForIllustration: \"Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.\",\n needUniqueUrl: \"L'url est déjà utilisée par une autre image.\",\n needUrl: \"Merci de fournir une url pour l'image.\",\n notFound: \"L'enregistrement de l'illustration n'a pas été trouvé : \",\n updatedOkMessage: \"L'illustration a bien été modifiée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/illustration.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/link.js":
-/*!**************************!*\
- !*** ../lang/fr/link.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addedOkMessage: \"Le lien a bien été ajouté.\",\n addLinkTxt: \"Ajouter un lien\",\n defaultValueForLink: \"Lire l'article sur Wikipédia.\",\n deletedOkMessage: \"Le lien a bien été supprimé.\",\n introNoLink: \"Aucun lien pour l'instant.\",\n introTitleForLink: \"Lectures proposées\",\n needAnchor: \"Merci de fournir une ancre pour ce lien.\",\n needGoodLongAnchor: \"Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.\",\n needMaxLinksForQuestionnaire: \"Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.\",\n needNotTooLongUrl: \"Merci de saisir un url ne comptant pas plus de 255 caractères.\",\n needQuestionnaire: \"Le questionnaire du lien n'a pas été trouvé.\",\n needUrl: \"Merci de saisir l'url du lien.\",\n needValidUrl: \"Merci de saisir un url ayant un format valide.\",\n notFound: \"L'enregistrement du lien n'a pas été trouvé.\",\n updatedOkMessage: \"Le lien a bien été modifié.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/link.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/question.js":
-/*!******************************!*\
- !*** ../lang/fr/question.js ***!
- \******************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addOkMessage: \"La question a bien été ajoutée.\",\n addQuestionTxt: \"Ajouter une question\",\n deleteOkMessage: \"La question a bien été supprimée.\",\n introNoQuestion: \"Aucune question n'a été saisie pour l'instant\",\n introTitleForQuestion: \"Les questions enregistrées\",\n needMaxQuestions: \"Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : \",\n needNotTooLongText: \"La question ne doit pas compter plus de 255 caractères.\",\n needNumberForRank: \"Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question.\",\n needQuestionnaire: \"Le questionnaire concerné n'a pas été trouvé.\",\n needText: \"Merci de saisir le texte de la question !\",\n notFound: \"L'enregistrement de la question n'a pas été trouvé.\",\n updateOkMessage: \"La question a bien été modifiée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/question.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/questionnaire.js":
-/*!***********************************!*\
- !*** ../lang/fr/questionnaire.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n btnProposeConnection: \"Je me connecte.\",\n // déplacé dans general.js\n btnProposeSubscribe: \"Je crée mon compte.\",\n //idem\n btnSendResponse: \"Testez vos réponses.\",\n btnShareQuizTxt: \"Partager via \",\n btnShareQuizMailBody: \"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A\",\n btnShowQuestionnaire: \"Répondre au quiz !\",\n correctAnswerTxt: \"Bonne réponse\",\n estimatedTime: \"Durée de lecture estimée : \",\n estimatedTimeOption: {\n short: \"courte\",\n medium: \"moyenne\",\n long: \"longue\"\n },\n explanationBeforeTxt: \"Extrait :\",\n haveBeenPublished: \":NB nouveaux questionnaires ont été publiés.\",\n haveBeenRegenerated: \"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.\",\n lastUpdated: \"Dernière mise à jour, le \",\n linkGoToNextElement: \"Article suivant\",\n linkGoToQuiz: \"Accéder au quiz\",\n needCorrectPublishingDate: \"La date de publication fournie n'a pas un format valide.\",\n needEstimatedTime: \"Merci de sélectionner une estimation de la durée de ce quiz.\",\n needGroupIfRank: \"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.\",\n needIntroduction: \"Merci de fournir un texte d'introduction à votre quiz.\",\n needKnowIfIsPublished: \"Il faut savoir si ce quiz est publié.\",\n needLanguage: \"Vous devez sélectionner la langue de ce quiz.\",\n needNotTooLongTitle: \"Le titre du quiz ne doit pas compter plus de 255 caractères.\",\n needNumberForRank: \"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.\",\n needTitle: \"Merci de fournir un titre à votre quiz.\",\n needUniqueUrl: \"L'url du quiz doit être unique.\",\n needUrl: \"Merci de fournir l'url à votre quiz.\",\n nextDateWithoutQuestionnaire: \"Prochaine date sans quiz programmé : \",\n nextQuestionnairesList: \"Les #NB prochains quizs devant être publiés\",\n questionnairesName: \"quiz\",\n questionnaireNeedBeCompleted: \"Quiz incomplet\",\n publishedAt: \", le\",\n publishedBy: \"Quiz publié par\",\n searchQuestionnaireResultTitle: \"Résultat pour votre recherche\",\n searchQuestionnaireWithNoResult: \"Aucun quiz n'a été trouvé pour votre recherche.\",\n searchQuestionnaireWithResult: \"Il y a #NB article#S correspondant à votre recherche :\",\n wrongAnswerTxt: \"Mauvaise réponse\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/questionnaire.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},8614:function(e){e.exports={addedOkMessage:"L'illustration a bien été enregistrée.",addIllustrationTxt:"Ajouter une illustration",defaultAlt:"Illustration du quiz",deletedOkMessage:"L'illustration a bien été supprimée.",introNoIllustration:"Aucune illustration pour l'instant.",introTitleForIllustration:"Illustrations du quiz",needGoodFile:"Votre fichier n'a pas été accepté.",needGoodLongAlt:"Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.",needGoodLongCaption:"Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.",needGoodLongTitle:"Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.",needGoodLongUrl:"L'url de l'image doit contenir entre 5 et 255 caractères.",needMaxIllustrationsForQuestionnaire:"Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.",needQuestionnaireForIllustration:"Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.",needUniqueUrl:"L'url est déjà utilisée par une autre image.",needUrl:"Merci de fournir une url pour l'image.",notFound:"L'enregistrement de l'illustration n'a pas été trouvé : ",updatedOkMessage:"L'illustration a bien été modifiée."}},5490:function(e){e.exports={addedOkMessage:"Le lien a bien été ajouté.",addLinkTxt:"Ajouter un lien",defaultValueForLink:"Lire l'article sur Wikipédia.",deletedOkMessage:"Le lien a bien été supprimé.",introNoLink:"Aucun lien pour l'instant.",introTitleForLink:"Lectures proposées",needAnchor:"Merci de fournir une ancre pour ce lien.",needGoodLongAnchor:"Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.",needMaxLinksForQuestionnaire:"Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.",needNotTooLongUrl:"Merci de saisir un url ne comptant pas plus de 255 caractères.",needQuestionnaire:"Le questionnaire du lien n'a pas été trouvé.",needUrl:"Merci de saisir l'url du lien.",needValidUrl:"Merci de saisir un url ayant un format valide.",notFound:"L'enregistrement du lien n'a pas été trouvé.",updatedOkMessage:"Le lien a bien été modifié."}},9129:function(e){e.exports={addOkMessage:"La question a bien été ajoutée.",addQuestionTxt:"Ajouter une question",deleteOkMessage:"La question a bien été supprimée.",introNoQuestion:"Aucune question n'a été saisie pour l'instant",introTitleForQuestion:"Les questions enregistrées",needMaxQuestions:"Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ",needNotTooLongText:"La question ne doit pas compter plus de 255 caractères.",needNumberForRank:"Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question.",needQuestionnaire:"Le questionnaire concerné n'a pas été trouvé.",needText:"Merci de saisir le texte de la question !",notFound:"L'enregistrement de la question n'a pas été trouvé.",updateOkMessage:"La question a bien été modifiée."}},3215:function(e){e.exports={btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnSendResponse:"Testez vos réponses.",btnShareQuizTxt:"Partager via ",btnShareQuizMailBody:"Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A",btnShowQuestionnaire:"Répondre au quiz !",correctAnswerTxt:"Bonne réponse",estimatedTime:"Durée de lecture estimée : ",estimatedTimeOption:{short:"courte",medium:"moyenne",long:"longue"},explanationBeforeTxt:"Extrait :",haveBeenPublished:":NB nouveaux questionnaires ont été publiés.",haveBeenRegenerated:"Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.",lastUpdated:"Dernière mise à jour, le ",linkGoToNextElement:"Article suivant",linkGoToQuiz:"Accéder au quiz",needCorrectPublishingDate:"La date de publication fournie n'a pas un format valide.",needEstimatedTime:"Merci de sélectionner une estimation de la durée de ce quiz.",needGroupIfRank:"Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.",needIntroduction:"Merci de fournir un texte d'introduction à votre quiz.",needKnowIfIsPublished:"Il faut savoir si ce quiz est publié.",needLanguage:"Vous devez sélectionner la langue de ce quiz.",needNotTooLongTitle:"Le titre du quiz ne doit pas compter plus de 255 caractères.",needNumberForRank:"Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.",needTitle:"Merci de fournir un titre à votre quiz.",needUniqueUrl:"L'url du quiz doit être unique.",needUrl:"Merci de fournir l'url à votre quiz.",nextDateWithoutQuestionnaire:"Prochaine date sans quiz programmé : ",nextQuestionnairesList:"Les #NB prochains quizs devant être publiés",questionnairesName:"quiz",questionnaireNeedBeCompleted:"Quiz incomplet",publishedAt:", le",publishedBy:"Quiz publié par",searchQuestionnaireResultTitle:"Résultat pour votre recherche",searchQuestionnaireWithNoResult:"Aucun quiz n'a été trouvé pour votre recherche.",searchQuestionnaireWithResult:"Il y a #NB article#S correspondant à votre recherche :",wrongAnswerTxt:"Mauvaise réponse"}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const n=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(n,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let i=new Date(e),s=i.getDate()+"";1===s.length&&(s="0"+s);let r=i.getMonth()+1+"";1===r.length&&(r="0"+r);let o=i.getFullYear();return"fr"===n?s+"/"+r+"/"+o:"form"===n?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,t){const n=e+Math.floor(Math.random()*(t-e)),i="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=i[Math.floor(Math.random()*i.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}},a=(e,t)=>{for(let n in t.elements)if(!(0,r.isEmpty)(t.elements[n].id)){let i=t.elements[n].id;if(void 0!==e[i]){let t=document.getElementById(i);for(let n in e[i])t.setAttribute(n,e[i][n])}}return!0},u=e=>{const t={},n=new FormData(e);for(let e of n.entries())t[e[0]]=e[1];return t},l=e=>{(e=>{const t=new FormData(e);for(let n of t.entries())"checkbox"==e.elements[n[0]].type||"radio"==e.elements[n[0]].type?e.elements[n[0]].checked=!1:e.elements[n[0]].value=""})(e),e.style.display="none"};var d=n(671);const c=e.availableLangs[0],p=n(9729)("./"+e.theme+"/config/"+c+".js"),m=(e,n,i)=>{(0,r.isEmpty)(n)||t("message",n),(0,r.isEmpty)(i)||t("url",i),(0,r.isEmpty)(e)||window.location.assign(e)},g=e.availableLangs[0],v=n(6028),h=n(8795),f=n(6425),b=n(4988),L=n(9729)("./"+e.theme+"/config/"+g+".js"),{addOkMessage:k,deleteBtnTxt:y,serverError:E,updateBtnTxt:T}=n(2111)("./"+g+"/general"),{addIllustrationTxt:q,defaultAlt:M,introNoIllustration:x,introTitleForIllustration:I}=n(408)("./"+g+"/illustration"),{addLinkTxt:N,defaultValueForLink:R,introNoLink:S,introTitleForLink:z}=n(4567)("./"+g+"/link"),{addQuestionTxt:A,introNoQuestion:w,introTitleForQuestion:U}=n(9290)("./"+g+"/question"),{needGroupIfRank:Q,nextDateWithoutQuestionnaire:B,nextQuestionnairesList:D,questionnaireNeedBeCompleted:O,searchQuestionnaireWithNoResult:P}=n(3260)("./"+g+"/questionnaire"),{needBeConnected:C}=n(176)("./"+g+"/user"),j=document.getElementById("wantNewQuestionnaire"),H=document.getElementById("previewQuestionnaire"),_=document.getElementById("deleteOkLabel"),W=document.getElementById("crash"),G=document.getElementById("illustrationsList"),V=document.getElementById("linksList"),F=document.getElementById("main-content"),J=document.getElementById("message"),X=(document.getElementById("questionnairesList"),document.getElementById("questionsList")),K=document.getElementById("response"),Y=document.getElementById("searchResult"),Z=document.getElementById("links"),$=document.getElementById("illustrations"),ee=document.getElementById("questions"),te=document.getElementById("questionnaires"),ne=document.getElementById("search"),ie=document.getElementById("helpClassification"),se=document.getElementById("helpGroup"),re=document.getElementById("helpPublishingAt"),oe=document.getElementById("classification"),ae=document.getElementById("group"),ue=document.getElementById("rankInGroup"),le=()=>{l(Z),0!=R&&(document.getElementById("anchor").value=R),l($),l(ee)},de=e=>{le(),Z.style.display="block",a(f.Link,Z);for(let t in e)void 0!==Z.elements[t]&&(Z.elements[t].value=e[t])},ce=(e,t)=>{o(V,"h2",z);let n="";for(let t in e)n+="
"+T+" "+y+"
"):e.errors=E,o(n,"p",e.errors,"",["error"])):o(n,"p",E,"",["error"]):(Array.isArray(e.message)?e.message=e.message.join("
"):e.message=e.message,ce(e.questionnaire.Links,t),o(V,"p",e.message,"",["success"],"",!1),le(),window.location.assign("#linksList"))}},s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("Authorization","Bearer "+t),s.send(JSON.stringify(i))},me=e=>{le(),$.style.display="block",a(h.Illustration,$),$.elements.image.removeAttribute("required");for(let t in e)void 0!==$.elements[t]&&($.elements[t].value=e[t])},ge=(e,t)=>{o(G,"h2",I);let n="";for(let t in e)n+="
"+T+" "+y+"
"):e.errors=E,o(n,"p",e.errors,"",["error"])):o(n,"p",E,"",["error"]):(Array.isArray(e.message)?e.message=e.message.join("
"):e.message=e.message,ge(e.questionnaire.Illustrations,t),o(G,"p",e.message,"",["success"],"",!1),le(),window.location.assign("#illustrationsList"))}},a.setRequestHeader("Authorization","Bearer "+t),a.send(s)},he=e=>{le(),ee.style.display="block";for(let t in e.Question)void 0!==ee.elements[t]&&(ee.elements[t].value=e.Question[t]);a(b.Question,ee);for(let t in e.Choices)void 0!==ee.elements["choiceText"+t]&&(ee.elements["choiceText"+t].value=e.Choices[t].text,1==e.Choices[t].isCorrect&&(ee.elements["choiceIsCorrect"+t].checked=!0),ee.elements["idChoice"+t].value=e.Choices[t].id)},fe=(e,t)=>{o(X,"h2",U);let n="";for(let t in e)n+="
"+T+" "+y+"
"):e.errors=E,o(n,"p",e.errors,"",["error"])):o(n,"p",E,"",["error"]):(Array.isArray(e.message)?e.message=e.message.join("
"):e.message=e.message,fe(e.questionnaire.Questions,t),o(X,"p",e.message,"",["success"],"",!1),le(),window.location.assign("#questionsList"))}},s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("Authorization","Bearer "+t),s.send(JSON.stringify(i))},Le=(t,n)=>{const i=new XMLHttpRequest;i.open("GET",e.apiUrl+b.questionnaireRoutes+b.getQuestionnaireRoutes+"/"+t),i.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let i=JSON.parse(this.responseText);if(200===this.status&&null!=i.Questionnaire){te.reset();for(let e in i.Questionnaire)void 0!==te.elements[e]&&("publishingAt"===e&&null!==i.Questionnaire[e]?te.elements[e].value=(0,r.dateFormat)(i.Questionnaire[e],"form"):te.elements[e].value=i.Questionnaire[e]);_.style.display="block"}if(null!=i.Tags){let e="";for(let t in i.Tags)e+=0==t?i.Tags[t].name:","+i.Tags[t].name;te.elements.classification.value=e}(0,r.isEmpty)(i.Group)||(te.elements.group.value=i.Group.Group.title+" ("+i.Group.Group.id+")"),V.style.display="block",X.style.display="block",G.style.display="block",null!=i.Links&&ce(i.Links,n),null!=i.Questions&&fe(i.Questions,n),null!=i.Illustrations&&ge(i.Illustrations,n),re.style.display="none",j.style.display="block",j.setAttribute("href",L.questionnairesManagementPage),H.style.display="block",!1===i.Questionnaire.isPublished?H.setAttribute("href",e.apiUrl+b.questionnaireRoutes+b.previewQuestionnaireRoutes+"/"+t+"/"+n):H.setAttribute("href",v.siteUrl+b.publishedQuestionnaireRoutes+i.Questionnaire.slug+".html")}},i.send()};(async()=>{try{const n=await async function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0,u=arguments.length>3?arguments[3]:void 0;return new Promise(((l,c)=>{const g=i("user");if((0,r.isEmpty)(g))m(o,a,u),l(!1);else{const i=JSON.parse(g);if((0,r.isEmpty)(i.id)||(0,r.isEmpty)(i.token)||(0,r.isEmpty)(i.duration)||i.duration
"):e.message=e.message,o(K,"p",e.message,"",["success"])):e.errors?(Array.isArray(e.errors)?e.errors=e.errors.join("
"):e.errors=E,o(K,"p",e.errors,"",["error"])):o(K,"p",E,"",["error"]),void 0===i.deleteOk&&void 0===e.errors?Le(i.id,t.token):void 0===e.errors&&(te.reset(),V.innerHTML="",G.innerHTML="",X.innerHTML="")}},n.setRequestHeader("Content-Type","application/json"),n.setRequestHeader("Authorization","Bearer "+t.token),i&&n.send(JSON.stringify(i))}})),Z.addEventListener("submit",(function(e){e.preventDefault(),pe(t.token)})),$.addEventListener("submit",(function(e){e.preventDefault(),ve(t.token)})),ee.addEventListener("submit",(function(e){e.preventDefault(),be(t.token)}))}}catch(e){console.error(e),o(W,"p",E,"",["error"])}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****")}()}();
\ No newline at end of file
diff --git a/front/public/JS/manageUsers.app.js b/front/public/JS/manageUsers.app.js
index c688f81..44a66d1 100644
--- a/front/public/JS/manageUsers.app.js
+++ b/front/public/JS/manageUsers.app.js
@@ -1,294 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/manageUsers.js":
-/*!****************************!*\
- !*** ./src/manageUsers.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ \"./src/tools/forms.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ \"./src/tools/url.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES INFOS DES UTILISATEURS ET DE LEUR ABONNEMENT\n/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.\n/// Si c'est ok, propose un moteur de recherche permettant de chercher un utilisateur\n/// Si un id est passé par l'url on affiche les informations de l'utilisateur dans un formulaire permettant de l'éditer/supprimer.\n/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouvel utilisateur\n/// À ajouter : \n/// - importation liste de comptes utilisateur à créer\n/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Déjà prévu par le contrôleur.\n// Fichier de configuration côté client :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configUsers = __webpack_require__(/*! ../../config/users.js */ \"../config/users.js\");\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // Fonctions utiles au script :\n\n\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n addOkMessage,\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n infosAdminGodfather,\n infosAdminNbGodChilds,\n infosUserForAdmin,\n needBeConnected,\n searchUsersWithoutResult\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\");\n\nconst {\n infosExpiratedAdmin,\n infosNbDaysAdmin,\n infosPaymentsAdmin,\n isNotValided\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/subscription$\")(\"./\" + lang + \"/subscription\"); // Principaux éléments du DOM manipulés :\n\n\nconst divMain = document.getElementById(\"main-content\");\nconst divMessage = document.getElementById(\"message\");\nconst divResponse = document.getElementById(\"response\");\nconst divCrash = document.getElementById(\"crash\");\nconst divSubscribeIntro = document.getElementById(\"subscribeIntro\");\nconst divPaymentsInfos = document.getElementById(\"infosPayments\");\nconst divGodchildsInfos = document.getElementById(\"infosGodchilds\");\nconst formUser = document.getElementById(\"users\");\nconst deleteCheckBox = document.getElementById(\"deleteOkLabel\");\nconst validationCheckBox = document.getElementById(\"validationOkLabel\");\nconst btnNewUser = document.getElementById(\"wantNewUser\");\nconst newPassword = document.getElementById(\"newPassword\");\nconst timeDifference = document.getElementById(\"timeDifference\");\nconst formSearch = document.getElementById(\"searchUsers\");\nconst divSearchResult = document.getElementById(\"searchResult\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\nconst initialise = async () => {\n try {\n const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_7__.checkSession)([\"manager\", \"admin\"], \"/\" + configTemplate.connectionPage, {\n message: needBeConnected,\n color: \"error\"\n }, window.location);\n\n if (isConnected) {\n const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.updateAccountLink)(user.status, configTemplate);\n divMain.style.display = \"block\";\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\"))) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divMessage, \"p\", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\", true).message, \"\", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"message\", true).color], \"\", false);\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.removeLocaly)(\"message\");\n } // Initialisation du formulaire de recherche :\n\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configUsers, formSearch); // Fonction utile pour vider le formulaire, y compris les champs hidden, etc.\n // Cache aussi certains champs en mode création\n\n const emptyUserForm = () => {\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.empyForm)(formUser); // Case de suppression cachée par défaut, car inutile pour formulaire de création\n\n deleteCheckBox.style.display = \"none\"; // Case de validation cachée par défaut, car utile que dans certains cas\n\n validationCheckBox.style.display = \"none\";\n divSubscribeIntro.innerHTML = \"\";\n divPaymentsInfos.innerHTML = \"\";\n divGodchildsInfos.innerHTML = \"\"; // Certains navigateurs ont tendance à remplir tout seul les champs configUsers.password\n\n newPassword.value = \"\"; // En mode création, pas de champ pour changer le mot de passe\n\n newPassword.parentNode.style.display = \"none\"; // Inutile en mode création\n\n timeDifference.parentNode.style.display = \"none\";\n };\n\n emptyUserForm(); // Initialise les contraintes du formulaire :\n\n (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.setAttributesToInputs)(configUsers, formUser); // Fonction affichant les infos connues concernant un utilisateur et son abonnement\n\n const showFormUserInfos = id => {\n // on commence par tout vider, des fois que... :\n emptyUserForm();\n const xhrGetInfos = new XMLHttpRequest();\n xhrGetInfos.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.getUserInfos + id);\n\n xhrGetInfos.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.User != undefined) {\n newPassword.parentNode.style.display = \"block\";\n timeDifference.parentNode.style.display = \"block\";\n const mapText = {\n ID_USER: response.User.id,\n DATE_CREA: (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.User.createdAt),\n DATE_UPDATE: (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.User.updatedAt),\n DATE_CONNECTION: (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(response.User.connectedAt)\n };\n let subscribeIntro = (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.replaceAll)(infosUserForAdmin, mapText);\n\n for (let data in response.User) {\n if (formUser.elements[data] !== undefined) {\n if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !\n formUser.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien\n formUser.elements[\"\" + data].checked = \"checked\";\n }\n }\n\n if (response.Subscription != undefined) {\n // nombre de jours de l'abonnement\n formUser.elements[\"numberOfDays\"].value = response.Subscription[\"numberOfDays\"]; // jours de réception\n\n for (let i in response.Subscription.receiptDays) formUser.elements[\"d\" + response.Subscription.receiptDays[i]].checked = \"checked\";\n\n const beginSubTS = new Date(response.Subscription.createdAt).getTime();\n\n if (response.Subscription.numberOfDays !== 0) {\n const nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);\n if (nbDaysOk > 0) subscribeIntro += \"
\" + infosNbDaysAdmin.replace(\"NB_DAYS\", nbDaysOk);else subscribeIntro += \"
dd\" + infosExpiratedAdmin;\n }\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSubscribeIntro, \"p\", subscribeIntro, \"\", [\"info\"], \"\", false);\n } else {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSubscribeIntro, \"p\", isNotValided, \"\", [\"error\"]);\n validationCheckBox.style.display = \"block\";\n }\n\n deleteCheckBox.style.display = \"block\"; // Infos de paiements via API WP\n\n const xhrGetPaymentsInfos = new XMLHttpRequest();\n xhrGetPaymentsInfos.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.getPayments + response.User.id);\n\n xhrGetPaymentsInfos.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let responsePay = JSON.parse(this.responseText);\n\n if (this.status === 200) {\n if (responsePay.length !== 0) {\n let txtPayments = \"\";\n\n for (let i in responsePay) {\n const mapText = {\n DATE_PAYMENT: (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.dateFormat)(responsePay[i].createdAt, \"fr\"),\n AMOUNT: responsePay[i].amount,\n CLIENT_NAME: responsePay[i].clientName\n };\n txtPayments += \"
\", \"\", [\"info\"], \"\", false);\n divGodchildsInfos.style.display = \"block\";\n }\n }\n };\n\n xhrGetGodFatherInfos.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrGetGodFatherInfos.send();\n } // Des filleuls ?\n\n\n let txtGodchilds = \"\";\n const xhrGetGodchilds = new XMLHttpRequest();\n xhrGetGodchilds.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.getGodChilds + id);\n\n xhrGetGodchilds.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let responseGS = JSON.parse(this.responseText);\n\n if (this.status === 200) {\n if (responseGS.length !== 0) {\n txtGodchilds += infosAdminGodfather.replace(\"#NB\", responseGS.length);\n\n for (let i in responseGS) txtGodchilds += \"\" + responseGS[i].name + \"\";\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divGodchildsInfos, \"p\", txtGodchilds + \".\", \"\", [\"info\"], \"\", false);\n divGodchildsInfos.style.display = \"block\";\n }\n }\n }\n };\n\n xhrGetGodchilds.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrGetGodchilds.send();\n }\n }\n };\n\n xhrGetInfos.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n xhrGetInfos.send();\n }; // Si un id est passé par l'url, on essaye d'afficher l'utilisateur :\n\n\n let urlDatas = (0,_tools_url_js__WEBPACK_IMPORTED_MODULE_6__.getUrlParams)();\n if (urlDatas && urlDatas.id !== undefined) showFormUserInfos(urlDatas.id); // Besoin d'un coup de Kärcher ? \n\n btnNewUser.addEventListener(\"click\", function (e) {\n emptyUserForm();\n }); // Envoi du formulaire des infos de l'utilisateur\n\n formUser.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n divResponse.innerHTML = \"\";\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formUser); // recomposition des jours valables pour l'abonnement :\n\n datas.receiptDays = \"\";\n\n for (let i = 1; i <= 7; i++) {\n if (datas[\"d\" + i] !== undefined) datas.receiptDays += \"\" + i;\n }\n\n const xhrUserDatas = new XMLHttpRequest();\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && datas.deleteOk !== undefined) xhrUserDatas.open(\"DELETE\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + \"/\" + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id) && datas.validationOk !== undefined) xhrUserDatas.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.validateUserRoute + datas.id);else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(datas.id)) xhrUserDatas.open(\"PUT\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.updateUserInfos + datas.id);else {\n datas.password = (0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.getPassword)(configUsers.password.minlength, configUsers.password.minlength + 2); // mot de passe temporaire\n\n xhrUserDatas.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.createUserRoute);\n }\n\n xhrUserDatas.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 201 && response.id != undefined) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", addOkMessage, \"\", [\"success\"]);\n datas.id = response.id;\n } else if (this.status === 200 && response.message != undefined) {\n if (Array.isArray(response.message)) response.message = response.message.join(\"
\");else response.message = response.message;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]);\n } else if (response.errors) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(response.errors)) {\n if (datas.deleteOk === undefined) showFormUserInfos(datas.id);else emptyUserForm();\n }\n }\n };\n\n xhrUserDatas.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrUserDatas.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n if (datas) xhrUserDatas.send(JSON.stringify(datas));\n }); // Traitement du lancement d'une recherche\n\n formSearch.addEventListener(\"submit\", function (e) {\n e.preventDefault();\n let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__.getDatasFromInputs)(formSearch);\n const xhrSearch = new XMLHttpRequest();\n xhrSearch.open(\"POST\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + configUsers.userRoutes + configUsers.searchUserRoute);\n\n xhrSearch.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && Array.isArray(response)) {\n if (response.length === 0) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"p\", searchUsersWithoutResult, \"\", [\"info\"]);else {\n let selectHTML = \"\";\n\n for (let i in response) selectHTML += \"\";\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"select\", selectHTML, \"selectSearch\");\n const searchSelect = document.getElementById(\"selectSearch\");\n searchSelect.addEventListener(\"change\", function () {\n if (searchSelect.value !== \"\") showFormUserInfos(searchSelect.value);\n });\n }\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divSearchResult, \"p\", serverError, \"\", [\"error\"]);\n }\n };\n\n xhrSearch.setRequestHeader(\"Content-Type\", \"application/json\");\n xhrSearch.setRequestHeader(\"Authorization\", \"Bearer \" + user.token);\n if (datas) xhrSearch.send(JSON.stringify(datas));\n });\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divCrash, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/manageUsers.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/forms.js":
-/*!****************************!*\
- !*** ./src/tools/forms.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setAttributesToInputs\": function() { return /* binding */ setAttributesToInputs; },\n/* harmony export */ \"getDatasFromInputs\": function() { return /* binding */ getDatasFromInputs; },\n/* harmony export */ \"empyForm\": function() { return /* binding */ empyForm; },\n/* harmony export */ \"empyAndHideForm\": function() { return /* binding */ empyAndHideForm; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst setAttributesToInputs = (inputsConf, myForm) => {\n for (let i in myForm.elements) {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {\n let idInput = myForm.elements[i].id;\n\n if (inputsConf[idInput] !== undefined) {\n let inputHTML = document.getElementById(idInput);\n\n for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);\n }\n }\n }\n\n return true;\n}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.\n\nconst getDatasFromInputs = myForm => {\n const datas = {};\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];\n\n return datas;\n}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.\n// Revoir pour les select\n\nconst empyForm = myForm => {\n const formData = new FormData(myForm);\n\n for (let entrie of formData.entries()) {\n if (myForm.elements[entrie[0]].type == \"checkbox\" || myForm.elements[entrie[0]].type == \"radio\") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = \"\";\n }\n\n return true;\n}; // Vide et cache le formulaire\n\nconst empyAndHideForm = myForm => {\n empyForm(myForm);\n myForm.style.display = \"none\";\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/forms.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/subscription.js":
-/*!**********************************!*\
- !*** ../lang/fr/subscription.js ***!
- \**********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n allSubscriptionProcessed: \"Tous les abonnés ont été traités pour le moment.\",\n infosExpirated: \"Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
Pour ce faire, suivez sans tarder les indications ci-dessous :\",\n infosExpiratedAdmin: \"Cet abonnement a expiré.\",\n infosNbDays: \"Votre abonnement est encore valable pendant NB_DAYS jours.
Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :\",\n infosNbDaysAdmin: \"Cet abonnement est encore valable pendant NB_DAYS jours.\",\n infosPaymentsAdmin: \"DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.\",\n isNotValided: \"Cet utilisateur n'a pas encore validé son compte.
Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.\",\n mailEndFreeTimeBodyHTML: \"Bonjour USER_NAME,
Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.Bonjour USER_NAME,
Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.
N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.\",\n unsubscriptionFail: \"Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
Vous pouvez accéder à votre compte pour désactiver les envois manuellement.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/subscription.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},4055:function(e){e.exports={allSubscriptionProcessed:"Tous les abonnés ont été traités pour le moment.",infosExpirated:"Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
Pour ce faire, suivez sans tarder les indications ci-dessous :",infosExpiratedAdmin:"Cet abonnement a expiré.",infosNbDays:"Votre abonnement est encore valable pendant NB_DAYS jours.
Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",infosNbDaysAdmin:"Cet abonnement est encore valable pendant NB_DAYS jours.",infosPaymentsAdmin:"DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.",isNotValided:"Cet utilisateur n'a pas encore validé son compte.
Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.",mailEndFreeTimeBodyHTML:"Bonjour USER_NAME,
Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.Bonjour USER_NAME,
Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.
N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.",unsubscriptionFail:"Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
Vous pouvez accéder à votre compte pour désactiver les envois manuellement."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const n=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(n,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let i=new Date(e),s=i.getDate()+"";1===s.length&&(s="0"+s);let r=i.getMonth()+1+"";1===r.length&&(r="0"+r);let o=i.getFullYear();return"fr"===n?s+"/"+r+"/"+o:"form"===n?o+"-"+r+"-"+s:r+"/"+s+"/"+o}static getPassword(e,t){const n=e+Math.floor(Math.random()*(t-e)),i="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",s="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=i[Math.floor(Math.random()*i.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}},a=(e,t)=>{for(let n in t.elements)if(!(0,r.isEmpty)(t.elements[n].id)){let i=t.elements[n].id;if(void 0!==e[i]){let t=document.getElementById(i);for(let n in e[i])t.setAttribute(n,e[i][n])}}return!0},u=e=>{const t={},n=new FormData(e);for(let e of n.entries())t[e[0]]=e[1];return t};var l=n(671);const c=e.availableLangs[0],d=n(9729)("./"+e.theme+"/config/"+c+".js"),p=(e,n,i)=>{(0,r.isEmpty)(n)||t("message",n),(0,r.isEmpty)(i)||t("url",i),(0,r.isEmpty)(e)||window.location.assign(e)},m=e.availableLangs[0],v=n(671),g=n(9729)("./"+e.theme+"/config/"+m+".js"),{addOkMessage:h,serverError:b}=n(2111)("./"+m+"/general"),{infosAdminGodfather:f,infosAdminNbGodChilds:L,infosUserForAdmin:E,needBeConnected:M,searchUsersWithoutResult:T}=n(176)("./"+m+"/user"),{infosExpiratedAdmin:y,infosNbDaysAdmin:k,infosPaymentsAdmin:N,isNotValided:S}=n(7325)("./"+m+"/subscription"),q=document.getElementById("main-content"),x=document.getElementById("message"),U=document.getElementById("response"),A=document.getElementById("crash"),I=document.getElementById("subscribeIntro"),R=document.getElementById("infosPayments"),z=document.getElementById("infosGodchilds"),D=document.getElementById("users"),P=document.getElementById("deleteOkLabel"),w=document.getElementById("validationOkLabel"),B=document.getElementById("wantNewUser"),_=document.getElementById("newPassword"),C=document.getElementById("timeDifference"),O=document.getElementById("searchUsers"),j=document.getElementById("searchResult");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const n=await async function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0,u=arguments.length>3?arguments[3]:void 0;return new Promise(((c,m)=>{const v=i("user");if((0,r.isEmpty)(v))p(o,a,u),c(!1);else{const i=JSON.parse(v);if((0,r.isEmpty)(i.id)||(0,r.isEmpty)(i.token)||(0,r.isEmpty)(i.duration)||i.duration
"+k.replace("NB_DAYS",t):"
dd"+y}o(I,"p",a,"",["info"],"",!1)}else o(I,"p",S,"",["error"]),w.style.display="block";P.style.display="block";const u=new XMLHttpRequest;if(u.open("GET",e.apiUrl+v.getPayments+n.User.id),u.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);if(200===this.status&&0!==e.length){let t="";for(let n in e){const i={DATE_PAYMENT:(0,r.dateFormat)(e[n].createdAt,"fr"),AMOUNT:e[n].amount,CLIENT_NAME:e[n].clientName};t+="
","",["info"],"",!1),z.style.display="block")}},i.setRequestHeader("Authorization","Bearer "+t.token),i.send()}let l="";const c=new XMLHttpRequest;c.open("GET",e.apiUrl+v.userRoutes+v.getGodChilds+i),c.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);if(200===this.status&&0!==e.length){l+=f.replace("#NB",e.length);for(let t in e)l+=""+e[t].name+"";o(z,"p",l+".","",["info"],"",!1),z.style.display="block"}}},c.setRequestHeader("Authorization","Bearer "+t.token),c.send()}}},s.setRequestHeader("Authorization","Bearer "+t.token),s.send()};let c=(()=>{if((0,r.isEmpty)(location.search))return!1;const e=location.search.substring(1).split("&");if(!Array.isArray(e)||0===e.length)return!1;let t,n={};for(let i in e)t=e[i].split("="),2===t.length&&(n[t[0]]=decodeURI(t[1]));return n})();c&&void 0!==c.id&&l(c.id),B.addEventListener("click",(function(e){n()})),D.addEventListener("submit",(function(i){i.preventDefault(),U.innerHTML="";let s=u(D);s.receiptDays="";for(let e=1;e<=7;e++)void 0!==s["d"+e]&&(s.receiptDays+=""+e);const a=new XMLHttpRequest;(0,r.isEmpty)(s.id)||void 0===s.deleteOk?(0,r.isEmpty)(s.id)||void 0===s.validationOk?(0,r.isEmpty)(s.id)?(s.password=(0,r.getPassword)(v.password.minlength,v.password.minlength+2),a.open("POST",e.apiUrl+v.userRoutes+v.createUserRoute)):a.open("PUT",e.apiUrl+v.userRoutes+v.updateUserInfos+s.id):a.open("POST",e.apiUrl+v.userRoutes+v.validateUserRoute+s.id):a.open("DELETE",e.apiUrl+v.userRoutes+"/"+s.id),a.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);201===this.status&&null!=e.id?(o(U,"p",h,"",["success"]),s.id=e.id):200===this.status&&null!=e.message?(Array.isArray(e.message)?e.message=e.message.join("
"):e.message=e.message,o(U,"p",e.message,"",["success"])):e.errors?(Array.isArray(e.errors)?e.errors=e.errors.join("
"):e.errors=b,o(U,"p",e.errors,"",["error"])):o(U,"p",b,"",["error"]),(0,r.isEmpty)(e.errors)&&(void 0===s.deleteOk?l(s.id):n())}},a.setRequestHeader("Content-Type","application/json"),a.setRequestHeader("Authorization","Bearer "+t.token),s&&a.send(JSON.stringify(s))})),O.addEventListener("submit",(function(n){n.preventDefault();let i=u(O);const s=new XMLHttpRequest;s.open("POST",e.apiUrl+v.userRoutes+v.searchUserRoute),s.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let e=JSON.parse(this.responseText);if(200===this.status&&Array.isArray(e))if(0===e.length)o(j,"p",T,"",["info"]);else{let t="";for(let n in e)t+="";o(j,"select",t,"selectSearch");const n=document.getElementById("selectSearch");n.addEventListener("change",(function(){""!==n.value&&l(n.value)}))}else o(j,"p",b,"",["error"])}},s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("Authorization","Bearer "+t.token),i&&s.send(JSON.stringify(i))}))}}catch(e){o(A,"p",b,"",["error"]),console.error(e)}})()}()}();
\ No newline at end of file
diff --git a/front/public/JS/newLoginValidation.app.js b/front/public/JS/newLoginValidation.app.js
index 90a6ccb..a92ba38 100644
--- a/front/public/JS/newLoginValidation.app.js
+++ b/front/public/JS/newLoginValidation.app.js
@@ -1,263 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/newLoginValidation.js":
-/*!***********************************!*\
- !*** ./src/newLoginValidation.js ***!
- \***********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ \"./src/tools/dom.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ \"./src/tools/url.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n// -- PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE\n/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.\n/// Si le token est ok, on valide la mise à jour et redirige l'utilisateur vers sa page d'accueil\n// Fichier de configuration côté client :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst {\n accountPage,\n userHomePage\n} = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\nconst {\n checkNewLoginLinkRoute,\n userRoutes\n} = __webpack_require__(/*! ../../config/users */ \"../config/users.js\"); // Importation des fonctions utile au script :\n\n\n\n\n\n\n // Dictionnaires :\n\nconst {\n serverError\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/general$\")(\"./\" + lang + \"/general\");\n\nconst {\n badLinkValidationMessage\n} = __webpack_require__(\"../lang sync recursive ^\\\\.\\\\/.*\\\\/user$\")(\"./\" + lang + \"/user\");\n\nconst divResponse = document.getElementById(\"response\");\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__.helloDev)();\n\nconst initialise = async () => {\n try {\n const datas = (0,_tools_url_js__WEBPACK_IMPORTED_MODULE_4__.getUrlParams)();\n\n if (datas && datas.t !== undefined) {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + userRoutes + checkNewLoginLinkRoute + datas.t);\n\n xhr.onreadystatechange = function () {\n if (this.readyState == XMLHttpRequest.DONE) {\n let response = JSON.parse(this.responseText);\n\n if (this.status === 200 && response.message != undefined) {\n (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.saveLocaly)(\"message\", {\n message: response.message,\n color: \"success\"\n }); // pour l'afficher sur la page suivante\n\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.message, \"\", [\"success\"]); // au cas où blocage redirection\n\n window.location.assign(\"/\" + userHomePage); // que user possible ici\n } else if (this.status === 404 && response.errors != undefined) {\n if (Array.isArray(response.errors)) response.errors = response.errors.join(\"
\");else response.errors = serverError;\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", response.errors, \"\", [\"error\"]);\n } else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", badLinkValidationMessage.replace(\"#URL\", accountPage), \"\", [\"error\"]);\n }\n };\n\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + datas.t);\n xhr.send();\n }\n } catch (e) {\n (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__.addElement)(divResponse, \"p\", serverError, \"\", [\"error\"]);\n console.error(e);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/newLoginValidation.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/dom.js":
-/*!**************************!*\
- !*** ./src/tools/dom.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElement\": function() { return /* binding */ addElement; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction associant les attributs fournis à un champ de formulaire\n\nconst addElement = function (eltParent, eltType) {\n let eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n let eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {\n const newElement = document.createElement(eltType);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?\n newElement.id = eltId;\n\n if (Array.isArray(eltClass) && eltClass.length != 0) {\n for (let i in eltClass) newElement.classList.add(eltClass[i]);\n }\n\n if (typeof eltAttributes === \"object\") // !! tous les objets ne sont pas ok\n {\n for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);\n }\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\\n/g, \"
\"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.\n\n if (replace) eltParent.innerHTML = \"\";\n eltParent.appendChild(newElement);\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/dom.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/url.js":
-/*!**************************!*\
- !*** ./src/tools/url.js ***!
- \**************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getUrlParams\": function() { return /* binding */ getUrlParams; }\n/* harmony export */ });\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction récupérant les paramètres passés par l'url\n\nconst getUrlParams = () => {\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(location.search)) return false;\n const parameters = location.search.substring(1).split(\"&\");\n if (!Array.isArray(parameters) || parameters.length === 0) return false;\n let param,\n datas = {};\n\n for (let i in parameters) {\n param = parameters[i].split(\"=\");\n if (param.length === 2) datas[param[0]] = decodeURI(param[1]);\n }\n\n return datas;\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/url.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/general.js":
-/*!*****************************!*\
- !*** ../lang/fr/general.js ***!
- \*****************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n addBtnTxt: \"Ajouter\",\n addOkMessage: \"Les données ont bien été enregistrées.\",\n alertNewWindow: \"nouvelle fenêtre\",\n badUrl: \"Tentative d'accès à une page n'existant pas :\",\n btnLinkToQuestionnaire: \"Afficher !\",\n btnProposeConnection: \"Je me connecte.\",\n btnProposeSubscribe: \"Je crée mon compte.\",\n btnShowOnWebSite: \"Lire la suite sur #SITE_NAME\",\n deleteBtnTxt: \"Supprimer\",\n deleteFailMessage: \"La suppression de l'enregistrement #ID a échoué.\",\n deleteOkMessage: \"La suppression a bien été enregistrée.\",\n failAuth: \"Erreur d'authentification.\",\n failAuthCron: \"Tentative de lancement d'un cron sans le bon token.\",\n failAuthHeader: \"Absence de header Authorization.\",\n failAuthId: \"Identifiant non valide : \",\n failAuthToken: \"Token invalide ou utilisateur non trouvé.\",\n neededParams: \"Des paramètres nécessaires manquants sont manquants.\",\n nextPage: \"Page suivante\",\n notAllowed: \"Vous n'avez pas les droits nécessaires pour cette action.\",\n notRequired: \"Facultatif.\",\n notValidFormat: \"Format non valide.\",\n previousPage: \"Page précédente\",\n serverError: \"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.\",\n serverErrorAdmin: \"Bug de l'application :\",\n siteHTMLTitle: \"WikiLerni : la culture générale en liberté\",\n siteMetaDescription: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.\",\n scriptTimingAlert: \"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n scriptTimingInfo: \"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL\",\n statsAdmin: \"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.\",\n subscriptionCall: \"Inscrivez-vous !\",\n updateBtnTxt: \"Modifier\",\n updateOkMessage: \"La mise à jour à jour a bien été enregistrée.\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/general.js?");
-
-/***/ }),
-
-/***/ "../lang/fr/user.js":
-/*!**************************!*\
- !*** ../lang/fr/user.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n alreadyConnected: \"Vous êtes déjà connecté au site !\",\n badLinkValidationMessage: \"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.\",\n badPassword: \"Aucun compte utilisateur ne correspond aux informations saisies.\",\n byebyeMessage: \"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !\",\n connectionOk: \"Connexion réussie.\",\n creationOkMessage: \"Le nouvel utilisateur a bien été enregistré.\",\n cronDeleteUnvalidedUsersMessage: \" comptes utilisateurs non validés ont été supprimés.\",\n deleteFailMessage: \"Tentative de suppression d'un utilisateur inexistant : \",\n deleteInactiveUsersMessage: \" comptes utilisateurs inactifs ont été supprimés.\",\n deleteOkMessage: \"L'utilisateur a bien été supprimé.\",\n emailNotFound: \"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.\",\n failBotTest: \"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.\",\n failBotTestLog: \"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : \",\n formsEmailLabel: \"E-mail :\",\n formsEmailPlaceholder: \"Votre adresse e-mail\",\n formsEmail2Placeholder: \"Si vous voyez ce champ, laissez-le vide\",\n //champ qui ne devrait pas être visible par des humains\n formsCGUOkLabel: \"J'accepte les Conditions Générale d'Utilisation du site (requis).\",\n formsSubmitTxt: \"Je m'abonne !\",\n godfatherFound: \"Votre \\\"parrain\\\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.\",\n godfatherNotFound: \"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(\",\n infosAdminGodfather: \"Cet utilisateur a été parrainé par \",\n infosAdminNbGodChilds: \"Ses #NB filleuls : \",\n infosUserForAdmin: \"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.\",\n infosUserNbGodChilds: \"Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \\\"parrain\\\" : \",\n infosUserNoGodchilds: \"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \\\"parrain\\\".\",\n mailDeleteBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.\",\n mailUpdateLoginLinkTxt: \"Valider.\",\n mailUpdateLoginOkMessage: \"La mise à jour de vos identifiants a bien été enregistrée.\",\n mailUpdateLoginSubject: \"Merci de valider vos nouveaux identifiants.\",\n mailValidationLinkSBodyHTML: \"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.\",\n mailWelcomeBodyTxt: \"Bonjour USER_NAME,\\n\\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\\n\\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\\n\\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \\\"spam\\\".\\n\\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\\n\\nPour ce faire, utilisez le lien suivant : LINK_URL\\n\\nÀ bientôt sur NOM_SITE.\",\n mailWelcomeLinkTxt: \"Me connecter à mon compte.\",\n mailWelcomeSubject: \"Bienvenue !\",\n needBeConnected: \"Vous devez être connecté pour accéder à cette page.\",\n needChooseLoginWay: \"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.\",\n needEmail: \"Merci de saisir votre adresse e-mail.\",\n needKnowNewsletterOk: \"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.\",\n needLanguage: \"Il manque le code langue.\",\n needLongPassWord: \"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.\",\n needMaxTimeDifference: \"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.\",\n needMinTimeDifference: \"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.\",\n needName: \"Merci de choisir un nom d'utilisateur.\",\n needNotTooLongName: \"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.\",\n needNotTooLongEmail: \"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.\",\n needPassWord: \"Merci de fournir un mot de passe.\",\n needSMTP: \"Il manque le serveur SMTP.\",\n needSMTPNotFound: \"Il manque un serveur SMTP valide.\",\n needStatus: \"Il manque le statut.\",\n needTimeDifference: \"Il faut connaître le nombre de minutes du décalage horaire.\",\n needUGCOk: \"Merci d'accepter les CGU pour créer votre compte.\",\n needUniqueEmail: \"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.\",\n needValidationToLogin: \"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.\",\n needValidLastConnectionDate: \"La date de dernière connexion n'est pas valide.\",\n passwordCopied: \"Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \\\"coller\\\" où vous le souhaitez.\",\n searchUsersWithoutResult: \"L'utilisateur n'a pas été trouvé.\",\n tooManyLoginFails: \"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.\",\n updatedFailedGodfatherNotFound: \"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.\",\n updatedNeedGoodEmail: \"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.\",\n updatedNeedGoodGodfather: \"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.\",\n updatedNeedUniqueEmail: \"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.\",\n updatedNeedValidatedUser: \"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.\",\n updatedOkMessage: \"Vos informations ont bien été mises à jour.\",\n validationAlreadyMessage: \"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.\",\n validationAlreadyMessageAdmin: \"Ce compte a déjà été validé.\",\n validationMessage: \"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.\",\n validationMessageAdmin: \"Le compte a bien été validé.\",\n welcomeMessage: \"Bienvenue #NAME !\"\n};\n\n//# sourceURL=webpack://wikilerni/../lang/fr/user.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},1494:function(e){e.exports={alreadyConnected:"Vous êtes déjà connecté au site !",badLinkValidationMessage:"Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",badPassword:"Aucun compte utilisateur ne correspond aux informations saisies.",byebyeMessage:"Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !",connectionOk:"Connexion réussie.",creationOkMessage:"Le nouvel utilisateur a bien été enregistré.",cronDeleteUnvalidedUsersMessage:" comptes utilisateurs non validés ont été supprimés.",deleteFailMessage:"Tentative de suppression d'un utilisateur inexistant : ",deleteInactiveUsersMessage:" comptes utilisateurs inactifs ont été supprimés.",deleteOkMessage:"L'utilisateur a bien été supprimé.",emailNotFound:"Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",failBotTest:"Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",failBotTestLog:"Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",formsEmailLabel:"E-mail :",formsEmailPlaceholder:"Votre adresse e-mail",formsEmail2Placeholder:"Si vous voyez ce champ, laissez-le vide",formsCGUOkLabel:'J\'accepte les Conditions Générale d\'Utilisation du site (requis).',formsSubmitTxt:"Je m'abonne !",godfatherFound:'Votre "parrain" a bien été trouvé. Cette personne sera avertie que vous l\'avez désignée.',godfatherNotFound:"Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",infosAdminGodfather:"Cet utilisateur a été parrainé par ",infosAdminNbGodChilds:"Ses #NB filleuls : ",infosUserForAdmin:"Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.",infosUserNbGodChilds:'Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme "parrain" : ',infosUserNoGodchilds:"Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",mailDeleteBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Bonjour USER_NAME,
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.Bonjour USER_NAME,
En attendant, merci de continuer à utiliser vos anciens identifiants.",mailUpdateLoginLinkTxt:"Valider.",mailUpdateLoginOkMessage:"La mise à jour de vos identifiants a bien été enregistrée.",mailUpdateLoginSubject:"Merci de valider vos nouveaux identifiants.",mailValidationLinkSBodyHTML:"Bonjour USER_NAME,
Bonjour USER_NAME,
Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.
Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en spam.
Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.
Pour ce faire, utilisez le lien ci-dessous.
À bientôt sur NOM_SITE.",mailWelcomeBodyTxt:"Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",mailWelcomeLinkTxt:"Me connecter à mon compte.",mailWelcomeSubject:"Bienvenue !",needBeConnected:"Vous devez être connecté pour accéder à cette page.",needChooseLoginWay:"Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",needEmail:"Merci de saisir votre adresse e-mail.",needKnowNewsletterOk:"Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",needLanguage:"Il manque le code langue.",needLongPassWord:"Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",needMaxTimeDifference:"Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",needMinTimeDifference:"Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",needName:"Merci de choisir un nom d'utilisateur.",needNotTooLongName:"Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",needNotTooLongEmail:"Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",needPassWord:"Merci de fournir un mot de passe.",needSMTP:"Il manque le serveur SMTP.",needSMTPNotFound:"Il manque un serveur SMTP valide.",needStatus:"Il manque le statut.",needTimeDifference:"Il faut connaître le nombre de minutes du décalage horaire.",needUGCOk:"Merci d'accepter les CGU pour créer votre compte.",needUniqueEmail:"L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.",needValidationToLogin:"Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",needValidLastConnectionDate:"La date de dernière connexion n'est pas valide.",passwordCopied:'Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le "coller" où vous le souhaitez.',searchUsersWithoutResult:"L'utilisateur n'a pas été trouvé.",tooManyLoginFails:"Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",updatedFailedGodfatherNotFound:"L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",updatedNeedGoodEmail:"Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",updatedNeedGoodGodfather:"Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",updatedNeedUniqueEmail:"Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",updatedNeedValidatedUser:"L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",updatedOkMessage:"Vos informations ont bien été mises à jour.",validationAlreadyMessage:"Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter en cliquant ici.",validationAlreadyMessageAdmin:"Ce compte a déjà été validé.",validationMessage:"Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez compléter les informations de votre abonnement ci-dessous.",validationMessageAdmin:"Le compte a bien été validé.",welcomeMessage:"Bienvenue #NAME !"}},9864:function(e){class i{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return i.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,i){return(e+="").length>i&&(e=e.substring(0,i-3)+"…"),e}static replaceAll(e,i){const n=new RegExp(Object.keys(i).join("|"),"gi");return e.replace(n,(e=>i[e]))}static getRandomInt(e,i){return e=Math.ceil(e),i=Math.floor(i),Math.floor(Math.random()*(i-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(i.isEmpty(e))return"";let t=new Date(e),r=t.getDate()+"";1===r.length&&(r="0"+r);let s=t.getMonth()+1+"";1===s.length&&(s="0"+s);let o=t.getFullYear();return"fr"===n?r+"/"+s+"/"+o:"form"===n?o+"-"+s+"-"+r:s+"/"+r+"/"+o}static getPassword(e,i){const n=e+Math.floor(Math.random()*(i-e)),t="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",r="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let s=t[Math.floor(Math.random()*t.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};n(671);const r=e.availableLangs[0],s=(n(9729)("./"+e.theme+"/config/"+r+".js"),e.availableLangs[0]),{accountPage:o,userHomePage:a}=n(9729)("./"+e.theme+"/config/"+s+".js"),{checkNewLoginLinkRoute:u,userRoutes:l}=n(671),{serverError:c}=n(2111)("./"+s+"/general"),{badLinkValidationMessage:d}=n(176)("./"+s+"/user"),m=document.getElementById("response");console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"),(async()=>{try{const n=(()=>{if((0,i.isEmpty)(location.search))return!1;const e=location.search.substring(1).split("&");if(!Array.isArray(e)||0===e.length)return!1;let n,t={};for(let i in e)n=e[i].split("="),2===n.length&&(t[n[0]]=decodeURI(n[1]));return t})();if(n&&void 0!==n.t){const i=new XMLHttpRequest;i.open("GET",e.apiUrl+l+u+n.t),i.onreadystatechange=function(){if(this.readyState==XMLHttpRequest.DONE){let i=JSON.parse(this.responseText);200===this.status&&null!=i.message?("message",e={message:i.message,color:"success"},localStorage.setItem("message",JSON.stringify(e)),t(m,"p",i.message,"",["success"]),window.location.assign("/"+a)):404===this.status&&null!=i.errors?(Array.isArray(i.errors)?i.errors=i.errors.join("
"):i.errors=c,t(m,"p",i.errors,"",["error"])):t(m,"p",d.replace("#URL",o),"",["error"])}var e},i.setRequestHeader("Authorization","Bearer "+n.t),i.send()}}catch(e){t(m,"p",c,"",["error"]),console.error(e)}})()}()}();
\ No newline at end of file
diff --git a/front/public/JS/paymentPage.app.js b/front/public/JS/paymentPage.app.js
index 97f7df3..e135c2a 100644
--- a/front/public/JS/paymentPage.app.js
+++ b/front/public/JS/paymentPage.app.js
@@ -1,233 +1 @@
-/*
- * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
- * This devtool is neither made for production nor for readable output files.
- * It uses "eval()" calls to create a separate source file in the browser devtools.
- * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
- * or disable the default devtool with "devtool: false".
- * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
- */
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "../config/instance.js":
-/*!*****************************!*\
- !*** ../config/instance.js ***!
- \*****************************/
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-eval("const users = __webpack_require__(/*! ./users */ \"../config/users.js\");\n\nconst questionnaires = __webpack_require__(/*! ./questionnaires */ \"../config/questionnaires.js\");\n\nmodule.exports = {\n apiUrl: \"http://localhost:3000/api\",\n siteUrl: \"http://localhost:8080\",\n adminName: \"Fabrice\",\n adminEmail: \"dev@wikilerni.com\",\n senderName: \"WikiLerni (local)\",\n senderEmail: \"bonjour@wikilerni.com\",\n adminLang: \"fr\",\n theme: \"wikilerni\",\n // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.\n availableLangs: [\"fr\"],\n // Languages in which the site is available. The first one is the default one.\n siteName: \"WikiLerni (local)\",\n beginCodeGodfather: \"WL\",\n // case-sensitive and can't contain \"@\" !\n defaultReceiptDays: \"147\",\n // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)\n cronTimingAlertInSeconde: 120,\n // for logs\n responseTimingAlertInSeconde: 3,\n // idem\n tokenSignupValidationTimeInHours: \"48h\",\n // https://github.com/zeit/ms\n tokenLoginLinkTimeInHours: \"1h\",\n tokenConnexionMinTimeInHours: \"24h\",\n tokenConnexionMaxTimeInDays: \"180 days\",\n tokenLoginChangingTimeInHours: \"1h\",\n // for email & password changing\n tokenDeleteUserTimeInHours: \"1h\",\n tokenUnsubscribeLinkTimeInDays: \"7 days\",\n // token send with subscription's emails\n freeAccountTimingInDays: 0,\n // if 0 = unlimited\n freeAccountExpirationNotificationInDays: 3,\n accountExpirationFirstNotificationInDays: 10,\n accountExpirationSecondNotificationInDays: 3,\n inactiveAccountTimeToDeleteInDays: 180,\n // Questionnaires:\n nbQuestionsMin: 1,\n // minimum number of questions for the questionnaire to be publishable\n nbQuestionsMax: 2,\n // if 0 = not maximum\n nbChoicesMax: 10,\n nbNewQuestionnaires: 12,\n // for RSS, etc.\n hourGiveNewQuestionnaireBegin: 7,\n // in user local time\n hourGiveNewQuestionnaireEnd: 21,\n // idem\n maxQuestionnaireSendedAtSameTime: 50,\n // for subscription's e-mailing\n minSearchQuestionnaires: 3,\n fieldNewQuestionnaires: \"publishingAt\",\n // field to be used to create the list of the last questionnaires, can be \"createdAt\", \"updatedAt\" or \"publishingAt\"\n // Groups :\n nbQuestionnairesByGroupMin: 1,\n nbQuestionnairesByGroupMax: 0,\n // Illustrations:\n nbIllustrationsMin: 1,\n nbIllustrationsMax: 1,\n maxIllustrationSizeinOctet: 1000000,\n // pas contrôlé pour l'instant. À revoir.\n mimeTypesForIllustration: [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/gif\", \"image/png\"],\n // -- Upload and resize:\n illustrationsWidthMaxInPx: 500,\n illustrationsMiniaturesWidthMaxInPx: 200,\n // Links:\n nbLinksMin: 1,\n nbLinksMax: 0,\n // Questions & responses:\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n // à supprimer quand tous les \"require\" à jour:\n passwordMinLength: users.password.minlength,\n dirCacheUsers: users.dirCacheUsers,\n dirCacheUsersAnswers: users.dirCacheUsersAnswers,\n dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,\n dirCacheQuestions: questionnaires.dirCacheQuestions,\n dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,\n dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,\n dirWebQuestionnaires: questionnaires.dirWebQuestionnaires\n};\n\n//# sourceURL=webpack://wikilerni/../config/instance.js?");
-
-/***/ }),
-
-/***/ "../config/matomo.js":
-/*!***************************!*\
- !*** ../config/matomo.js ***!
- \***************************/
-/***/ (function(module) {
-
-eval("// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.\n// Revoir comment réorganiser cela sous-forme de module indépendant.\nmodule.exports = {\n // Stats Matomo :\n matomo: {\n url: \"https://stats.le-fab-lab.com/\",\n siteId: \"5\"\n }\n};\n\n//# sourceURL=webpack://wikilerni/../config/matomo.js?");
-
-/***/ }),
-
-/***/ "../config/questionnaires.js":
-/*!***********************************!*\
- !*** ../config/questionnaires.js ***!
- \***********************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n questionnaireRoutes: \"/questionnaire\",\n // la base à laquelle s'ajoute les routes suivantes\n getListNextQuestionnaires: \"/getlistnextquestionnaires/\",\n getQuestionnaireRoutes: \"/get\",\n getRandomQuestionnairesRoute: \"/getrandom\",\n getStatsQuestionnaires: \"/stats/\",\n previewQuestionnaireRoutes: \"/preview\",\n publishedQuestionnaireRoutes: \"/quiz/\",\n regenerateHTML: \"/htmlregenerated\",\n searchAdminQuestionnairesRoute: \"/searchadmin\",\n searchQuestionnairesRoute: \"/search\",\n // -- groupes :\n groupRoutes: \"/group\",\n getGroupRoute: \"/get/\",\n previewGroupRoutes: \"/preview\",\n searchGroupsRoute: \"/search\",\n // -- questions & choices :\n questionsRoute: \"/question/\",\n // -- tags :\n tagsSearchRoute: \"/tags/search/\",\n // -- answers :\n getAdminStats: \"/getadminstats/\",\n getPreviousAnswers: \"/user/answers/\",\n getStatsAnswers: \"/user/anwswers/stats/\",\n // fonctionne aussi pour les groupes\n saveAnswersRoute: \"/answer/\",\n // idem\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n Questionnaire: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n },\n // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n introduction: {\n required: true\n }\n },\n searchQuestionnaires: {\n minlength: 3,\n required: true\n },\n Group: {\n title: {\n maxlength: 255,\n required: true\n },\n slug: {\n maxlength: 150\n } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire\n\n },\n Question: {\n text: {\n maxlength: 255,\n required: true\n },\n rank: {\n required: true,\n min: 1,\n defaultValue: 1\n }\n },\n Choice: {\n text: {\n maxlength: 255,\n required: true\n }\n },\n search: {\n minlength: 3,\n required: true\n },\n searchGroups: {\n minlength: 3,\n required: true\n },\n // Emplacement des fichiers JSON générés :\n dirCacheGroups: \"datas/questionnaires/groups\",\n dirCacheQuestionnaires: \"datas/questionnaires\",\n dirCacheQuestions: \"datas/questionnaires/questions\",\n dirCacheTags: \"datas/questionnaires/tags\",\n dirCacheUsersQuestionnaires: \"datas/users/questionnaires\",\n // Emplacement des fichiers HTML générés :\n dirHTMLGroups: \"front/public/quiz/gp\",\n dirHTMLQuestionnaires: \"front/public/quiz\",\n dirHTMLNews: \"front/public/quizs\",\n dirHTMLTags: \"front/public/quizs\",\n // Idem mais pour urls :\n dirWebGroups: \"quiz/gp\",\n dirWebQuestionnaires: \"quiz\",\n dirWebNews: \"quizs/\",\n dirWebTags: \"quizs/\",\n // limite des résultat du moteur de recherche, quand demande de résultats au hasard :\n nbRandomResults: 3,\n\n /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */\n nbQuestionsMin: 1,\n nbQuestionsMax: 0,\n nbChoicesMax: 10,\n nbTagsMin: 0,\n nbTagsMax: 0 // 0 = not max \n\n};\n\n//# sourceURL=webpack://wikilerni/../config/questionnaires.js?");
-
-/***/ }),
-
-/***/ "../config/users.js":
-/*!**************************!*\
- !*** ../config/users.js ***!
- \**************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // API'routes (after \"apiUrl\" defined in instance.js)\n userRoutes: \"/user\",\n checkDeleteLinkRoute: \"/confirmdelete/\",\n checkIfIsEmailfreeRoute: \"/isemailfree\",\n checkLoginRoute: \"/checklogin/\",\n checkNewLoginLinkRoute: \"/confirmnewlogin/\",\n checkSubscribeTokenRoute: \"/validation/\",\n connectionRoute: \"/login\",\n connectionWithLinkRoute: \"/checkloginlink\",\n createUserRoute: \"/create\",\n getAdminStats: \"/getadminstats/\",\n getGodChilds: \"/getgodchilds/\",\n getGodfatherRoute: \"/getgodfatherid\",\n getLoginLinkRoute: \"/getloginlink\",\n getPayments: \"/payment/getforoneuser/\",\n getUserInfos: \"/get/\",\n getUsersQuestionnairesRoute: \"/getusersquestionnaires/\",\n // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement \n searchUserRoute: \"/search/\",\n signupCompletionRoute: \"/signupcompletion/\",\n subscribeRoute: \"/signup\",\n unsubscribeRoute: \"/subscription/stop/\",\n updateUserInfos: \"/modify/\",\n validateUserRoute: \"/validate/\",\n // forms : à compléter avec valeurs par défaut, etc. cf modèle\n name: {\n maxlength: 70,\n required: true\n },\n email: {\n maxlength: 255,\n required: true\n },\n password: {\n minlength: 8,\n maxlength: 72,\n required: true\n },\n // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns\n newPassword: {\n minlength: 8,\n maxlength: 72\n },\n codeGodfather: {\n maxlength: 255\n },\n cguOk: {\n value: \"true\",\n required: true\n },\n search: {\n minlength: 1,\n required: true\n },\n timeDifferenceMin: -720,\n timeDifferenceMax: 840,\n // JSON dir\n dirCacheUsers: \"datas/users\",\n dirCacheUsersAnswers: \"datas/users/questionnaires/answers\",\n dirCacheUsersWithoutAnswers: \"datas/users/questionnaires/without\"\n};\n\n//# sourceURL=webpack://wikilerni/../config/users.js?");
-
-/***/ }),
-
-/***/ "./src/paymentPage.js":
-/*!****************************!*\
- !*** ./src/paymentPage.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ \"./src/tools/everywhere.js\");\n/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/matomo.js */ \"./src/tools/matomo.js\");\n/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/users.js */ \"./src/tools/users.js\");\n/* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/webportage.js */ \"./src/tools/webportage.js\");\n// -- GESTION DE LA PAGE DU FINANCEMENT PARTICIPATIF (SANS DEVOIR ÊTRE CONNECTÉ)\n/// Permet d'afficher les boutons de paiement WP suivant le choix de l'utilisateur.\n/// Matomo est également activé si l'internaute n'est pas connecté.\n// Fichier de configuration tirés du backend :\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\"); // Fonctions utiles au script :\n\n\n\n\n\n\n\n(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__.helloDev)();\n\nconst initialise = async () => {\n try {\n const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_4__.checkSession)();\n\n if (isConnected) {\n // on change le lien du compte en haut :\n const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)(\"user\", true);\n (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__.updateAccountLink)(user.status, configTemplate);\n } else (0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__.loadMatomo)(); // Les boutons de paiement WP : \n\n\n const CGV = document.getElementById(\"CGVOk\");\n const abo1 = document.getElementById(\"abo1\");\n const abo2 = document.getElementById(\"abo2\");\n const abo3 = document.getElementById(\"abo3\");\n const abo4 = document.getElementById(\"abo4\");\n const divWPBtns = document.getElementById(\"WPBtns\");\n divWPBtns.style.display = \"none\";\n abo1.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)(\"abo1\");\n });\n abo2.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)(\"abo2\");\n });\n abo3.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)(\"abo3\");\n });\n abo4.addEventListener(\"change\", function (e) {\n (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)(\"abo4\");\n });\n CGV.addEventListener(\"change\", function (e) {\n if (CGV.checked === true) {\n divWPBtns.style.display = \"block\";\n if (abo1.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)(\"btn1\");else if (abo2.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)(\"btn2\");else if (abo3.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)(\"btn3\");else if (abo4.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)(\"btn4\");else {\n divWPBtns.style.display = \"none\";\n CGV.checked = false;\n }\n } else divWPBtns.style.display = \"none\";\n });\n } catch (e) {\n console.error(e);\n }\n};\n\ninitialise();\n\n//# sourceURL=webpack://wikilerni/./src/paymentPage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/clientstorage.js":
-/*!************************************!*\
- !*** ./src/tools/clientstorage.js ***!
- \************************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"saveLocaly\": function() { return /* binding */ saveLocaly; },\n/* harmony export */ \"getLocaly\": function() { return /* binding */ getLocaly; },\n/* harmony export */ \"removeLocaly\": function() { return /* binding */ removeLocaly; }\n/* harmony export */ });\n// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)\n// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie\nconst saveLocaly = (name, data) => {\n localStorage.setItem(name, JSON.stringify(data));\n};\nconst getLocaly = function (name) {\n let json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);\n};\nconst removeLocaly = name => {\n localStorage.removeItem(name);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/clientstorage.js?");
-
-/***/ }),
-
-/***/ "./src/tools/everywhere.js":
-/*!*********************************!*\
- !*** ./src/tools/everywhere.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"helloDev\": function() { return /* binding */ helloDev; },\n/* harmony export */ \"updateAccountLink\": function() { return /* binding */ updateAccountLink; }\n/* harmony export */ });\n// Ce script fournit des fonctions utilisées sur toutes les pages du site\nconst helloDev = () => {\n console.log(\"**** Hello ami développeur :-)\\n\\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\\n\\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****\");\n return true;\n};\nconst updateAccountLink = (status, configTemplate) => {\n const link = document.getElementById(\"accountHeadLink\");\n const homePage = status + \"HomePage\";\n link.href = \"/\" + configTemplate[homePage];\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/everywhere.js?");
-
-/***/ }),
-
-/***/ "./src/tools/matomo.js":
-/*!*****************************!*\
- !*** ./src/tools/matomo.js ***!
- \*****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"loadMatomo\": function() { return /* binding */ loadMatomo; }\n/* harmony export */ });\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ \"../config/matomo.js\");\n/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);\n // Fonction chargeant le code matomo\n\nconst loadMatomo = () => {\n // chargement de matomo\n var _paq = window._paq = window._paq || []; //ajout cnil :\n\n\n _paq.push([function () {\n var self = this;\n\n function getOriginalVisitorCookieTimeout() {\n var now = new Date(),\n nowTs = Math.round(now.getTime() / 1000),\n visitorInfo = self.getVisitorInfo();\n var createTs = parseInt(visitorInfo[2]);\n var cookieTimeout = 33696000; // 13 mois en secondes\n\n var originalTimeout = createTs + cookieTimeout - nowTs;\n return originalTimeout;\n }\n\n this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());\n }]); //--fin ajout cnil\n\n\n _paq.push(['trackPageView']);\n\n _paq.push(['enableLinkTracking']);\n\n (function () {\n var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;\n\n _paq.push(['setTrackerUrl', u + 'matomo.php']);\n\n _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);\n\n var d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\n g.type = 'text/javascript';\n g.async = true;\n g.src = u + 'matomo.js';\n s.parentNode.insertBefore(g, s);\n })();\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/matomo.js?");
-
-/***/ }),
-
-/***/ "./src/tools/users.js":
-/*!****************************!*\
- !*** ./src/tools/users.js ***!
- \****************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTimeDifference\": function() { return /* binding */ getTimeDifference; },\n/* harmony export */ \"setSession\": function() { return /* binding */ setSession; },\n/* harmony export */ \"checkAnswerDatas\": function() { return /* binding */ checkAnswerDatas; },\n/* harmony export */ \"checkSession\": function() { return /* binding */ checkSession; }\n/* harmony export */ });\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ \"../config/instance.js\");\n/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ \"../config/users.js\");\n/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ \"./src/tools/clientstorage.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ \"../tools/main.js\");\n/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);\n\nconst lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];\n\nconst configTemplate = __webpack_require__(\"../views sync recursive ^\\\\.\\\\/.*\\\\.js$\")(\"./\" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + \"/config/\" + lang + \".js\");\n\n\n\n\nconst getTimeDifference = () => {\n // multiplier par -1, car c'est ce qu'il faut \"ajouter\" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse\n const timeLocal = new Date().getTimezoneOffset() * -1;\n if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;\n}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite\n// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.\n\nconst setSession = (userId, token, durationTS) => {\n const storageUser = {\n id: userId,\n token: token,\n duration: durationTS\n };\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", storageUser);\n}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs\n// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas\n\nconst checkAnswerDatas = datas => {\n const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"lastAnswer\");\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {\n const answer = JSON.parse(lastAnswer);\n\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {\n datas.duration = answer.duration;\n datas.nbCorrectAnswers = answer.nbCorrectAnswers;\n datas.nbQuestions = answer.nbQuestions;\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;\n }\n }\n\n return datas;\n}; // Cette fonction teste la connexion de l'utilisateur d'une page\n// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté\n\nconst checkSession = async function () {\n let status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n let urlRedirection = arguments.length > 1 ? arguments[1] : undefined;\n let message = arguments.length > 2 ? arguments[2] : undefined;\n let urlWanted = arguments.length > 3 ? arguments[3] : undefined;\n return new Promise((resolve, reject) => {\n const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)(\"user\");\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const user = JSON.parse(userDatas);\n\n if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);\n\n xhr.onload = () => {\n let response = JSON.parse(xhr.responseText);\n\n if (xhr.status === 200 && response.isValid && response.id != undefined) {\n if (response.id === user.id) {\n user.name = response.name;\n user.language = response.language;\n user.timeDifference = response.timeDifference;\n user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API\n\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"user\", user); // si il s'agit d'un \"user\" et que son abonnement a expiré, je le redirige vers la caisse :-)\n\n if (response.status === \"user\" && response.nbDaysOk <= 0) {\n const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + \"/\" + configTemplate.accountPage;\n if (window.location.href.indexOf(urlAccount) === -1) window.location.assign(\"/\" + configTemplate.accountPage + \"#subscribe\"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?\n\n resolve(true);\n } else {\n if (status.length !== 0 && status.indexOf(response.status) === -1) {\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n } else resolve(true);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n } else {\n (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)(\"user\");\n redirectUser(urlRedirection, message, urlWanted);\n resolve(false);\n }\n };\n\n xhr.onerror = () => reject(xhr.statusText);\n\n xhr.send();\n }\n }\n });\n}; // Cette fonction sert à la précédente en cas de connexion non valide\n\nconst redirectUser = (urlRedirection, message, urlWanted) => {\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"message\", message);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)(\"url\", urlWanted);\n if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/users.js?");
-
-/***/ }),
-
-/***/ "./src/tools/webportage.js":
-/*!*********************************!*\
- !*** ./src/tools/webportage.js ***!
- \*********************************/
-/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"unCheckAllOthers\": function() { return /* binding */ unCheckAllOthers; },\n/* harmony export */ \"showBtnPayment\": function() { return /* binding */ showBtnPayment; }\n/* harmony export */ });\nconst checkBoxes = {\n \"CGV\": document.getElementById(\"CGVOk\"),\n \"abo1\": document.getElementById(\"abo1\"),\n \"abo2\": document.getElementById(\"abo2\"),\n \"abo3\": document.getElementById(\"abo3\"),\n \"abo4\": document.getElementById(\"abo4\")\n};\nconst divWPBtns = document.getElementById(\"WPBtns\"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés\n\nconst unCheckAllOthers = choice => {\n for (let id in checkBoxes) {\n if (id !== choice) checkBoxes[id].checked = false;\n divWPBtns.style.display = \"none\";\n }\n};\nconst btns = {\n \"btn1\": document.getElementById(\"WPBtn1\"),\n \"btn2\": document.getElementById(\"WPBtn2\"),\n \"btn3\": document.getElementById(\"WPBtn3\"),\n \"btn4\": document.getElementById(\"WPBtn4\")\n}; // Affiche le bon bouton de paiement et cache les autres\n\nconst showBtnPayment = choice => {\n for (let id in btns) {\n if (id !== choice) btns[id].style.display = \"none\";else btns[id].style.display = \"block\";\n }\n};\n\n//# sourceURL=webpack://wikilerni/./src/tools/webportage.js?");
-
-/***/ }),
-
-/***/ "../tools/main.js":
-/*!************************!*\
- !*** ../tools/main.js ***!
- \************************/
-/***/ (function(module) {
-
-eval("// Quelques fonctions utiles pour les chaînes\nclass Tool {\n static isEmpty(myVar) {\n if (myVar === undefined || myVar === null) return true;else {\n myVar += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myVar = myVar.trim();\n if (myVar === \"\") return true;else return false;\n }\n }\n\n static trimIfNotNull(myString) {\n if (Tool.isEmpty(myString)) myString = null;else {\n myString += \"\"; // si autre chose qu'une chaîne envoyé...\n\n myString = myString.trim();\n }\n return myString;\n }\n\n static shortenIfLongerThan(myString, max) {\n myString += \"\"; // au cas où cela ne serait pas une chaîne...\n\n if (myString.length > max) myString = myString.substring(0, max - 3) + \"…\";\n return myString;\n } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings\n\n\n static replaceAll(myString, mapObj) {\n const replaceElts = new RegExp(Object.keys(mapObj).join(\"|\"), \"gi\");\n return myString.replace(replaceElts, matched => {\n return mapObj[matched];\n });\n } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random\n\n\n static getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country\n\n\n static dateFormat(dateString) {\n let lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"fr\";\n if (Tool.isEmpty(dateString)) return \"\";\n let myDate = new Date(dateString);\n let myDay = myDate.getDate() + \"\";\n if (myDay.length === 1) myDay = \"0\" + myDay;\n let myMounth = myDate.getMonth() + 1 + \"\";\n if (myMounth.length === 1) myMounth = \"0\" + myMounth;\n let myYear = myDate.getFullYear();\n if (lang === \"fr\") return myDay + \"/\" + myMounth + \"/\" + myYear;else if (lang === \"form\") // 2014-02-09\n return myYear + \"-\" + myMounth + \"-\" + myDay;else return myMounth + \"/\" + myDay + \"/\" + myYear;\n } // On enlève volontairement les 0/O pour éviter les confusions !\n // Et mieux vaut aussi débuter et finir par une lettre simple.\n\n\n static getPassword(nbCarMin, nbCarMax) {\n const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));\n const letters = \"ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz\";\n const others = \"123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ\";\n let password = letters[Math.floor(Math.random() * letters.length)];\n\n for (let i = 1; i < nbCar - 1; i++) {\n if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];\n }\n\n password += letters[Math.floor(Math.random() * letters.length)];\n return password;\n }\n\n}\n\nmodule.exports = Tool;\n\n//# sourceURL=webpack://wikilerni/../tools/main.js?");
-
-/***/ }),
-
-/***/ "../views/default/config/fr.js":
-/*!*************************************!*\
- !*** ../views/default/config/fr.js ***!
- \*************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n headLinks: [{\n anchor: \"Accueil\",\n attributes: {\n href: \"/\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\"\n }\n }, {\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\"\n }\n }],\n footLinks: [{\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\"\n }\n }, {\n anchor: \"C.G.U.\",\n attributes: {\n href: \"/cgu.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"C.G.V.\",\n attributes: {\n href: \"/cgv.html\",\n rel: \"nofollow\"\n }\n }],\n maxQuestionnairesByPage: 10,\n userHomePage: \"accueil.html\",\n adminHomePage: \"admin.html\",\n managerHomePage: \"gestion.html\",\n subscribePage: \"inscription.html\",\n connectionPage: \"connexion.html\",\n accountPage: \"compte.html\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n nbQuestionnairesUserHomePage: 10,\n illustrationDir: \"/img/quizs/\",\n siteSlogan: \"Cultivons notre jardin !\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \\\"jardin\\\".\",\n homeTitle2: \"La culture en liberté\",\n homeP2: \"Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \\\"cultiver votre jardin\\\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.\",\n newQuestionnairesTitle: \"Les derniers quizs publiés sur WikiLerni\",\n newQuestionnairesIntro: \"Liste des derniers quizs publiés sur WikiLerni.\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n tagsListTxt: \"Parcourir les rubriques :\"\n};\n\n//# sourceURL=webpack://wikilerni/../views/default/config/fr.js?");
-
-/***/ }),
-
-/***/ "../views/wikilerni/config/fr.js":
-/*!***************************************!*\
- !*** ../views/wikilerni/config/fr.js ***!
- \***************************************/
-/***/ (function(module) {
-
-eval("module.exports = {\n // liens de l'interface\n headLinks: [{\n anchor: \"Contact\",\n attributes: {\n href: \"/contact.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Parcourir\",\n attributes: {\n href: \"/quizs/\",\n id: \"indexHeadLink\",\n title: \"Les dernières publications\"\n }\n }, {\n anchor: \"Mon compte\",\n attributes: {\n href: \"/connexion.html\",\n id: \"accountHeadLink\",\n title: \"Accéder ou créez votre compte WikiLerni\"\n }\n }, {\n anchor: \"À propos\",\n attributes: {\n href: \"/a-propos.html\",\n title: \"En savoir + sur WikiLerni\"\n }\n }, {\n anchor: \"Accueil\",\n attributes: {\n href: \"/\",\n title: \"Page d'accueil\"\n }\n }],\n footLinks: [{\n anchor: \"Blog\",\n attributes: {\n href: \"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2\",\n title: \"Le blog WikiLerni sur diaspora*\"\n }\n }, {\n anchor: \"Crédits\",\n attributes: {\n href: \"/credits.html\",\n title: \"Qui a créé WikiLerni ? Quels sont vos droits ?\"\n }\n }, {\n anchor: \"Mentions légales\",\n attributes: {\n href: \"/mentions-legales.html\",\n rel: \"nofollow\"\n }\n }, {\n anchor: \"Données personnelles\",\n attributes: {\n href: \"/donnees.html\",\n title: \"Vos données personnelles sur WikiLerni\"\n }\n }, {\n anchor: \"CGV & CGU\",\n attributes: {\n href: \"/CGV-CGU.html\",\n rel: \"nofollow\"\n }\n }],\n accountPage: \"compte.html\",\n aboutPage: \"a-propos.html\",\n adminHomePage: \"admin.html\",\n cguPage: \"CGV-CGU.html\",\n connectionPage: \"connexion.html\",\n deleteLinkPage: \"aurevoir.html?t=\",\n loginLinkPage: \"login.html?t=\",\n managerHomePage: \"gestion.html\",\n newLoginLinkPage: \"newlogin.html?t=\",\n questionnairesManagementPage: \"gestion-quizs.html\",\n stopMailPage: \"stop-mail.html?t=\",\n subscribePage: \"inscription.html\",\n updateAccountPage: \"compte.html\",\n userHomePage: \"accueil.html\",\n userHomePageTxt: \"Ma page d'accueil.\",\n usersManagementPage: \"gestion-utilisateurs.html\",\n validationLinkPage: \"validation.html?t=\",\n\n /* Textes (général) */\n siteSlogan: \"Cultivons notre jardin !\",\n noJSNotification: \"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.\",\n mailRecipientTxt: \"Message envoyé à :\",\n licenceTxt: \"@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.\",\n\n /* Page d'accueil */\n homePageTxt: \"Page d'accueil\",\n homeTitle1: \"De nature curieuse ?\",\n homeP1: \"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.\",\n homeTitle2: \"La culture générale en liberté\",\n homeP2: \"Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.\",\n homeBtnAboutTxt: \"En savoir plus sur WikiLerni ?\",\n homeBtnSubscribeTxt: \"Testez WikiLerni\",\n homeSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n\n /* Page dernières publications... */\n newQuestionnairesTitle: \"Culture générale - apprenez de nouvelles choses avec WikiLerni\",\n newQuestionnairesIntro: \"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.\",\n newsListTitle: \"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
\",\n\n /* Page quizs */\n answersExplanationsLinkText: \"Relire\",\n quizElementLinksIntro: \"En savoir plus\",\n quizElementSubcriptionFormTitle: \"Recevez les prochains articles WikiLerni\",\n explanationTitle: \"Vous découvrez WikiLerni ?\",\n explanationTxt: \"
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"